这不,最近公司也在忙着把微服务的架构迁移到 Kubernetes 上,而我作为程序员当然要为大家分享一些经验了。
别看 Kubernetes 是个非常庞大的东西,但有了这些技巧,我们可以让应用在生产环境中实现真正的零宕机发布!下面就一起来看看这背后的配置和技术细节吧!
1. 健康检查,确保应用在 Kubernetes 上能持续健康
就绪探针(readinessProbe):它负责检测容器是否准备好接收请求。如果容器没准备好,Kubernetes 就不会把流量路由到它。 存活探针(livenessProbe):它负责监控容器是否死掉。如果容器挂掉了,Kubernetes 就会重启它。
pom.xml
或者 build.gradle
中添加了 actuator 依赖:<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
application.yaml
中配置健康检查的端点:management:
endpoints:
web:
exposure:
include: health,info
health:
diskspace:
enabled: true
path: /
threshold: 100MB
/actuator/health
作为健康检查端点。你可以通过这个端点来检查应用的健康状况。当然,你也可以根据需要自定义其他探针,比如磁盘空间、数据库连接等。deployment.yaml
配置示例:apiVersion: apps/v1
kind: Deployment
metadata:
name: my-springboot-app
spec:
replicas: 3
template:
metadata:
labels:
app: my-springboot-app
spec:
containers:
- name: my-springboot-container
image: myrepo/my-springboot-app:latest
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
2. 滚动更新:让应用更新不中断
maxSurge
和 maxUnavailable
。maxSurge:控制可以创建的最大额外 Pod 数量。 maxUnavailable:控制在更新期间最多可以不可用的 Pod 数量。
deployment.yaml
中的配置如下:strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
3. 优雅停机:确保旧版本容器平滑退出
preStop
生命周期钩子,可以在容器终止之前执行一些清理工作。Spring Boot 也有优雅关机的机制,我们可以通过设置 shutdown
为 true
来让应用执行优雅关机。application.yaml
中开启 Spring Boot 的优雅关机:server:
shutdown:
graceful: true
curl
工具来检测健康状态:FROM openjdk:11-jre-slim
RUN apt-get update && apt-get install -y curl
COPY target/my-springboot-app.jar /app/my-springboot-app.jar
CMD ["java", "-jar", "/app/my-springboot-app.jar"]
preStop
钩子来确保在 Pod 被终止之前执行必要的清理操作:lifecycle:
preStop:
exec:
command: ["sh", "-c", "curl --silent --fail http://localhost:8080/actuator/shutdown"]
4. 弹性伸缩:根据负载自动扩容
resources
)和 水平 Pod 自动伸缩(HPA) 来实现自动扩容。资源限制可以帮助 Kubernetes 确保每个容器不会消耗过多的 CPU 或内存,而 HPA 会根据 CPU 或内存的使用情况自动调整 Pod 数量。deployment.yaml
中,配置容器资源限制如下:resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-springboot-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-springboot-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
5. Prometheus 监控:让我们时刻掌握应用状态
pom.xml
中:<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
application.yaml
中配置 Prometheus 集成:management:
metrics:
export:
prometheus:
enabled: true
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-springboot-app
spec:
replicas: 3
template:
metadata:
labels:
app: my-springboot-app
spec:
containers:
- name: my-springboot-container
image: myrepo/my-springboot-app:latest
ports:
- containerPort: 8080
- containerPort: 8081 # Prometheus metrics port
6. 配置分离:灵活管理配置
kubectl create configmap my-app-config --from-file=application.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name
: my-springboot-app
spec:
replicas: 3
template:
metadata:
labels:
app: my-springboot-app
spec:
containers:
- name: my-springboot-container
image: myrepo/my-springboot-app:latest
volumeMounts:
- name: config-volume
mountPath: /config
volumes:
- name: config-volume
configMap:
name: my-app-config
总结
对编程、职场感兴趣的同学,可以链接我,微信:coder301 拉你进入“程序员交流群”。