是否可以在不等待新副本集推出的情况下杀死以前的副本集?

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.)

  1. 更改部署
  2. 将部署缩减到 replicas=0,这样就和停止旧副本集一样好
  3. 将部署扩展到所需的 replicas 数量,新的 replicasets 将在部署中使用新的配置更改创建。

步骤 1 和 2 可以根据要求互换