将 Spring Boot 应用通过 Docker 容器化并部署到 Kubernetes (K8s) 集群,可实现应用的高效管理、弹性伸缩和故障自愈。以下是完整流程:

一、准备工作
  1. 环境要求
    • 安装 Docker(用于构建镜像)
    • 准备 K8s 集群(单节点 minikube 或多节点集群)
    • 安装 kubectl(K8s 命令行工具)
    • 一个可运行的 Spring Boot 项目(示例使用demo-app
二、Spring Boot 应用容器化(Docker)
1. 编写 Dockerfile

在 Spring Boot 项目根目录创建Dockerfile

dockerfile

# 基础镜像(Java 17)
FROM openjdk:17-jdk-slim

# 工作目录
WORKDIR /app

# 复制打包好的Jar文件到容器
COPY target/demo-app-0.0.1-SNAPSHOT.jar app.jar

# 暴露端口(与Spring Boot应用端口一致)
EXPOSE 8080

# 启动命令
ENTRYPOINT ["java", "-jar", "app.jar"]
2. 打包 Spring Boot 应用

使用 Maven/Gradle 打包生成 Jar 文件:

bash

# Maven
mvn clean package -DskipTests

# Gradle
gradle clean bootJar
3. 构建 Docker 镜像

bash

# 构建镜像(标签格式:仓库地址/镜像名:版本)
docker build -t demo-app:v1 .

# 可选:推送到镜像仓库(如Docker Hub、Harbor)
docker tag demo-app:v1 your-registry/demo-app:v1
docker push your-registry/demo-app:v1
三、K8s 部署配置
1. 创建 Deployment 配置(deployment.yaml

定义应用的部署规则(副本数、镜像、端口等):

yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-app-deployment  # Deployment名称
spec:
  replicas: 2  # 副本数
  selector:
    matchLabels:
      app: demo-app
  template:
    metadata:
      labels:
        app: demo-app
    spec:
      containers:
      - name: demo-app
        image: demo-app:v1  # 镜像地址(若使用远程仓库需填完整路径)
        ports:
        - containerPort: 8080  # 容器内端口
        resources:
          requests:
            memory: "256Mi"
            cpu: "200m"
          limits:
            memory: "512Mi"
            cpu: "500m"
        livenessProbe:  # 存活探针(检测应用是否运行)
          httpGet:
            path: /actuator/health
            port: 8080
          initialDelaySeconds: 60
          periodSeconds: 10
2. 创建 Service 配置(service.yaml

暴露应用访问入口(ClusterIP/NodePort/LoadBalancer):

yaml

apiVersion: v1
kind: Service
metadata:
  name: demo-app-service
spec:
  selector:
    app: demo-app  # 关联Deployment的标签
  ports:
  - port: 80       # Service端口
    targetPort: 8080  # 容器端口
  type: NodePort  # 暴露到集群节点(测试用),生产可用LoadBalancer
3. 可选:Ingress 配置(ingress.yaml

通过域名访问应用(需集群安装 Ingress Controller):

yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo-app-ingress
spec:
  rules:
  - host: demo-app.example.com  # 访问域名
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: demo-app-service
            port:
              number: 80
四、部署到 K8s 集群
1. 应用配置文件

bash

# 创建Deployment
kubectl apply -f deployment.yaml

# 创建Service
kubectl apply -f service.yaml

# 可选:创建Ingress
kubectl apply -f ingress.yaml
2. 验证部署状态

bash

# 查看Pod状态
kubectl get pods -l app=demo-app

# 查看Deployment
kubectl get deployment demo-app-deployment

# 查看Service(获取NodePort端口)
kubectl get service demo-app-service

# 查看日志
kubectl logs -f <pod-name>
3. 访问应用
  • NodePort 方式http://<节点IP>:<NodePort>
  • Ingress 方式:配置本地 hosts 后访问http://demo-app.example.com
五、更新与运维
  1. 更新应用

    bash

    # 构建新镜像
    docker build -t demo-app:v2 .
    
    # 滚动更新Deployment
    kubectl set image deployment/demo-app-deployment demo-app=demo-app:v2
    
    # 查看更新状态
    kubectl rollout status deployment/demo-app-deployment
    
  2. 伸缩副本数

    bash

    kubectl scale deployment demo-app-deployment --replicas=5
    
  3. 回滚版本

    bash

    # 查看历史版本
    kubectl rollout history deployment/demo-app-deployment
    
    # 回滚到上一版本
    kubectl rollout undo deployment/demo-app-deployment
    
总结
  1. 容器化:通过 Docker 将 Spring Boot 应用打包为镜像,保证环境一致性。
  2. K8s 部署:用 Deployment 管理副本,Service 暴露服务,Ingress 配置域名。
  3. 优势:自动扩缩容、故障自愈、滚动更新,适合生产环境大规模部署。

如需更复杂的配置(如配置中心、持久化存储),可进一步添加 ConfigMap、Secret、Volume 等 K8s 资源。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐