深入浅出 Kubernetes Deployment 滚动更新策略
在 Kubernetes 中,Deployment 是管理无状态应用的一种重要资源类型,而滚动更新(Rolling Update)是 Deployment 默认的升级方式。滚动更新通过逐步替换旧版本的 Pod,确保应用升级时集群始终保持可用。而在这个过程中,Service 的流量分发机制也发挥了关键作用。本文将重点解析滚动更新的过程,深入探讨 Service 在此期间的工作流程,并通过示例帮助你理解和实践。
一、什么是滚动更新?
滚动更新是一种无缝升级应用的方式。在 Kubernetes 中,Deployment 会逐步删除旧的 Pod,并创建新的 Pod,而不是一次性替换所有旧 Pod。这样做的好处是:
- 高可用性:在升级过程中,始终保持一定数量的 Pod 提供服务。
- 平滑过渡:用户体验不会因为服务中断而受影响。
二、滚动更新的关键参数
在 Deployment 的滚动更新中,主要涉及以下两个关键参数:
-
maxUnavailable
:- 定义在升级过程中,最多允许多少个 Pod 不可用。
- 可以是绝对值(如
1
),也可以是百分比(如20%
)。
-
maxSurge
:- 定义在升级过程中,最多允许多创建的 Pod 数量。
- 同样可以是绝对值(如
1
)或百分比(如20%
)。
这两个参数的组合,决定了滚动更新的速率与服务的可用性。
三、滚动更新的过程
在 Deployment 的滚动更新过程中,主要包含以下步骤:
-
创建新版本的 Pod
Kubernetes 根据maxSurge
的设置,先启动一定数量的新版本 Pod。这些 Pod 会与旧版本 Pod 共存一段时间。 -
更新 Service 的流量分发
新版本 Pod 启动后,Kubernetes 会等待这些 Pod 通过 Readiness Probe(就绪探针) 检查,确保它们已经处于“就绪”状态。一旦就绪,Service 的 Endpoint 列表会动态更新,将新 Pod 加入流量分发。 -
逐步删除旧版本 Pod
Kubernetes 按照maxUnavailable
的设置,逐步删除旧版本的 Pod。同时,新版本 Pod 替代旧版本 Pod,直到完成所有 Pod 的更新。 -
完成更新
当所有旧版本 Pod 被删除,新版本 Pod 完全替代后,Deployment 进入“稳定”状态。
四、滚动更新的实践
以下是一个滚动更新的完整配置和操作示例。
1. Deployment 配置示例
apiVersion: apps/v1
kind: Deployment
metadata:name: example-deployment
spec:replicas: 5 # 目标副本数selector:matchLabels:app: examplestrategy:type: RollingUpdaterollingUpdate:maxUnavailable: 1 # 升级时最多 1 个 Pod 不可用maxSurge: 1 # 升级时最多多创建 1 个 Podtemplate:metadata:labels:app: examplespec:containers:- name: nginximage: nginx:1.21 # 当前版本ports:- containerPort: 80readinessProbe: # 配置就绪探针httpGet:path: /port: 80initialDelaySeconds: 3periodSeconds: 5
2. Service 配置示例
apiVersion: v1
kind: Service
metadata:name: example-service
spec:selector:app: exampleports:- protocol: TCPport: 80targetPort: 80type: ClusterIP
3. 滚动更新操作
更新 Deployment 镜像版本:
kubectl set image deployment/example-deployment nginx=nginx:1.22
4. 查看滚动更新过程
-
监控 Pod 状态
使用以下命令观察滚动更新的 Pod 状态变化:kubectl get pods -w
你会看到新 Pod 启动、旧 Pod 逐步退出的过程。
-
查看 Service 的 Endpoint
在更新过程中,动态查看 Service 的 Endpoint 列表:kubectl get endpoints example-service
你会发现新 Pod 的 IP 会逐渐加入 Endpoint,而旧 Pod 的 IP 会被移除。
五、总结
Kubernetes 的滚动更新机制和 Service 的流量动态分配机制相辅相成,确保在升级过程中服务高效、稳定运行。掌握滚动更新的原理与操作,能够帮助我们在实际业务场景中平稳地完成应用的升级迭代,为用户提供更可靠的服务。
如果你有任何疑问或新的见解,欢迎留言分享!