目录标题
Kubernetes 亲和性与反亲和性调度笔记
一、亲和性概述
在 Kubernetes 中,亲和性机制对于 Pod 的调度和部署起着关键作用,它能够帮助我们更精准地控制 Pod 在节点上的分布,提升应用的可用性、性能和资源利用率。下面将介绍两种重要的亲和性机制:nodeAffinity
和 podAntiAffinity
。
1.1 相关参考资料
二、nodeAffinity
2.1 概念
nodeAffinity
用于指定 Pod 应该调度到哪些节点上运行。借助 nodeAffinity
,我们可以确保 Pod 运行在特定的节点集合中,或者避免其运行在某些不期望的节点上。它主要通过节点标签或其他属性来定义节点的选择条件。
2.2 示例代码
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: bpx/node
operator: Exists
2.3 代码解释
上述代码中,requiredDuringSchedulingIgnoredDuringExecution
表示在调度时必须满足该亲和性规则,但在 Pod 运行后节点标签发生变化时,不会影响 Pod 的运行。matchExpressions
定义了匹配规则,这里 key
为 bpx/node
,operator
为 Exists
,意味着调度器会选择带有 bpx/node
标签的节点来运行 Pod。
三、podAntiAffinity
3.1 概念
podAntiAffinity
用于指定 Pod 不能与哪些 Pod 部署在同一个节点上。通过使用 podAntiAffinity
,可以避免在同一个节点上部署相同的应用程序或服务,从而提高应用程序的可用性和鲁棒性。当某个节点出现故障时,由于相同应用的 Pod 分布在不同节点,不会导致整个应用不可用。
3.2 示例代码及解释
3.2.1 首选反亲和性规则
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchLabels:
DBType: mysql
Type: Database
topologyKey: kubernetes.io/hostname
weight: 100
此代码中,preferredDuringSchedulingIgnoredDuringExecution
表示调度器会尽量遵循该反亲和性规则,但不是强制要求。podAffinityTerm
定义了反亲和性的具体规则,labelSelector
中的 matchLabels
指定了要匹配的 Pod 标签,这里是 DBType: mysql
和 Type: Database
。topologyKey
为 kubernetes.io/hostname
,意味着调度器会尽量避免将带有这些标签的 Pod 调度到同一个主机名的节点上。weight
为 100,表示该规则的优先级权重,权重越高,调度器越会优先考虑遵循此规则。
3.2.2 强制反亲和性规则
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
io.cilium/app: operator
topologyKey: kubernetes.io/hostname
这里使用了 requiredDuringSchedulingIgnoredDuringExecution
,表示调度时必须遵循该反亲和性规则。调度器会确保带有 io.cilium/app: operator
标签的 Pod 不会被调度到同一个主机名的节点上。
四、总结
nodeAffinity
和 podAntiAffinity
都是 Kubernetes 中非常实用的调度机制,但使用场景不同。如果需要控制 Pod 运行的节点,应该使用 nodeAffinity
;如果需要避免在同一个节点上部署相同的应用程序或服务,应该使用 podAntiAffinity
。通过合理运用这两种机制,可以更好地管理和优化 Kubernetes 集群中的 Pod 部署。