Java与Kubernetes:云原生应用部署
Java与Kubernetes:云原生应用部署
概述
Kubernetes是容器编排的行业标准。本教程介绍Java应用在Kubernetes上的部署和管理。
1. Docker容器化
# Dockerfile
FROM openjdk:11-jdk-slim
WORKDIR /app
COPY target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
2. Kubernetes配置
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-java-app
spec:
replicas: 3
selector:
matchLabels:
app: my-java-app
template:
metadata:
labels:
app: my-java-app
spec:
containers:
- name: my-java-app
image: my-java-app:latest
ports:
- containerPort: 8080
env:
- name: SPRING_PROFILES_ACTIVE
value: "production"
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
readinessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
livenessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 60
periodSeconds: 30
---
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-java-app
spec:
selector:
app: my-java-app
ports:
- port: 80
targetPort: 8080
type: ClusterIP
---
# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-java-app
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-java-app
port:
number: 80
3. Spring Boot Kubernetes配置
# application-kubernetes.yml
spring:
cloud:
kubernetes:
discovery:
enabled: true
config:
enabled: true
sources:
- name: my-config
datasource:
url: jdbc:mysql://mysql-service:3306/mydb
username: root
password: ${DB_PASSWORD}
management:
endpoints:
web:
exposure:
include: health,info,metrics
4. 实际应用示例
健康检查端点
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;
@Component
public class CustomHealthIndicator implements HealthIndicator {
@Override
public Health health() {
// 自定义健康检查逻辑
if (isDatabaseConnected()) {
return Health.up().withDetail("database", "connected").build();
}
return Health.down().withDetail("database", "disconnected").build();
}
private boolean isDatabaseConnected() {
// 检查数据库连接
return true;
}
}
配置管理
import org.springframework.cloud.kubernetes.config.KubernetesConfigMapPropertySourceLocator;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.ConfigurableEnvironment;
@Configuration
public class KubernetesConfig {
@Bean
public KubernetesConfigMapPropertySourceLocator configMapPropertySourceLocator(
ConfigurableEnvironment environment) {
return new KubernetesConfigMapPropertySourceLocator(environment);
}
}
5. 最佳实践
- 使用多阶段构建:减小镜像大小
- 配置资源限制:避免资源耗尽
- 实现健康检查:确保应用可用性
- 使用配置映射:集中管理配置
- 监控和日志:使用Prometheus和ELK
总结
Kubernetes是云原生应用的部署平台。掌握Java应用在Kubernetes上的部署和管理,可以构建可扩展、高可用的云原生系统。