Kubernetes未知标签值场景下如何用亲和性实现同标签值Pod节点分散
解决方案
Kubernetes 1.23及以上版本(原生支持)
你可以直接使用podAffinityTerm的matchLabelKeys字段实现需求,该字段支持指定标签键,调度时会自动读取当前待调度Pod对应标签的实际取值,匹配集群中同标签同值的其他Pod,无需提前预知标签值。
配置示例如下:
affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 2 podAffinityTerm: labelSelector: matchLabelKeys: - my/label topologyKey: kubernetes.io/hostname
该配置会触发如下调度逻辑:
- 调度带
my/label=x的Pod时,会尽量避开已经运行了带my/label=x的Pod的节点 - 调度带
my/label=y的Pod时,会尽量避开已经运行了带my/label=y的Pod的节点 - 不同取值的Pod之间不会触发反亲和规则,完全符合你的示例场景要求
如果需要强制分散、不允许同值Pod调度到同一节点,把preferredDuringSchedulingIgnoredDuringExecution换成requiredDuringSchedulingIgnoredDuringExecution即可。
Kubernetes 1.23以下版本(兼容方案)
低版本Kubernetes没有原生支持matchLabelKeys特性,你可以由生成my/label取值的Operator在生成Pod模板时,动态把当前Pod的my/label取值注入到affinity的matchLabels配置中,示例渲染逻辑如下:
# 以下为Operator动态渲染后的Pod配置示例,{{ .LabelValue }}为Operator生成的实际标签值 affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 2 podAffinityTerm: labelSelector: matchLabels: my/label: {{ .LabelValue }} topologyKey: kubernetes.io/hostname
因为标签值本身就是Operator计算生成的,所以动态注入配置的逻辑可以直接在Operator的控制循环中实现,无需额外适配。
内容的提问来源于stack exchange,提问作者Jon Bates
相关产品推荐
相关产品推荐

