将Java应用部署到Kubernetes:分步指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

将Java应用部署到Kubernetes:从Dockerfile到运行中的服务

\n\n

现代Java开发离不开容器化和编排。Kubernetes (K8s) 已成为管理微服务的标准,而能够在集群中部署Java应用是后端开发人员的必备技能。在本文中,我们将通过实践解析完整的部署流程:从构建包含Java应用的Docker镜像,到通过Ingress配置负载均衡。

\n\n

1. 准备Java应用和Dockerfile

\n\n

在进入Kubernetes之前,您的Java应用必须先打包成Docker镜像。我们来看一个经典案例——一个基于Spring Boot的应用,已编译为JAR文件。

\n\n

项目构建

\n

假设我们有一个通过Maven构建的项目。在项目根目录下执行命令:

\n
mvn clean package -DskipTests
\n

执行后,在target/文件夹中会生成my-app-1.0.0.jar文件。

\n\n

创建Dockerfile

\n

为了最小化镜像大小并提高安全性,我们使用多阶段构建(multi-stage build)。

\n
# 阶段1:构建\nFROM maven:3.8.6-openjdk-17 AS builder\nWORKDIR /app\nCOPY pom.xml .\nRUN mvn dependency:go-offline -B\nCOPY src ./src\nRUN mvn package -DskipTests\n\n# 阶段2:最终镜像\nFROM openjdk:17-jdk-slim\nWORKDIR /app\nCOPY --from=builder /app/target/my-app-1.0.0.jar app.jar\nEXPOSE 8080\nENTRYPOINT ["java", "-jar", "app.jar"]
\n\n

构建并推送镜像

\n
docker build -t my-java-app:1.0.0 .\ndocker tag my-java-app:1.0.0 your-dockerhub/my-java-app:1.0.0\ndocker push your-dockerhub/my-java-app:1.0.0
\n\n

2. 创建Kubernetes清单文件

\n\n

Kubernetes采用声明式方法。我们将在YAML文件中描述系统的期望状态。

\n\n

Deployment——管理Pod

\n

创建deployment.yaml文件:

\n
apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: java-app-deployment\n  labels:\n    app: java-app\nspec:\n  replicas: 3\n  selector:\n    matchLabels:\n      app: java-app\n  template:\n    metadata:\n      labels:\n        app: java-app\n    spec:\n      containers:\n      - name: java-app\n        image: your-dockerhub/my-java-app:1.0.0\n        ports:\n        - containerPort: 8080\n        resources:\n          requests:\n            memory: "256Mi"\n            cpu: "250m"\n          limits:\n            memory: "512Mi"\n            cpu: "500m"\n        livenessProbe:\n          httpGet:\n            path: /actuator/health\n            port: 8080\n          initialDelaySeconds: 30\n          periodSeconds: 10\n        readinessProbe:\n          httpGet:\n            path: /actuator/health\n            port: 8080\n          initialDelaySeconds: 20\n          periodSeconds: 5
\n\n

Service——确保访问

\n

创建service.yaml文件:

\n
apiVersion: v1\nkind: Service\nmetadata:\n  name: java-app-service\nspec:\n  selector:\n    app: java-app\n  ports:\n  - protocol: TCP\n    port: 80\n    targetPort: 8080\n  type: ClusterIP
\n\n

ConfigMap——提取配置

\n

为了存储环境变量,创建configmap.yaml:

\n
apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: app-config\ndata:\n  SPRING_PROFILES_ACTIVE: "prod"\n  DB_URL: "jdbc:postgresql://postgres-service:5432/mydb"
\n\n

3. 部署到集群并验证

\n\n

现在,我们将所有清单文件应用到集群。请确保您已配置好kubectl并连接到正确的上下文。

\n\n

应用清单文件

\n
kubectl apply -f configmap.yaml\nkubectl apply -f deployment.yaml\nkubectl apply -f service.yaml
\n\n

检查状态

\n
kubectl get pods\nkubectl get deployments\nkubectl get services
\n

您应该会

博客

书籍推荐