Kubernetes Java案例

wen java案例 2

本文目录导读:

Kubernetes Java案例

  1. Spring Boot应用示例
  2. Dockerfile
  3. Kubernetes 配置
  4. 部署命令
  5. 监控和排障

我将为您提供一个完整的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部署配置
  • 健康检查和探活机制
  • 自动伸缩
  • 配置管理
  • 监控和排障

您可以根据实际需求进行修改和扩展。

抱歉,评论功能暂时关闭!