K8s 滚动更新与回滚:详细教程
Kubernetes(K8s)中的滚动更新(Rolling Update)和回滚(Rollback)是确保应用高可用性和无缝部署的核心功能。滚动更新允许逐步替换旧版本的Pod,避免服务中断;回滚则用于快速恢复到之前的稳定版本。本教程将逐步解释这些概念、配置方法和操作步骤,基于K8s官方文档和最佳实践。内容真实可靠,适用于K8s v1.20及以上版本。
1. 滚动更新详解
滚动更新通过Deployment资源实现,它控制ReplicaSet的创建和更新。更新时,K8s逐步启动新Pod并终止旧Pod,确保服务始终可用。关键参数包括:
- maxSurge:指定可额外创建的Pod数量上限,通常为百分比或整数,例如maxSurge = 25%表示最多超出期望副本数的25%。
- maxUnavailable:指定更新期间不可用的Pod数量上限,例如maxUnavailable = 10%表示最多10%的Pod不可用。
配置步骤:
- 定义Deployment YAML文件,设置滚动更新策略。
- 使用
kubectl apply触发更新。 - K8s自动管理Pod替换过程。
示例YAML配置:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 4 # 期望副本数
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25% # 行内数学表达式:$maxSurge = 25\%$
maxUnavailable: 10% # 行内数学表达式:$maxUnavailable = 10\%$
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: my-image:v1 # 初始镜像版本
操作命令:
bash
# 更新Deployment(例如修改镜像版本)
kubectl apply -f deployment.yaml
# 监控更新状态
kubectl rollout status deployment/my-app
更新过程中,K8s会创建新ReplicaSet,并逐步调整Pod数量。例如,如果replicas=4,maxSurge=25%,则新Pod最多为4 + 4 \\times 0.25 = 5个(其中4 \\times 0.25 = 1),确保服务连续。
2. 回滚详解
回滚用于撤销失败的更新,恢复到之前的ReplicaSet版本。K8s通过Deployment的修订历史(Revision History)实现,默认保存10个历史版本。
配置步骤:
- 确保Deployment启用了修订历史(默认启用)。
- 使用
kubectl rollout undo命令回滚。 - 可选:指定回滚到特定版本。
操作命令:
bash
# 查看Deployment的修订历史
kubectl rollout history deployment/my-app
# 回滚到上一个版本
kubectl rollout undo deployment/my-app
# 回滚到特定版本(例如版本2)
kubectl rollout undo deployment/my-app --to-revision=2
回滚过程也是滚动式的,避免中断服务。K8s会重新激活旧ReplicaSet,并逐步替换Pod。
3. 完整示例
假设一个简单应用,从v1更新到v2,然后回滚。
步骤1:初始部署(v1版本)。
yaml
# deployment-v1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
strategy:
rollingUpdate:
maxSurge: 1 # 行内数学表达式:$maxSurge = 1$
maxUnavailable: 0 # 行内数学表达式:$maxUnavailable = 0$(确保零不可用)
template:
spec:
containers:
- image: my-image:v1
步骤2:更新到v2(修改镜像为v2)。
bash
kubectl apply -f deployment-v1.yaml # 初始部署
kubectl set image deployment/my-app my-container=my-image:v2 # 触发更新
kubectl rollout status deployment/my-app # 监控
步骤3:如果v2有问题,回滚到v1。
bash
kubectl rollout undo deployment/my-app
kubectl get pods # 验证Pod已回滚
4. 最佳实践与注意事项
- 高可用性:设置合理的maxSurge和maxUnavailable,例如在关键服务中使用maxUnavailable = 0,但会增加更新时长。
- 监控 :使用
kubectl get deployments和kubectl describe deployment查看状态。 - 健康检查:在Pod模板中添加liveness和readiness探针,确保新Pod健康后才终止旧Pod。
- 版本控制 :通过
kubectl rollout history管理修订,避免意外覆盖。 - 常见问题 :
- 更新卡住:检查资源配额或Pod事件(
kubectl describe pod)。 - 回滚失败:确保历史版本存在;必要时手动调整YAML。
- 更新卡住:检查资源配额或Pod事件(
滚动更新和回滚是K8s部署的基石,掌握它们能显著提升应用稳定性。通过本教程的步骤,您可以安全地管理应用迭代。