kubectl rollout滚动更新

module_06_rollingupdates1

用户希望应用程序始终可用,而开发人员则需要每天多次部署它们的新版本。 在 Kubernetes 中,这些是通过滚动更新(Rolling Updates)完成的。 滚动更新 允许通过使用新的实例逐步更新 Pod 实例,实现零停机的 Deployment 更新。 新的 Pod 将被调度到具有可用资源的节点上。

kubectl rollout命令解析

子命令 功能描述 示例
history 查看资源的版本历史 kubectl rollout history deployment/nginx-deployment
pause 暂停部署 kubectl rollout pause deployment/nginx-deployment
restart 重新启动部署 kubectl rollout restart deployment/nginx-deployment
resume 恢复已暂停的部署 kubectl rollout resume deployment/nginx-deployment
status 查看部署的当前状态 kubectl rollout status deployment/nginx-deployment
undo 回滚到之前的版本 kubectl rollout undo deployment/nginx-deployment

补充说明:

  1. history:

    • 查看特定版本的详细信息:kubectl rollout history deployment/nginx-deployment --revision=2
  2. pauseresume:

    • 这两个命令通常成对使用,用于控制部署过程
  3. restart:

    • 用于触发 Deployment 中所有 Pod 的重新创建
  4. status:

    • 可以添加 --watch 标志来持续监控状态:kubectl rollout status deployment/nginx-deployment --watch
  5. undo:

    • 回滚到特定版本:kubectl rollout undo deployment/nginx-deployment --to-revision=2

步骤(官方)

  1. 检查当前状态:
1
2
3
kubectl get deployments
kubectl get pods
kubectl describe pods | grep Image
  1. 更新应用程序版本:
1
2
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
kubectl get pods
  1. 验证更新:
1
2
kubectl rollout status deployments/kubernetes-bootcamp
kubectl describe pods | grep Image
  1. 回滚更新(如果需要):
1
2
3
kubectl rollout undo deployments/kubernetes-bootcamp
kubectl get pods
kubectl describe pods | grep Image
  1. 清理:
1
kubectl delete deployments/kubernetes-bootcamp services/kubernetes-bootcamp

重启回滚(优雅)

  1. 使用 kubectl rollout restart

这是最直接的方法:

1
kubectl rollout restart deployment/your-deployment-name

这个命令会触发一个滚动重启过程:

  1. 逐个替换旧的 Pod

  2. 确保新 Pod 运行正常后才终止旧 Pod

  3. 继续此过程直到所有 Pod 都被更新

  4. 监控重启进度

使用以下命令监控重启进度:

1
kubectl rollout status deployment/your-deployment-name
  1. 自定义重启策略

通过修改 Deployment 的更新策略来自定义重启行为:

1
2
3
4
5
6
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
  • maxUnavailable: 更新过程中允许不可用的 Pod 的最大数量
  • maxSurge: 更新过程中允许创建的超出期望 Pod 数量的 Pod 数
  1. 使用环境变量触发重启

如果想在不更改镜像的情况下触发重启,可以更新一个环境变量:

1
kubectl set env deployment/your-deployment-name RESTART_DATE="$(date)"
  1. 使用注释触发重启

另一种方法是更新 Deployment 的注释:

1
2
kubectl patch deployment your-deployment-name -p \
"{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"kubectl.kubernetes.io/restartedAt\":\"$(date +'%Y-%m-%dT%H:%M:%S%z')\"}}}}}"
  1. 分批重启(高级技巧)

对于大型部署进行分批重启:

1
2
kubectl get pods -l app=your-app-label -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}' | \
xargs -I {} kubectl delete pod {}

这会逐个删除 Pod,触发 Kubernetes 创建新的 Pod 来替换。

注意事项:

  • 确保你的应用程序能够优雅地处理重启
  • 在生产环境中进行重启之前,先在测试环境中验证
  • 考虑使用就绪探针(Readiness Probe)来确保新 Pod 在接收流量前已准备就绪
  • 监控应用程序性能,确保重启过程不会对用户体验产生负面影响
  • 使用 maxUnavailable 来控制滚动重启的并发性,避免一次删除太多 Pod,导致应用不可用

kubectl rollout滚动更新
http://example.com/2024/09/25/kubectl-rollout滚动更新/
作者
Sanli Ma
发布于
2024年9月25日
许可协议