Kubernetes 中 Pod 与 Node 的亲和性与反亲和性

阅读时长 6 分钟读完

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-az2kubernetes.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

纠错
反馈