全部產品
Search
文件中心

Container Compute Service:Pod間親和性調度

更新時間:Mar 22, 2025

Pod間親和性調度策略,用於表達Pod之間的親和性偏好,相較於節點親和性,Pod間親和性調度支援基於已經在虛擬節點上啟動並執行Pod的標籤來約束Pod可以調度到的範圍。在ACS叢集中,您可以通過Kubernetes原生調度語義實現Pod間親和性調度,通過在podAffinity或podAntiAffinity欄位中填寫拓撲域和標籤規則,可以將Pod調度到指定的拓撲域。本文詳細介紹在ACS中使用Pod間親和性調度的約束條件和使用方式。

前提條件

  • 已安裝調度器組件kube-scheduler,且版本滿足以下要求。

    ACS叢集版本

    調度器組件版本

    1.31

    v1.31.0-aliyun-1.2.0及以上

    1.30

    v1.30.3-aliyun-1.1.1及以上

    1.28

    v1.28.9-aliyun-1.1.0及以上

  • 已安裝acs-virtual-node組件,版本為v2.12.0-acs.4或以上。

注意事項

Pod間親和性功能包括親和性和反親和性兩種使用方式,兩種方式的協議格式相同,都由requiredDuringSchedulingIgnoredDuringExecutionpreferredDuringSchedulingIgnoredDuringExecution組成,其中必填的協議欄位是拓撲域標籤TopologyKey,對應虛擬節點中的標籤。針對不同種類的虛擬節點,ACS分別支援以下拓撲標籤。

虛擬節點類型

Label

含義

範例

普通虛擬節點

topology.kubernetes.io/zone

網路可用性區域

topology.kubernetes.io/zone: cn-shanghai-b

高效能網路GPU型虛擬節點

topology.kubernetes.io/zone

網路可用性區域

topology.kubernetes.io/zone: cn-shanghai-b

alibabacloud.com/hpn-zone

高速網路可用性區域

alibabacloud.com/hpn-zone: B1

ACS支援多種計算類型(compute class),對於不同的計算類型,在使用Pod間親和性的其他協議時還存在以下約束。

  • requiredDuringSchedulingIgnoredDuringExecution協議。

    計算類型

    欄位

    含義

    約束條件

    • 通用型

    • 效能型

    LabelSelector

    用於尋找匹配的Pod,匹配此標籤的Pod將被統計,以確定相應拓撲域中Pod的數量。

    其它計算類型(GPU型、高效能網路GPU型)的Pod在計算匹配數量時將不參與統計。

    Namespaces

    用於指定尋找匹配命名空間,搭配LabelSelector使用。

    NamespaceSelector

    與Namespaces欄位類似,區別在於是通過命名空間的標籤進行尋找。

    • GPU型

    • 高效能網路GPU型

    LabelSelector

    同上,略。

    其它計算類型(通用型、效能型)的Pod在計算匹配數量時將不參與統計。

    Namespaces

    同上,略。

    不支援

    NamespaceSelector

    同上,略。

    不支援

  • preferredDuringSchedulingIgnoredDuringExecution協議。

    計算類

    欄位

    含義

    約束條件

    • 通用型

    • 效能型

    LabelSelector

    Namespaces

    NamespaceSelector

    其它計算類型(GPU型、高效能網路GPU型)的Pod在計算匹配數量時將不參與統計。

    • GPU型

    • 高效能網路GPU型

    所有欄位

    不支援

關於各欄位詳細資料的說明,請參見Pod間親和性與反親和性

操作樣本

樣本中展示了通過配置podAffinity將應用調度到指定可用性區域的效果。

  1. 執行以下命令查看叢集中的虛擬節點。

    kubectl get node

    預期輸出:

    NAME                            STATUS   ROLES   AGE     VERSION
    virtual-kubelet-cn-hangzhou-i   Ready    agent   5h42m   v1.28.3-xx
    virtual-kubelet-cn-hangzhou-j   Ready    agent   5h42m   v1.28.3-xx
  2. 使用以下YAML內容,建立with-affinity-pod.yaml檔案。

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        pod-affinity-label: with-pod-affinity
      name: with-affinity-label-pod
    spec:
      containers:
        - args:
            - 'infinity'
          command:
            - sleep
          image: registry-cn-hangzhou.ack.aliyuncs.com/acs/stress:v1.0.4
          imagePullPolicy: IfNotPresent
          name: stress
          resources:
            limits:
              cpu: '1'
              memory: 1Gi
            requests:
              cpu: '1'
              memory: 1Gi
  3. 執行以下命令,將with-affinity-label-pod部署到叢集。

    kubectl apply -f with-affinity-pod.yaml
  4. 執行以下命令,查看Pod調度的分布情況。

    kubectl get pod -o wide

    預期輸出:

    NAME                      READY   STATUS    RESTARTS   AGE   IP              NODE                            NOMINATED NODE   READINESS GATES
    with-affinity-label-pod   1/1     Running   0          75s   192.168.xx.xxx  virtual-kubelet-cn-hangzhou-i   <none>           <none>

    可以看到Pod已經被調度到可用性區域cn-hangzhou-i。

  5. 使用以下YAML內容,建立origin-affinity-pod.yaml檔案。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dep-pod-affinity
      labels:
        app: pod-affinity-demo
    spec:
      replicas: 4
      selector:
        matchLabels:
          app: pod-affinity-demo
      template:
        metadata:
          labels:
            app: pod-affinity-demo
        spec:
          containers:
          - name: pod-affinity-demo
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/stress:v1.0.4
            command:
            - "sleep"
            - "infinity"
            resources:
              limits:
                cpu: '1'
                memory: 1Gi
              requests:
                cpu: '1'
                memory: 1Gi
          # 指定Pod間親和性,表示需要和帶有<pod-affinity-label:with-pod-affinity>標籤的Pod部署在同一個可用性區域
          affinity:
            podAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
              - labelSelector:
                  matchExpressions:
                  - key: pod-affinity-label
                    operator: In
                    values:
                    - with-pod-affinity
                topologyKey: topology.kubernetes.io/zone
  6. 執行以下命令,將origin-affinity-pod.yaml部署到叢集。

    kubectl apply -f origin-affinity-pod.yaml
  7. 執行以下命令,查看Pod調度的分布情況。

    kubectl get pod -o wide

    預期輸出:

    NAME                                READY   STATUS    RESTARTS   AGE     IP              NODE                            NOMINATED NODE   READINESS GATES
    dep-pod-affinity-6b9d4f7c87-5jlfx   1/1     Running   0          3m26s   192.168.xx.xxx  virtual-kubelet-cn-hangzhou-i   <none>           <none>
    dep-pod-affinity-6b9d4f7c87-hwdpc   1/1     Running   0          3m26s   192.168.xx.xxx  virtual-kubelet-cn-hangzhou-i   <none>           <none>
    dep-pod-affinity-6b9d4f7c87-jfcrq   1/1     Running   0          3m26s   192.168.xx.xxx  virtual-kubelet-cn-hangzhou-i   <none>           <none>
    dep-pod-affinity-6b9d4f7c87-xwbfr   1/1     Running   0          3m26s   192.168.xx.xxx  virtual-kubelet-cn-hangzhou-i   <none>           <none>
    with-affinity-label-pod             1/1     Running   0          6m30s   192.168.xx.xxx  virtual-kubelet-cn-hangzhou-i   <none>           <none>

    可以看到所有Pod都分布在同一個可用性區域。