Kubernetes:盲目使用 RollingUpdate 安全吗?
Kubernetes: Is it safe to blindly use RollingUpdate?
亲爱的,
我是 Kubernetes 的新手,目前正在处理我的服务(traefik、prometheus 等)的更新过程。我想避免可能导致错误或崩溃的强制性实时更新。我习惯于控制什么需要更新,什么不需要。
到目前为止,我了解到 Kubernetes 为字段 spec.updateStrategy.type
提供了 2 个可能的值:
RollingUpdate
: 永久自动更新
OnDelete
: 手动删除pod后自动更新
我很惊讶没有找到与 apt
Debian 工具相同的步骤:当我使用 apt update; apt upgrade
时,我得到一个将要更新的列表,然后我选择我想要的已更新。
当我来到 Kubernetes 时,我想象更新可以保持这种两步走的精神,比如:
- 执行命令,将当前部署在集群上的 docker 图像与存储库进行比较。此命令将打印每个图像的新现有版本。
- 执行另一个命令来选择要更新的内容。
没有 stable
、unstable
、testing
渠道,如 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 配置,以便在将其推广到生产环境之前进行测试。
亲爱的,
我是 Kubernetes 的新手,目前正在处理我的服务(traefik、prometheus 等)的更新过程。我想避免可能导致错误或崩溃的强制性实时更新。我习惯于控制什么需要更新,什么不需要。
到目前为止,我了解到 Kubernetes 为字段 spec.updateStrategy.type
提供了 2 个可能的值:
RollingUpdate
: 永久自动更新OnDelete
: 手动删除pod后自动更新
我很惊讶没有找到与 apt
Debian 工具相同的步骤:当我使用 apt update; apt upgrade
时,我得到一个将要更新的列表,然后我选择我想要的已更新。
当我来到 Kubernetes 时,我想象更新可以保持这种两步走的精神,比如:
- 执行命令,将当前部署在集群上的 docker 图像与存储库进行比较。此命令将打印每个图像的新现有版本。
- 执行另一个命令来选择要更新的内容。
没有 stable
、unstable
、testing
渠道,如 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 配置,以便在将其推广到生产环境之前进行测试。