全部產品
Search
文件中心

Container Compute Service:可用性區域拓扑打散

更新時間:Mar 22, 2025

高可用是分布式任務執行過程中的重要要求,在ACS叢集中,您可以通過Kubernetes原生調度語義實現分布式任務的跨可用性區域打散,以達到高可用性區域部署的效果。您可以在拓撲分布約束協議欄位TopologyKey中指定拓撲標籤,實現對工作負載的可用性區域打散能力。本文詳細介紹在ACS中拓撲約束的約束條件和使用方式。

前提條件

  • 已安裝調度器組件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或以上。

注意事項

ACS叢集內的節點均為虛擬節點。您可以在拓撲分布約束協議欄位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),對於不同的計算類型,在使用拓撲分布約束的其他協議欄位時還存在以下約束。

計算類型

協議欄位

含義

約束條件

  • 通用型

  • 效能型

labelSelector

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

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

matchLabelKeys

配合labelSelector使用的標籤鍵列表,用於選擇需要計算分布方式的Pod集合。

  • GPU型

  • 高效能網路GPU型

labelSelector

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

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

matchLabelKeys

配合labelSelector使用的標籤鍵列表,用於選擇需要計算分布方式的Pod集合。

nodeAffinityPolicy

表示在計算Pod拓撲分布偏差時將如何處理Pod的 nodeAffinity/nodeSelector。

不支援。

nodeTaintsPolicy

表示在計算Pod拓撲分布偏差時將如何處理節點汙點。

不支援。

關於各欄位詳細資料的說明,請參考拓撲分布約束

操作步驟

  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內容,建立dep-spread-demo.yaml檔案。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dep-spread-demo
      labels:
        app: spread-demo
    spec:
      replicas: 4
      selector:
        matchLabels:
          app: spread-demo
      template:
        metadata:
          labels:
            app: spread-demo
        spec:
          containers:
          - name: spread-demo
            image: registry.cn-hangzhou.aliyuncs.com/acs/stress:v1.0.4
            command:
            - "sleep"
            - "infinity"
          # 指定可用性區域打散條件,maxSkew指定了各可用性區域之間的Pod數量相差不能超過一個
          topologySpreadConstraints:
          - maxSkew: 1
            topologyKey: topology.kubernetes.io/zone
            whenUnsatisfiable: DoNotSchedule
            labelSelector:
              matchLabels:
                app: spread-demo
  3. 執行以下命令,將dep-spread-demo部署到叢集。

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

    kubectl get pod -o wide

    預期輸出:

    NAME                               READY   STATUS    RESTARTS   AGE     IP               NODE                            NOMINATED NODE   READINESS GATES
    dep-spread-demo-7c656dbf5f-6twkc   1/1     Running   0          2m29s   192.168.xx.xxx   virtual-kubelet-cn-hangzhou-i   <none>           <none>
    dep-spread-demo-7c656dbf5f-cgxr8   1/1     Running   0          2m29s   192.168.xx.xxx   virtual-kubelet-cn-hangzhou-j   <none>           <none>
    dep-spread-demo-7c656dbf5f-f4fz9   1/1     Running   0          2m29s   192.168.xx.xxx   virtual-kubelet-cn-hangzhou-j   <none>           <none>
    dep-spread-demo-7c656dbf5f-kc6xf   1/1     Running   0          2m29s   192.168.xx.xxx   virtual-kubelet-cn-hangzhou-i   <none>           <none>

    可以看到4個Pod分布在2個可用性區域。