将 Java 部署到 Kubernetes:基础实战指南

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

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

开始课程

引言:为什么 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.0


2. 用于部署 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                

博客

书籍推荐