全部產品
Search
文件中心

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

更新時間:Mar 01, 2026

高可用是分布式任務執行過程中的重要要求,在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調度器組件配置開啟GPU-HPN節點自訂標籤、調度器在新版本中已預設開啟,詳見kube-scheduler

對於同時符合以下條件的Pod,在ACS叢集中使用拓撲分布約束功能時,部分協議欄位存在相關約束。

  • Pod的計算類型為高效能網路GPU型(GPU-HPN)。

  • Pod的schedulerNamedefault-scheduler

  • 調度器組件配置未勾選開啟GPU-HPN節點自訂標籤、調度器

協議欄位

含義

約束

labelSelector

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

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

matchLabelKeys

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

nodeAffinityPolicy

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

不支援。

nodeTaintsPolicy

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

不支援。

對於通用型、效能型和GPU型執行個體,可用性區域拓扑打散協議不存在以上約束。關於各欄位詳細資料的說明,請參見拓撲分布約束

操作步驟

  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-beijing.ack.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個可用性區域。