spring+k8s 功能说明

以下是一个结合 Kubernetes(k8s) 和 Spring Boot 的完整实例,涵盖应用开发、容器化、部署到 Kubernetes 集群的全流程。


1. 创建 Spring Boot 应用

1.1 项目初始化

使用 Spring Initializr 生成一个简单的 REST API 项目:

• 依赖项 :Spring Web、Actuator(用于健康检查)

• 示例代码:

java 复制代码
@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello from Spring Boot on Kubernetes!";
    }
}
1.2 添加健康检查(Actuator)

确保 application.properties 启用 Actuator 端点:

properties 复制代码
management.endpoints.web.exposure.include=health,info
management.endpoint.health.probes.enabled=true

2. 容器化应用(Docker)

2.1 编写 Dockerfile

在项目根目录创建 Dockerfile:

dockerfile 复制代码
# 使用多阶段构建减小镜像体积
FROM maven:3.8.6-jdk-11 AS build
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src/ ./src/
RUN mvn package -DskipTests

# 运行时镜像
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=build /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
2.2 构建镜像
bash 复制代码
docker build -t spring-boot-k8s-demo:1.0.0 .

3. 编写 Kubernetes 配置文件

3.1 Deployment

创建 deployment.yaml,定义如何运行 Spring Boot 应用:

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-boot-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: spring-boot-demo
  template:
    metadata:
      labels:
        app: spring-boot-demo
    spec:
      containers:
      - name: app
        image: spring-boot-k8s-demo:1.0.0
        ports:
        - containerPort: 8080
        livenessProbe:          # 存活探针
          httpGet:
            path: /actuator/health/liveness
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:         # 就绪探针
          httpGet:
            path: /actuator/health/readiness
            port: 8080
          initialDelaySeconds: 20
          periodSeconds: 5
3.2 Service

创建 service.yaml,暴露应用服务(ClusterIP 类型):

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: spring-boot-demo-service
spec:
  selector:
    app: spring-boot-demo
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
3.3 Ingress(可选)

创建 ingress.yaml,配置外部访问(需安装 Ingress 控制器):

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: spring-boot-ingress
spec:
  rules:
  - host: spring-boot.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: spring-boot-demo-service
            port:
              number: 80

4. 部署到 Kubernetes 集群

4.1 推送镜像到仓库(可选)

若使用私有仓库(如 Docker Hub、Harbor):

bash 复制代码
docker tag spring-boot-k8s-demo:1.0.0 <your-registry>/spring-boot-k8s-demo:1.0.0
docker push <your-registry>/spring-boot-k8s-demo:1.0.0

修改 deployment.yaml 中的镜像地址。

4.2 部署应用
bash 复制代码
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f ingress.yaml  # 如果需要外部访问
4.3 验证部署
bash 复制代码
# 查看 Pod 状态
kubectl get pods -l app=spring-boot-demo

# 查看 Service
kubectl get svc spring-boot-demo-service

# 访问应用(通过 Ingress 或 Port-Forward)
kubectl port-forward svc/spring-boot-demo-service 8080:80
curl http://localhost:8080/hello

5. 高级配置

5.1 使用 ConfigMap 管理配置

创建 configmap.yaml:

yaml 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  application.properties: |
    server.port=8080
    greeting.message=Hello from ConfigMap!

修改 Deployment,挂载 ConfigMap:

yaml 复制代码
spec:
  containers:
  - name: app
    # ...
    volumeMounts:
    - name: config-volume
      mountPath: /app/config
  volumes:
  - name: config-volume
    configMap:
      name: app-config
5.2 自动扩缩容(HPA)

创建 hpa.yaml:

yaml 复制代码
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: spring-boot-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: spring-boot-demo
  minReplicas: 2
  maxReplicas: 5
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

6. 监控与日志

6.1 集成 Prometheus

在 pom.xml 添加 Micrometer 依赖:

xml 复制代码
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

修改 application.properties 暴露 Prometheus 端点:

properties 复制代码
management.endpoints.web.exposure.include=health,info,prometheus
6.2 配置 ServiceMonitor(需 Prometheus Operator)

创建 service-monitor.yaml:

yaml 复制代码
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: spring-boot-monitor
spec:
  selector:
    matchLabels:
      app: spring-boot-demo
  endpoints:
  - port: http
    path: /actuator/prometheus

总结

通过以上步骤,你可以将 Spring Boot 应用部署到 Kubernetes 集群,并实现以下功能:

• 容器化 :通过 Docker 打包应用。

• 健康检查 :利用 Actuator 端点实现存活和就绪探针。

• 服务发现 :通过 Service 和 Ingress 暴露应用。

• 配置管理 :使用 ConfigMap 分离环境配置。

• 自动扩缩容 :通过 HPA 动态调整副本数。

• 监控:集成 Prometheus 监控应用指标。

相关推荐
sbjdhjd2 分钟前
云安全 | 从特权容器到旧版 runC:Docker 宿主机访问与运行时缺陷复盘
运维·网络安全·docker·云原生·kubernetes·云计算·云安全
郑州光合科技余经理14 分钟前
本地生活平台搭建:跨业态用户标识怎么贯通
java·开发语言·前端·后端·uni-app·php·ai编程
木头科技21 分钟前
【AI 工程化第八篇】Spring AI 多模型路由实战:DeepSeek、通义、Kimi、OpenAI 如何统一接入和自动切换
java·人工智能·spring
深盾科技_Virbox23 分钟前
云端与本地并行交付,软件许可管理如何实现统一运营?
java·大数据·开发语言·安全
thefool11226624 分钟前
多线程 3
java
CoderYanger30 分钟前
A.每日一题:856. 括号的分数
java·程序人生·算法·leetcode·面试·职场和发展·学习方法
liangbo71 小时前
01-Java 集合框架全景:从 Collection 到 Map 一张关系网理清
java
xuxigifxfh1 小时前
HJ15 求int型正整数在内存中存储时1的个数
java·开发语言·华为机考
Wokoo71 小时前
自动化测试入门:核心场景、回归测试与 Web 自动化环境搭建
java·开发语言·测试工具
我是人✓1 小时前
Spring IOC注解全解析和Spring整合测试单元
java·后端·spring