如何解决Kubernetes 部署 - 控制同时终止 Pod 的最大数量
使用 Kubernetes,我们可以控制在新部署推出的同时创建多少个 Pod(应用实例)。可以通过使用属性 max surge 和 max unavailable 来实现。如果我们有数十个应用程序实例,默认配置将推出多个新实例,同时多个实例将终止。
对我们来说最可取的配置是将其更改为 max surge = 1
和 max unavailable = 0
(原因 - 实现平滑的 Kafka 重新平衡)。在这种情况下,在特定时间只会启动一个应用实例,并且最多会终止几个实例。
如我所见,如果我们有 max surge = N
和 max unavailable = 0
,部署策略如下:
- 第 1 步:N 个新 Pod(第一批)开始
- 第 2 步:终止 N 个 Pod,启动 N 个新 Pod(第二批)
- 第 3 步:再终止 N 个 Pod(与第 2 步一起,我们可以体验 最多 2N 个终止 Pod)和 N 个新 Pod(第三批) 开始
- 第4步:同样的逻辑,这里我们可以体验超过2N Pod 仍在终止
- 等等...
对于 Pod 总数为 30、具有 max surge = 1
和 max unavailable = 0
的微服务,我们最多可同时终止 3 个 Pod,并且具有 max surge = 3
和 max unavailable = 0
- 最多 7 个终止 pod。
是否可以在部署推出期间控制同时终止 Pod 的最大数量? 假设我最多希望看到一个处于终止状态的 Pod。因此,在 pod 不会完全关闭之前,不会启动新的 pod。
kubectl version
:
Client Version: version.Info{Major:"1",Minor:"18",GitVersion:"v1.18.10",GitCommit:"62876fc6d93e891aa7fbe19771e6a6c03773b0f7",GitTreeState:"clean",BuildDate:"2020-10-15T01:52:24Z",GoVersion:"go1.13.15",Compiler:"gc",Platform:"linux/amd64"}
Server Version: version.Info{Major:"1",BuildDate:"2020-10-15T01:43:56Z",Platform:"linux/amd64"}
解决方法
maxUnavailable
和 maxSurge
绝对是要走的路。您列出的步骤很重要,这就是它应该如何工作。
您遇到的情况很可能是一个错误。 GitHub (#99513) 上有一个关于 Kubernetes 不尊重 maxUnavailable
和 maxSurge
的类似问题。
如果可以,请在 GitHub 上创建新问题,因为您的问题与上述问题略有不同。
编辑
我在回复中发现了另一个类似的问题 (#95498),说明它按预期工作。 [source]
当部署控制器对部署执行滚动更新时,它会根据它控制的副本集的.spec.replicas
扩展/缩小副本集。当 ReplicaSet 缩小时,ReplicaSet 的 .spec.replicas
将减少并且它的一些 Pod 将终止,并且 Deployment 控制器在计算 maxSurge / maxUnavailable 时会简单地忽略那些终止的 Pod。
类似地,ReplicaSet 控制器在执行操作时会忽略终止 Pod,例如计算其 .status.availableReplicas
但我有我的疑问。在 GitHub 上创建新问题并让开发人员研究它仍然是不错的选择。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。