将Java应用部署到Kubernetes:从Dockerfile到运行中的服务
\n\n现代Java开发离不开容器化和编排。Kubernetes (K8s) 已成为管理微服务的标准,而能够在集群中部署Java应用是后端开发人员的必备技能。在本文中,我们将通过实践解析完整的部署流程:从构建包含Java应用的Docker镜像,到通过Ingress配置负载均衡。
\n\n1. 准备Java应用和Dockerfile
\n\n在进入Kubernetes之前,您的Java应用必须先打包成Docker镜像。我们来看一个经典案例——一个基于Spring Boot的应用,已编译为JAR文件。
\n\n项目构建
\n假设我们有一个通过Maven构建的项目。在项目根目录下执行命令:
\nmvn clean package -DskipTests\n执行后,在target/文件夹中会生成my-app-1.0.0.jar文件。
创建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构建并推送镜像
\ndocker 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\n2. 创建Kubernetes清单文件
\n\nKubernetes采用声明式方法。我们将在YAML文件中描述系统的期望状态。
\n\nDeployment——管理Pod
\n创建deployment.yaml文件:
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\nService——确保访问
\n创建service.yaml文件:
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\nConfigMap——提取配置
\n为了存储环境变量,创建configmap.yaml:
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\n3. 部署到集群并验证
\n\n现在,我们将所有清单文件应用到集群。请确保您已配置好kubectl并连接到正确的上下文。
应用清单文件
\nkubectl apply -f configmap.yaml\nkubectl apply -f deployment.yaml\nkubectl apply -f service.yaml\n\n检查状态
\nkubectl get pods\nkubectl get deployments\nkubectl get services\n您应该会