
在 Kubernetes 集群中部署应用时,明明应用已经成功容器化并运行在 Kubernetes 上,但在发布更新或扩缩容时,仍然会出现请求丢失、连接中断等问题。这些“有损”发布现象直接影响用户体验和系统稳定性。本文将深入分析 Kubernetes 中应用上下线的核心问题,帮助实现真正的“零停机”、“零感知”无损发布。
背景:某电商平台在双11大促期间需要紧急修复一个支付服务的安全漏洞。如果采用传统的有损发布方式,可能会导致:
需求:需要在用户无感知的情况下完成服务更新,确保支付流程的连续性。
背景:一个采用微服务架构的 SaaS 平台,每天需要部署数十次。每次部署都可能导致:
需求:实现平滑的滚动更新,确保服务的高可用性。
apiVersion: apps/v1
kind: Deployment
metadata:
name: payment-service
spec:
template:
spec:
containers:
- name: payment-app
image: payment-service:v1.2.0
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
initialDelaySeconds: 20 # 等待应用启动完成
periodSeconds: 5
failureThreshold: 3
successThreshold: 1作用:确保 Pod 只有在应用完全就绪后才接收流量,避免“启动即崩溃”的问题。
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
initialDelaySeconds: 30 # 给予足够的启动时间
periodSeconds: 10
failureThreshold: 1 # 快速失败,及时重启作用:自动检测并恢复僵尸进程,保证服务的长期稳定性。
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-service
spec:
template:
spec:
terminationGracePeriodSeconds: 60 # 总优雅停机时间
containers:
- name: user-app
image: user-service:v2.1.0
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "sleep 20"] # 等待流量摘除
env:
- name: SERVER_SHUTDOWN_GRACE_PERIOD
value: "25s"对应的 Spring Boot 配置(application.yml):
server:
shutdown: graceful
spring:
lifecycle:
timeout-per-shutdown-phase: 25s工作流程:
1、Pod 收到终止信号。
2、执行 preStop 钩子,等待 20 秒确保流量完全摘除。
3、发送 SIGTERM 信号给应用。
4、Spring Boot 开始优雅停机,最多等待 25 秒。
5、如果超时,K8s 发送 SIGKILL 强制终止。
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-service
spec:
replicas: 10
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0 # 保证始终有足够实例提供服务
maxSurge: 1 # 平滑的逐个更新
template:
spec:
terminationGracePeriodSeconds: 60
containers:
- name: order-app
image: order-service:v3.0.0
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
initialDelaySeconds: 15
periodSeconds: 5
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "sleep 20"]apiVersion: apps/v1
kind: Deployment
metadata:
name: production-ready-app
labels:
app: production-service
spec:
replicas: 5
selector:
matchLabels:
app: production-service
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
maxSurge: 1
template:
metadata:
labels:
app: production-service
spec:
terminationGracePeriodSeconds: 75
containers:
- name: main-app
image: my-company/production-app:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "500m"
# 健康检查配置
readinessProbe:
httpGet:
path: /health/readiness
port: 8080
httpHeaders:
- name: Custom-Header
value: Kubernetes-Probe
initialDelaySeconds: 25
periodSeconds: 5
timeoutSeconds: 3
failureThreshold: 3
successThreshold: 1
livenessProbe:
httpGet:
path: /health/liveness
port: 8080
initialDelaySeconds: 45
periodSeconds: 10
timeoutSeconds: 3
failureThreshold: 1
# 生命周期管理
lifecycle:
preStop:
exec:
command:
- /bin/sh
- -c
- |
echo "开始优雅停机流程"
sleep 25
echo "流量摘除完成,开始应用停机"
# 环境变量配置
env:
- name: JAVA_OPTS
value: "-Xms512m -Xmx512m -Dserver.shutdown=graceful"
- name: SPRING_LIFECYCLE_TIMEOUTPER_SHUTDOWN_PHASE
value: "30s"
---
apiVersion: v1
kind: Service
metadata:
name: production-service
spec:
selector:
app: production-service
ports:
- port: 80
targetPort: 8080
protocol: TCP
type: ClusterIP通过无损上下线方案,可以在 Kubernetes 环境中实现真正的“零停机”发布,为用户提供持续稳定的服务体验。
1、探针配置原则:
2、优雅停机关键点:
3、滚动更新策略:
“无他,惟手熟尔”!有需要的用起来!
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!