引言:为什么 Java 开发者需要 Kubernetes?
现代 Java 开发已不再局限于在服务器上简单运行 JAR 文件。微服务架构、水平扩展和容错的需求促使我们使用容器和编排工具。Kubernetes (K8s) 已成为管理容器化应用的事实标准。在本指南中,我们将探讨如何将一个典型的 Java 应用(例如基于 Spring Boot)部署到 Kubernetes 集群。您将学习如何将应用打包成 Docker 镜像、创建必要的清单文件并运行它。
1. 准备 Java 应用并构建 Docker 镜像
在进入 Kubernetes 之前,Java 应用必须先打包到容器中。我们来看一个基于 Spring Boot 的简单示例。
1.1. Java 应用示例
创建一个最小的 REST 控制器,用于返回应用版本:
import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication@RestControllerpublic class App { public static void main(String[] args) { SpringApplication.run(App.class, args); }
@GetMapping("/") public String home() { return "Java App running on Kubernetes v1.0"; }}1.2. 创建 Dockerfile
对于 Java 应用,最好使用多阶段构建来减小最终镜像的大小:
FROM maven:3.8.6-eclipse-temurin-17 AS builderWORKDIR /appCOPY pom.xml .RUN mvn dependency:go-offline -BCOPY src ./srcRUN mvn package -DskipTests
FROM eclipse-temurin:17-jre-alpineWORKDIR /appCOPY --from=builder /app/target/*.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"]1.3. 构建并推送镜像
构建镜像并将其推送到镜像仓库(例如 Docker Hub):
docker build -t yourusername/java-k8s-demo:1.0 .docker push yourusername/java-k8s-demo:1.02. 用于部署 Java 的核心 Kubernetes 对象
部署 Java 应用至少需要两个资源:Deployment(管理副本和更新)和 Service(提供网络访问)。
2.1. Deployment 清单
创建文件 deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: java-app labels: app: java-appspec: replicas: 2 selector: matchLabels: app: java-app template: metadata: labels: app: java-app spec: containers: - name: java-app image: yourusername/java-k8s-demo:1.0 ports: - containerPort: 8080 resources: requests: memory: "256Mi" cpu: "250m" limits: memory: "512Mi" cpu: "500m" livenessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 20 periodSeconds: 5重要提示: 对于 Spring Boot,请使用 Actuator 进行健康检查。指定 requests 和 limits,以便 Kubernetes 正确分配资源。
2.2. Service 清单
创建 service.yaml 以实现对 Pod 的内部访问:
apiVersion: v1kind: Servicemetadata: name: java-app-servicespec: selector: app: java-app ports: - protocol: TCP port