kubernetes - 多区 Kubernetes 集群和亲和性。如何按区域分配应用程序?
问题描述
我有一个包含 6 个节点的多专区(3 个专区)GKE 集群(1.10.7-gke.1),并且希望每个专区至少有一个我的应用程序的副本。
所以我尝试了首选的 podAntiAffinity:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: component
operator: In
values:
- app
topologyKey: failure-domain.beta.kubernetes.io/zone
第一次安装(从 1 到 3 个副本)我的应用程序时,一切看起来都很好。在下一次滚动更新之后,一切都变得混乱了,我可以在一个区域中拥有我的应用程序的 3 个副本。由于创建了额外的副本并终止了旧的副本。
当我尝试使用requiredDuringSchedulingIgnoredDuringExecution相同的术语时,一切看起来都很好,但滚动更新不起作用,因为无法安排新的副本(每个区域中已经存在“component”=“app”的 Pod)。
如何配置我的部署以确保我在每个可用区都有副本?
更新:
我现在的解决方法是在滚动更新期间设置硬反关联并拒绝额外的 pod(超过 3 个):
replicaCount: 3
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: component
operator: In
values:
- app
topologyKey: failure-domain.beta.kubernetes.io/zone
deploymentStrategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 0
maxUnavailable: 1
解决方案
我不认为 Kubernetes 调度程序提供了一种方法来保证所有可用区域中的 pod。我相信这是一种尽力而为的方法,并且可能存在一些限制。
我已经打开了一个问题来检查这是否可以通过 NodeAffinity 或 PodAffiity/PodAntiAffinity 来支持。
推荐阅读
- android - 捕获的图像小部件:失败的断言颤振
- oracle - PLSQL 循环遍历日期并将其用作参数
- java - 排除结束零,并从排序数组中重复元素
- delphi - 如何从外部文件中获取版本信息?
- java - 在 Spring Batch 中,如何一个接一个地运行 2 个选择查询,我必须将第一个查询结果传递给第二个查询
- python - 如何在 matplotlib 动画中使用函数作为“帧”参数?
- c++ - 我应该如何修改此代码以使用给定字符串中的字母打印菱形图案?
- java - 将 JUnit 导入 Intellij
- python - 将熊猫列中的字符串列表转换为字符串
- reactjs - 如何在 axios API 调用中使用“useParams()”?