Kubernetes:盲目使用 RollingUpdate 安全吗?

Kubernetes: Is it safe to blindly use RollingUpdate?

亲爱的,

我是 Kubernetes 的新手,目前正在处理我的服务(traefik、prometheus 等)的更新过程。我想避免可能导致错误或崩溃的强制性实时更新。我习惯于控制什么需要更新,什么不需要。

到目前为止,我了解到 Kubernetes 为字段 spec.updateStrategy.type 提供了 2 个可能的值:

我很惊讶没有找到与 apt Debian 工具相同的步骤:当我使用 apt update; apt upgrade 时,我得到一个将要更新的列表,然后我选择我想要的已更新。

当我来到 Kubernetes 时,我想象更新可以保持这种两步走的精神,比如:

  1. 执行命令,将当前部署在集群上的 docker 图像与存储库进行比较。此命令将打印每个图像的新现有版本。
  2. 执行另一个命令来选择要更新的内容。

没有 stableunstabletesting 渠道,如 Linux 存储库和 docker,那么我无法区分测试更新和可信赖的更新。我担心 RollingUpdate 会不加区别地部署每个新映像。

这引出了我的主要问题:盲目信任 RollingUpdate 是否完全安全?

相信 RollingUpdate StatefulSet update strategy 是安全的。但是,重要的是要注意这是不是“自动更新”。

StatefulSet(还有 Deployment)有一个具有 image: 的模板 Pod 规范。这倾向于将图像的相当特定的版本命名为 运行。一般来说,Kubernetes 会检查节点上是否已经有具有该名称和标签的图像,如果是,则尝试 运行 它而不更新它(参见 Updating images,其中讨论了 imagePullPolicy: 字段).

因此,如果您的 StatefulSet 说 image: prom/prometheus:2.26.0,例如,您的 Pods 将使用 完全 那个版本的普罗米修斯,而不是其他版本。如果你只是说 image: prom/prometheus 没有标签(或带有 ...:latest),那么每个节点都会拉取 Pod 启动时恰好是最新的任何版本,你可以很容易地结束-同步版本。

使用更新策略的地方就是您更改 image: prom/prometheus:2.27.0 的时候。无法修改 Pod 规范中的图像,因此需要删除并重新创建现有的 pods。如果您有 updateStrategy: { type: RollingUpdate }(默认值),那么 StatefulSet 控制器将为您执行此操作,特别是按顺序删除和重新创建 pods。如果您将其设置为 OnDelete 那么您需要手动删除 pods.

由于您作为管理员控制着 image:,因此您可以准确选择正在使用的版本;不存在会自动更新的“稳定更新通道”。相应地,您可以在预生产环境中部署更新后的 StatefulSet YAML 配置,以便在将其推广到生产环境之前进行测试。