本文目录导读:

我将为您提供一个完整的Kubernetes Java应用案例,包括一个简单的Spring Boot应用、Docker镜像构建和Kubernetes部署配置。
Spring Boot应用示例
项目结构
k8s-java-demo/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/example/demo/
│ │ │ ├── DemoApplication.java
│ │ │ ├── controller/
│ │ │ │ └── HelloController.java
│ │ │ └── service/
│ │ │ └── MessageService.java
│ │ └── resources/
│ │ └── application.yml
│ └── test/
│ └── java/
├── Dockerfile
├── k8s/
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── configmap.yaml
│ └── hpa.yaml
├── pom.xml
└── .dockerignore
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.14</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>k8s-demo</artifactId>
<version>1.0.0</version>
<name>k8s-demo</name>
<description>Kubernetes Java Application Demo</description>
<properties>
<java.version>11</java.version>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
主应用类 DemoApplication.java
package com.example.demo;
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;
import org.springframework.beans.factory.annotation.Value;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@RestController
class HelloController {
@Value("${app.message:Hello from Kubernetes!}")
private String message;
@Value("${app.version:1.0.0}")
private String version;
@GetMapping("/")
public String home() {
return "<h1>Kubernetes Java Demo</h1>" +
"<p>Message: " + message + "</p>" +
"<p>Version: " + version + "</p>" +
"<p>Pod: " + System.getenv("POD_NAME") + "</p>";
}
@GetMapping("/health")
public String health() {
return "OK";
}
@GetMapping("/info")
public String info() {
return "Version: " + version +
"<br>Java Version: " + System.getProperty("java.version");
}
}
}
application.yml
server:
port: 8080
spring:
application:
name: k8s-demo
lifecycle:
timeout-per-shutdown-phase: 20s
management:
endpoints:
web:
exposure:
include: health,info,metrics
endpoint:
health:
show-details: always
app:
message: ${APP_MESSAGE:Hello from Kubernetes!}
version: ${APP_VERSION:1.0.0}
logging:
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n"
level:
com.example.demo: INFO
Dockerfile
# 多阶段构建 FROM maven:3.8.4-openjdk-11 AS build WORKDIR /app COPY pom.xml . RUN mvn dependency:go-offline COPY src ./src RUN mvn clean package -DskipTests # 运行阶段 FROM openjdk:11-jre-slim WORKDIR /app RUN useradd -m -u 1000 spring COPY --from=build /app/target/k8s-demo-1.0.0.jar app.jar COPY --from=build /app/src/main/resources/application.yml application.yml USER spring EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar", "--spring.config.location=classpath:/application.yml"]
Kubernetes 配置
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: k8s-demo
labels:
app: k8s-demo
spec:
replicas: 3
selector:
matchLabels:
app: k8s-demo
template:
metadata:
labels:
app: k8s-demo
spec:
containers:
- name: k8s-demo
image: k8s-demo:1.0.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
env:
- name: APP_MESSAGE
valueFrom:
configMapKeyRef:
name: k8s-demo-config
key: app.message
- name: APP_VERSION
valueFrom:
configMapKeyRef:
name: k8s-demo-config
key: app.version
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "500m"
livenessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 3
failureThreshold: 3
readinessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
timeoutSeconds: 3
successThreshold: 1
service.yaml
apiVersion: v1
kind: Service
metadata:
name: k8s-demo
labels:
app: k8s-demo
spec:
type: LoadBalancer
selector:
app: k8s-demo
ports:
- port: 80
targetPort: 8080
protocol: TCP
name: http
configmap.yaml
apiVersion: v1 kind: ConfigMap metadata: name: k8s-demo-config data: app.message: "Hello from Kubernetes ConfigMap!" app.version: "1.0.0"
hpa.yaml (自动伸缩)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: k8s-demo-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: k8s-demo
minReplicas: 3
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
部署命令
构建和部署过程
# 1. 构建Java应用 mvn clean package # 2. 构建Docker镜像 docker build -t k8s-demo:1.0.0 . # 3. 可选:推送到Docker Hub或其他镜像仓库 # docker tag k8s-demo:1.0.0 yourusername/k8s-demo:1.0.0 # docker push yourusername/k8s-demo:1.0.0 # 4. 部署到Kubernetes kubectl apply -f k8s/configmap.yaml kubectl apply -f k8s/deployment.yaml kubectl apply -f k8s/service.yaml kubectl apply -f k8s/hpa.yaml # 5. 查看部署状态 kubectl get pods kubectl get services kubectl get deployments # 6. 查看日志 kubectl logs -f deployment/k8s-demo # 7. 端口转发(本地调试) kubectl port-forward svc/k8s-demo 8080:80 # 8. 访问应用 curl http://localhost:8080/ # 9. 扩展和更新 kubectl scale deployment k8s-demo --replicas=5 kubectl set image deployment/k8s-demo k8s-demo=k8s-demo:1.0.1
监控和排障
# 监控资源使用 kubectl top pods kubectl top nodes # 查看事件 kubectl get events --sort-by=.metadata.creationTimestamp # 进入容器调试 kubectl exec -it <pod-name> -- /bin/sh # 查看HPA状态 kubectl get hpa kubectl describe hpa k8s-demo-hpa
这个案例演示了一个完整的Java应用在Kubernetes上部署的流程,包括:
- Spring Boot应用开发
- Docker镜像构建
- Kubernetes部署配置
- 健康检查和探活机制
- 自动伸缩
- 配置管理
- 监控和排障
您可以根据实际需求进行修改和扩展。