Deployment Rollback

image

回滚deployment到上一个版本,保存回滚后的镜像名称到指定文件夹中。


image


Deployment 回滚操作详解

回滚操作是 Deployment 的一个关键功能,它允许你将应用程序快速恢复到之前的稳定版本,以应对更新失败或引入问题的情况。 下面详细讲解 Deployment 回滚的各个方面。

1. 回滚的触发原因

  • 更新失败: 新的 Deployment 更新(例如,更改镜像版本、配置更改)导致 Pod 无法正常启动或运行。
  • 引入 Bug: 新的更新引入了应用程序的 Bug 或不兼容问题。
  • 人为错误: 操作员在更新过程中犯错,导致了错误配置。
  • 性能下降: 更新后,应用程序的性能显著下降。

2. 关键命令

  • kubectl rollout history deployment/<deployment_name>: 查看 Deployment 的历史记录。 这显示了 Deployment 的所有 Revision,包括版本号、镜像版本、时间戳以及其他配置信息。 这对于确定要回滚到的版本至关重要。

  • kubectl rollout undo deployment/<deployment_name>: 回滚到上一个版本 (即之前的 Revision)。 这是最直接的回滚方式。

  • kubectl rollout undo deployment/<deployment_name> --to-revision=<revision_number>: 回滚到指定的 Revision 版本。 这使你可以精确地选择要回滚到的版本。 需要通过 kubectl rollout history 找到正确的 Revision 编号。

  • kubectl set image deployment/<deployment_name> <container_name>=<image_name> --record: 更新 Deployment 的镜像并记录这次更新。 --record 标志会将这次更新记录到 Deployment 的历史记录中,方便追踪更改原因。

3. 示例场景和操作

假设你有一个名为 my-app-deployment 的 Deployment,并且你希望更新它的镜像。

场景 1: 简单回滚到上一个版本

  1. 查看 Deployment 的历史记录:

    kubectl rollout history deployment/my-app-deployment
    

    示例输出:

    deployment.apps/my-app-deployment with revision 1
    deployment.apps/my-app-deployment with revision 2
    deployment.apps/my-app-deployment with revision 3
    

    假设 revision 3 是最新的,但导致了问题。

  2. 回滚到上一个版本 (revision 2):

    kubectl rollout undo deployment/my-app-deployment
    

    (这会默认回滚到上一个版本)

  3. 验证回滚:

    kubectl rollout status deployment/my-app-deployment
    kubectl get pods
    

    检查 Pod 是否已正确回滚,并且 Pod 状态是否正常。

场景 2: 回滚到特定版本

  1. 查看 Deployment 的历史记录 (与上面相同):

    kubectl rollout history deployment/my-app-deployment
    

    (得到 revision 1, 2, 3 这样的列表)

  2. 回滚到 Revision 1:

    kubectl rollout undo deployment/my-app-deployment --to-revision=1
    
  3. 验证回滚 (与上面相同):

    kubectl rollout status deployment/my-app-deployment
    kubectl get pods
    

场景 3: 使用 --record 记录镜像更新

  1. 更新 Deployment 的镜像,并记录更新原因:

    kubectl set image deployment/my-app-deployment my-app-container=nginx:1.23.4 --record
    
    • my-app-container: 你的 Pod 容器的名称。
    • nginx:1.23.4: 要更新的镜像版本。
    • --record: 记录这次更新到历史记录中。
  2. 查看历史记录:

    kubectl rollout history deployment/my-app-deployment
    

    你将看到更新的注释,显示了更新的原因,例如:

    REVISION  CHANGE-CAUSE
    1         <none>
    2         kubectl set image deployment/my-app-deployment my-app-container=nginx:1.23.4
    3         <previous update cause>
    

4. 重要的注意事项

  • 滚动更新: Deployment 使用滚动更新策略,这意味着在回滚过程中,旧的 Pod 会逐渐被新的 Pod 替换,保证应用程序的可用性。 这防止了服务中断。

  • Pod 的生命周期: 回滚过程中,旧 Pod 会被终止,新 Pod 会被创建。 Pod 状态会经历 Pending, Running, Terminating 等阶段。 你可以使用 kubectl get pods 命令查看 Pod 的状态。

  • 监控和日志: 在回滚之后,密切监控应用程序的日志和性能。 确保应用程序正常运行。

  • 选择合适的版本: 在进行回滚操作之前,要仔细考虑要回滚到的版本。 查看历史记录并根据实际情况进行选择。

  • 测试环境: 强烈建议在测试或预生产环境中测试回滚操作,以确保其正常工作并了解其影响。

  • 回滚的限制: 回滚只能回滚 Deployment 的配置,而不能回滚任何数据。 如果更新涉及数据库 schema 或数据的更改,回滚可能不会解决所有问题。

  • 了解 Change-Cause: CHANGE-CAUSE 在历史记录中的重要性,能够追溯变更。 尽量记录 kubectl set image 的时候使用 --record 参数。

5. 小结

Deployment 回滚是 Kubernetes 中非常重要的一个特性。 通过理解关键命令、掌握操作流程,并结合监控和日志,你可以安全有效地将应用程序恢复到之前的版本,确保应用程序的稳定性和可用性。

posted on 2025-07-03 08:59  Leo_Yide  阅读(60)  评论(0)    收藏  举报