是否可以在不等待新副本集推出的情况下杀死以前的副本集?
Is it possible to kill previous replicaset without waiting for new replicaset to be rolled out?
上下文
假设我们有 d.yaml
,其中定义了策略为 RollingUpdate
的部署。
我们首先创建部署:
kubectl apply -f d.yaml
一段时间后,我们修改 d.yaml
并重新应用它以更新部署。
vi d.yaml
kubectl apply -f d.yaml
这将开始推出一个新的副本集 R_new
。
通常,只有在 R_new
成功推出后,旧的(以前的)副本集 R_old
才会被 杀死 。
问题 (tl;dr)
是否可以在不等待推出 R_new
完成的情况下杀死 R_old
?
“杀死”是指完全停止复制集;它不应该重新启动。 (所以 kubectl delete replicaset
没有帮助。)
问题(长)
在我的特定情况下,我的容器连接到外部数据库。这个单一的数据库还连接了由其他团队管理的许多容器。
如果已经达到 ,与 R_new
关联的新容器将无法启动(即 CrashLoopBackOff
)。
如果我可以强行杀死 R_old
,连接数将减少 N
,其中 N
是副本数,因此 R_new
's容器将成功启动。
常见问题解答:
问。为什么不暂时停止使用 RollingUpdate
策略?
一个。其实我没有权限编辑d.yaml
。由 CI/CD.
编辑
问。为什么不直接增大最大连接数?
一个。我也没有数据库权限...
从技术上讲,您可以通过 运行 kubectl delete replicaset R_old
删除旧的副本集,这将终止旧的 pod。我刚刚在我的集群(kubernetes 版本 1.21.8)中验证了它。
但是,终止 pod 并不一定意味着它会立即被杀死。
Pod 的实际终止取决于是否定义了 preStop lifecycle hook,以及 terminationGracePeriodSeconds 的值(请输入 kubectl explain pod.spec.terminationGracePeriodSeconds
来查看说明)。
默认情况下,kubelet 仅在其容器中的所有进程停止或宽限期结束后才删除 pod。
Is it possible to kill R_old without waiting for rolling out R_new to complete?By "kill", I mean completely stopping a replicaset; it should never restart. (So kubectl delete replicaset didn't help.)
- 更改部署
- 将部署缩减到
replicas=0
,这样就和停止旧副本集一样好
- 将部署扩展到所需的
replicas
数量,新的 replicasets
将在部署中使用新的配置更改创建。
步骤 1 和 2 可以根据要求互换
上下文
假设我们有 d.yaml
,其中定义了策略为 RollingUpdate
的部署。
我们首先创建部署:
kubectl apply -f d.yaml
一段时间后,我们修改 d.yaml
并重新应用它以更新部署。
vi d.yaml
kubectl apply -f d.yaml
这将开始推出一个新的副本集 R_new
。
通常,只有在 R_new
成功推出后,旧的(以前的)副本集 R_old
才会被 杀死 。
问题 (tl;dr)
是否可以在不等待推出 R_new
完成的情况下杀死 R_old
?
“杀死”是指完全停止复制集;它不应该重新启动。 (所以 kubectl delete replicaset
没有帮助。)
问题(长)
在我的特定情况下,我的容器连接到外部数据库。这个单一的数据库还连接了由其他团队管理的许多容器。
如果已经达到 R_new
关联的新容器将无法启动(即 CrashLoopBackOff
)。
如果我可以强行杀死 R_old
,连接数将减少 N
,其中 N
是副本数,因此 R_new
's容器将成功启动。
常见问题解答:
问。为什么不暂时停止使用 RollingUpdate
策略?
一个。其实我没有权限编辑d.yaml
。由 CI/CD.
问。为什么不直接增大最大连接数?
一个。我也没有数据库权限...
从技术上讲,您可以通过 运行 kubectl delete replicaset R_old
删除旧的副本集,这将终止旧的 pod。我刚刚在我的集群(kubernetes 版本 1.21.8)中验证了它。
但是,终止 pod 并不一定意味着它会立即被杀死。
Pod 的实际终止取决于是否定义了 preStop lifecycle hook,以及 terminationGracePeriodSeconds 的值(请输入 kubectl explain pod.spec.terminationGracePeriodSeconds
来查看说明)。
默认情况下,kubelet 仅在其容器中的所有进程停止或宽限期结束后才删除 pod。
Is it possible to kill R_old without waiting for rolling out R_new to complete?By "kill", I mean completely stopping a replicaset; it should never restart. (So kubectl delete replicaset didn't help.)
- 更改部署
- 将部署缩减到
replicas=0
,这样就和停止旧副本集一样好 - 将部署扩展到所需的
replicas
数量,新的replicasets
将在部署中使用新的配置更改创建。
步骤 1 和 2 可以根据要求互换