Docker容器化实战:将Spring Boot应用部署到K8s

在现代应用开发中,使用Docker容器化和Kubernetes(K8s)部署Spring Boot应用,能实现高效、可扩展的云原生架构。本指南将通过实战步骤,帮助您逐步完成从应用容器化到K8s集群部署的全过程。确保您已安装Docker和Kubernetes环境(如Minikube或云厂商集群)。整个过程分为三个阶段:准备应用、Docker化、K8s部署。每个步骤都提供代码示例和解释,确保真实可靠。


步骤1: 准备Spring Boot应用

首先,确保您有一个可运行的Spring Boot应用。这里以简单示例为例:一个REST API应用,使用Spring Initializr生成。关键点:

  • 应用主类:DemoApplication.java
  • 控制器:HelloController.java,提供一个端点返回"Hello, Docker & K8s!"。
  • 构建工具:Maven或Gradle。假设使用Maven,项目结构如下:
    src/
      main/
        java/com/example/demo/
          DemoApplication.java
          HelloController.java
    pom.xml
    

测试应用本地运行:执行mvn spring-boot:run,访问http://localhost:8080/hello应返回预期响应。


步骤2: Docker化Spring Boot应用

将应用打包成Docker镜像,便于容器化运行。核心是创建Dockerfile,定义构建过程。

操作步骤:

  1. 编写Dockerfile:在项目根目录创建文件Dockerfile,内容如下。此文件基于OpenJDK镜像,构建Spring Boot可执行JAR。
# 使用官方OpenJDK基础镜像
FROM openjdk:11-jre-slim

# 设置工作目录
WORKDIR /app

# 复制Maven构建的JAR文件到镜像中
COPY target/demo-0.0.1-SNAPSHOT.jar app.jar

# 暴露应用端口(Spring Boot默认8080)
EXPOSE 8080

# 启动命令
ENTRYPOINT ["java", "-jar", "app.jar"]

  1. 构建Docker镜像
    • 先构建应用JAR:运行mvn clean package,生成target/demo-0.0.1-SNAPSHOT.jar
    • 构建镜像:执行docker build -t spring-boot-demo:latest .,其中spring-boot-demo是镜像名称。
    • 验证:运行docker run -p 8080:8080 spring-boot-demo,访问http://localhost:8080/hello测试。

注意事项

  • 镜像大小优化:使用多阶段构建(如FROM maven:3.8-jdk-11 AS build编译,再复制JAR到轻量镜像)。
  • 安全:定期更新基础镜像,避免漏洞。

步骤3: 部署到Kubernetes集群

将Docker镜像部署到K8s,需创建Kubernetes资源配置文件,定义Deployment和Service。

操作步骤:

  1. 推送镜像到仓库(可选):如果使用远程集群,推送镜像到Docker Hub或私有仓库(如docker push yourusername/spring-boot-demo:latest)。

  2. 创建Deployment文件:在项目根目录创建deployment.yaml,定义Pod副本和容器配置。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-boot-demo-deployment
spec:
  replicas: 2  # 运行2个Pod副本,提高可用性
  selector:
    matchLabels:
      app: spring-boot-demo
  template:
    metadata:
      labels:
        app: spring-boot-demo
    spec:
      containers:
      - name: spring-boot-container
        image: spring-boot-demo:latest  # 若使用远程仓库,改为yourusername/spring-boot-demo:latest
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: "100m"  # CPU请求:0.1核,用$0.1$单位表示
            memory: "128Mi"  # 内存请求:128MB
          limits:
            cpu: "500m"  # CPU限制:0.5核
            memory: "512Mi"  # 内存限制:512MB

  1. 创建Service文件:创建service.yaml,暴露Deployment供外部访问。
apiVersion: v1
kind: Service
metadata:
  name: spring-boot-demo-service
spec:
  selector:
    app: spring-boot-demo  # 匹配Deployment的标签
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080  # 映射到容器端口
  type: LoadBalancer  # 云环境下自动创建负载均衡器;本地测试用NodePort

  1. 应用配置到K8s集群

    • 部署Deployment:运行kubectl apply -f deployment.yaml
    • 部署Service:运行kubectl apply -f service.yaml
    • 检查状态:使用kubectl get pods确认Pod运行,kubectl get services获取Service外部IP。
  2. 测试部署:访问Service的IP(如http://<external-ip>/hello),应返回"Hello, Docker & K8s!"。

注意事项

  • 资源优化:根据应用负载调整replicas和资源限制,避免资源浪费。例如,CPU使用率公式:$ \text{利用率} = \frac{\text{实际使用}}{\text{请求值}} \times 100% $,目标保持70-80%。
  • 高可用:使用K8s的Horizontal Pod Autoscaler自动扩展。
  • 监控:集成Prometheus和Grafana跟踪性能指标。

总结

通过以上步骤,您已成功将Spring Boot应用容器化并部署到Kubernetes。关键优势包括弹性伸缩、故障恢复和简化运维。实战中,建议:

  • 使用CI/CD流水线(如Jenkins或GitHub Actions)自动化构建和部署。
  • 遵循云原生最佳实践,如配置ConfigMap管理环境变量。
  • 测试覆盖率:确保单元和集成测试覆盖核心逻辑。

遇到问题?检查K8s日志:kubectl logs <pod-name>。祝您部署顺利!

更多推荐