kubernetes - Kubernetes PodDisruptionBudget、HorizontalPodAutoscaler 和 RollingUpdate 交互?
问题描述
如果我有以下 Kubernetes 对象:
Deployment
设置rollingUpdate.maxUnavailable
为1
.PodDisruptionBudget
设置maxUnavailable
为1
.HorizontalPodAutoscaler
设置以允许自动缩放。- 集群自动扩展已启用。
如果集群负载不足并且正在扩展,会发生什么:
- 在滚动更新期间?
Pod
由于扩大规模而添加的新版本是否使用新版本Pod
? - 何时需要重新启动或更换节点?是否
PodDisruptionBudget
完全停止重新启动?HorizontalPodAutoscaler
在关闭另一个节点之前是否会增加节点数量? - 当
Pod
关联性设置为避免将Pod
来自同一节点的两个 's放置Deployment
在同一节点上时。
解决方案
- 如文档中所示:
由于滚动升级应用程序而被删除或不可用的 Pod 确实计入中断预算,但控制器(如部署和状态集)在滚动升级时不受 PDB 的限制——配置了应用程序更新期间的故障处理在控制器规范中。
所以它部分取决于控制器的配置和实现。我相信自动缩放器添加的新 Pod 将使用新版本的 Pod,因为那是当时部署定义中存在的版本。
这取决于您执行节点重启的方式。如果您只是切断电源,则无济于事;)如果您
drain
在关闭节点之前正确执行,那么PodDisruptionBudget
将考虑到并且排水程序不会违反它。Eviction API 遵守中断预算,但可能会违反手动删除 pod 等低级别操作。这更像是一些 API 尊重的建议,而不是整个 Kubernetes 强制执行的强制限制。根据官方文档,如果将亲和性设置为“软”,则 pod 无论如何都将被安排在同一个节点上。如果它是“困难的”,那么部署将被卡住,无法安排所需数量的 pod。滚动更新仍然是可能的,但 HPA 将无法再增加 pod 池。
推荐阅读
- python - 如何在 Python 中使用 OpenCV 删除绘制的对象?
- objective-c - Sprite Kit 中跨设备的缩放点
- python - 在python中相交二元三元组
- powershell - 使用基于数据类型的获取内容
- c - 为什么我的链表插入函数在使用 scanf 输入字符串时会出现分段错误?
- python - 如何使用python和pandas将多列组合成一个长列
- c# - C# 中的 gRPC 客户端不适用于支持 mTLS 的 Go 中的 gRPC 服务器
- angular - 为什么一个角容器需要一个暴露的端口来连接?
- android - 如何检查切换按钮是否打开并在它们打开但不是同时执行操作?
- python - 如果有副作用返回,有没有办法让 unittest.mock 引发异常?