Pod 和 Node 是 Kubernetes 中的两个最基本的概念,其中 Pod 是 Kubernetes 中的最小调度单位,而 Node 是集群中的一台机器。在实际部署中,我们可能要指定 Pod 只能调度到某些特定的 Node 上,或者是需要避免某些 Node 上运行 Pod。这时就需要用到亲和性和反亲和性。
什么是亲和性与反亲和性
在 Kubernetes 中,亲和性指的是一种 Pod 只能调度到某些特定 Node 上的规则,反亲和性则是一种避免 Pod 被调度到某些特定 Node 上的规则。
同时,亲和性和反亲和性都有软约束和硬约束两种方式:
- 软约束:表示尽量满足约束条件,但不是强制的;
- 硬约束:必须满足约束条件才能调度。
除此之外,亲和性和反亲和性都可以使用节点标签(Node Selector)、节点亲和性(Node Affinity)、Pod 亲和性(Pod Affinity)以及 Pod 反亲和性(Pod Anti-Affinity)来进行定义和控制。
节点标签
节点标签(Node Selector)是 Kubernetes 中最常用的节点亲和性和反亲和性控制方式之一,简单来说就是在调度 Pod 的时候,可以指定 Pod 只能运行在拥有某些特定标签的 Node 上。
如下是一个指定了节点标签的 Pod 配置文件:
-- -------------------- ---- ------- ----------- -- ----- --- --------- ----- ----- ----- ----------- - ----- ----- ------ ----- ------------- --------- ---
这个配置文件告诉 Kubernetes,只有拥有标签 disktype=ssd
的 Node 才能调度当前 Pod。
节点亲和性
如果我们需要更灵活地控制 Pod 的调度规则,可以使用节点亲和性(Node Affinity)。通过使用节点亲和性,我们可以指定 Pod 只能调度到拥有特定标签的 Node 上,并且可以使用多个键值对来定义更复杂的规则。
-- -------------------- ---- ------- ----------- -- ----- --- --------- ----- ----- ----- ----------- - ----- ----- ------ ----- --------- ------------- ----------------------------------------------- ------------------ - ----------------- - ---- ------------------------- - ---- ---- ----- --- ----- -- --- ----- --------- -- ------- - ------- - ------- - ---- ------------------------ --------- -- ------- - ----
这个配置文件告诉 Kubernetes,只有标签 kubernetes.io/e2e-az-name=e2e-az1,e2e-az2
且 kubernetes.io/e2e-region=west
的 Node 才能调度当前 Pod。requiredDuringSchedulingIgnoredDuringExecution
表示该规则是硬约束。
Pod 亲和性和反亲和性
Pod 亲和性和反亲和性可以指定 Pod 只能和特定的 Pod 或 Node 在同一个节点上运行。Pod 亲和性可以用于实现类似于 Master/Slave 的架构,即某些 Pod 只能运行在特定的 Node 上,确保单个 Node 不会负载过高。Pod 反亲和性则可以阻止两个相互竞争的 Pod 在同一个 Node 运行。
以下是 Pod 亲和性的一个示例:
-- -------------------- ---- ------- ----------- -- ----- --- --------- ----- ----- ----- ----------- - ----- ----- ------ ----- --------- ------------ ----------------------------------------------- - -------------- ----------------- - ---- -------- --------- -- ------- - -- ------------ ------------------------
这个配置文件告诉 Kubernetes,在节点控制平面的 Kubernetes.io/hostname 拓扑域内,唯一的带有标签 security=S1 Pod 和当前 Pod 调度到同一个节点上。requiredDuringSchedulingIgnoredDuringExecution
表示该规则是硬约束。
以下是 Pod 反亲和性的一个示例:
-- -------------------- ---- ------- ----------- -- ----- --- --------- ----- ----- ----- ----------- - ----- ----- ------ ----- --------- ---------------- ----------------------------------------------- - -------------- ----------------- - ---- -------- --------- -- ------- - -- ------------ ------------------------
这个配置文件告诉 Kubernetes,在节点控制平面的 Kubernetes.io/hostname 拓扑域内,除了带有标签 security=S1 的 Pod 以外,不允许其他 Pod 调度到同一个节点上。requiredDuringSchedulingIgnoredDuringExecution
表示该规则是硬约束。
总结
Kubernetes 中的亲和性和反亲和性控制方式包括节点标签、节点亲和性、Pod 亲和性和 Pod 反亲和性。它们都有软约束和硬约束两种方式,可以帮助我们更灵活地控制 Pod 的调度规则,确保集群中的负载均衡和高可用性。在使用这些特性的同时,需要仔细考虑约束条件,避免过度约束导致 Pod 的调度困难。
参考
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ef2503f6b2d6eab392bf10