Kubernetes 中亲和性策略详解

阅读时长 7 分钟读完

Kubernetes 是一个容器编排平台,可以部署和管理大规模容器应用。而亲和性策略(Affinity)则是 Kubernetes 调度器(Scheduler)的一个功能,允许你控制 Pod 在哪些节点上运行。本文将介绍 Kubernetes 中亲和性策略的使用方法和指导意义,并提供示例代码供读者使用。

亲和性策略介绍

亲和性策略是一种调度策略,控制 Pod 应该被调度到哪些节点上。它可以被用于解决高可用性和负载均衡的问题。亲和性策略分为软亲和性和硬亲和性两种类型。软亲和性表示比较喜欢调度到指定的节点上,但不是必须的,硬亲和性则表示必须调度到指定的节点上。

在 Kubernetes 中,亲和性策略可以通过 nodeSelector 和 affinity 两个字段来指定。其中,nodeSelector 更为简单,只能用于硬亲和性,而 affinity 则可以更加自由的指定亲和性策略,包括软硬亲和性、反亲和性和拒绝亲和性等策略。

nodeSelector

nodeSelector 是最基础的节点选择器。它可以用于限制 Pod 的调度只在一个特定的节点上运行。下面是一个 nodeSelector 的示例代码:

-- -------------------- ---- -------
----------- --
----- ---
---------
  ----- ------------------
-----
  -----------
  - ----- ------------------
    ------ -------
  -------------
    ----- -----

上述代码中,Pod 被调度到了 nodeSelector 中 type 属性为 hello 的节点上。

affinity

affinity 具有比 nodeSelector 更丰富的功能。affinity 可以用多种方式创建亲和性策略,包括 nodeAffinity、podAffinity 和 podAntiAffinity 三个属性。其中,nodeAffinity 可以控制节点的亲和性,podAffinity 和 podAntiAffinity 可以控制 Pod 之间的亲和性。

nodeAffinity

nodeAffinity 可以分为 requiredDuringSchedulingIgnoredDuringExecution 和 preferredDuringSchedulingIgnoredDuringExecution 两大类。其中,required 表示必须运行在符合条件的节点上,而 preferred 表示优先运行在符合条件的节点上,但没有符合条件的节点时尝试在其他节点上运行。下面是一个 nodeAffinity 的示例代码:

-- -------------------- ---- -------
----------- -------
----- ----------
---------
  ----- ------------------
-----
  --------- -
  ---------
    ------------
      ---- ------------------
  ---------
    ---------
      -------
        ---- ------------------
    -----
      ---------
        -------------
          -----------------------------------------------
            ------------------
            - -----------------
              - ---- ----------------------
                --------- --
                -------
                - -----

上述代码中,Pod 被调度到了 kubernetes.io/hostname 为 node1 的节点上。如果没有符合条件的节点,Pod 将无法启动。

podAffinity

podAffinity 能够作用于同一个 Pod。即,可以让同一个 Pod 的部分容器运行在同一个节点上。可以通过 preferredDuringSchedulingIgnoredDuringExecution 或 requiredDuringSchedulingIgnoredDuringExecution 指定 Pod 的亲和性策略。下面是一个 podAffinity 的示例代码:

-- -------------------- ---- -------
----------- -------
----- ----------
---------
  ----- -----------------
-----
  --------- -
  ---------
    ------------
      ---- -----------------
  ---------
    ---------
      -------
        ---- -----------------
    -----
      ---------
        ------------
          -----------------------------------------------
          - --------------
              -----------------
              - ---- ---
                --------- --
                -------
                - ------------------
            ------------ ----------------------
      -----------
      - ----- -----------------
        ------ -------

上述代码中,Pod 被调度到了与 labelSelector 匹配的 Pod 的节点上。换句话说,就是与 labelSelector 匹配的 Pod 尽量在同一个节点上。

podAntiAffinity

podAntiAffinity 则与 podAffinity 相反,表示不能让同一个 Pod 的部分容器运行在同一个节点上。也可以通过 preferredDuringSchedulingIgnoredDuringExecution 或 requiredDuringSchedulingIgnoredDuringExecution 指定 Pod 的亲和性策略。下面是一个 podAntiAffinity 的示例代码:

-- -------------------- ---- -------
----------- -------
----- ----------
---------
  ----- ---------------------
-----
  --------- -
  ---------
    ------------
      ---- ---------------------
  ---------
    ---------
      -------
        ---- ---------------------
    -----
      ---------
        ----------------
          -----------------------------------------------
          - --------------
              -----------------
              - ---- ---
                --------- --
                -------
                - ------------------
            ------------ ----------------------
      -----------
      - ----- ---------------------
        ------ -------

上述代码中,Pod 被调度到了不与 labelSelector 匹配的 Pod 的节点上。换句话说,就是不能与 labelSelector 匹配的 Pod 在同一个节点上运行。

总结

在 Kubernetes 中,亲和性策略是一种非常灵活和重要的调度策略。它可以用于优化 Pod 的调度和部署,提升应用的高可用性和负载均衡性。通过熟练掌握亲和性策略的用法并灵活应用,可以大大提高 Kubernetes 的工作效率。

示例代码

示例代码已在文章中给出。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6455f9c6968c7c53b094b371

纠错
反馈