全部產品
Search
文件中心

Container Compute Service:節點親和性調度

更新時間:Mar 01, 2026

ACS叢集中Node對象以虛擬節點的形式提供,虛擬節點以label的形式標記了各類屬性,例如可用性區域、地區,以及虛擬節點的GPU型號等。在ACS叢集中,您可以通過Kubernetes原生調度語義實現節點親和性調度,通過在nodeSelectornodeAffinity欄位中填寫特定的節點屬性,可以將應用運行在特定屬性的虛擬節點上。本文介紹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

nodeSelector

nodeSelector可以直接指定虛擬節點中的標籤,來實現節點親和性調度。

nodeAffinity

nodeAffinity同樣可以聲明節點的親和性屬性,但其文法表達能力更強,對於同時符合以下條件的Pod,在ACS叢集中使用節點親和性調度時存在相關約束。

說明

ACS調度器組件配置開啟GPU-HPN節點自訂標籤、調度器在新版本中已預設開啟,詳見kube-scheduler

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

  • Pod的schedulerNamedefault-scheduler

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

協議欄位

含義

約束條件

requiredDuringSchedulingIgnoredDuringExecution

只有在規則被滿足的時候才能執行調度,類似nodeSelector

nodeSelectorTerms欄位中:

  • 僅支援在matchExpressions中填寫以上親和性標籤。

  • 不支援填寫matchFields。

preferredDuringSchedulingIgnoredDuringExecution

按權重指定節點親和性,調度器會嘗試尋找滿足對應規則的節點,如果找不到匹配的節點,調度器仍然會調度該Pod。

不支援。

對於通用型、效能型和GPU型執行個體,nodeAffinity協議不存在以上約束。

操作樣本

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

  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-node-selector-demo.yaml檔案。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dep-node-selector-demo
      labels:
        app: node-selector-demo
    spec:
      replicas: 4
      selector:
        matchLabels:
          app: node-selector-demo
      template:
        metadata:
          labels:
            app: node-selector-demo
        spec:
          containers:
          - name: node-selector-demo
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/stress:v1.0.4
            command:
            - "sleep"
            - "infinity"
          # 指定可用性區域為cn-hangzhou-j
          nodeSelector:
            topology.kubernetes.io/zone: cn-hangzhou-j
  3. 執行以下命令,將應用部署到叢集。

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

    kubectl get pod -o wide

    預期輸出:

    NAME                                     READY   STATUS    RESTARTS   AGE    IP               NODE                            NOMINATED NODE   READINESS GATES
    dep-node-selector-demo-b4578576b-cgpfq   1/1     Running   0          112s   192.168.xx.xxx   virtual-kubelet-cn-hangzhou-j   <none>           <none>
    dep-node-selector-demo-b4578576b-fs8kl   1/1     Running   0          110s   192.168.xx.xxx   virtual-kubelet-cn-hangzhou-j   <none>           <none>
    dep-node-selector-demo-b4578576b-nh8zm   1/1     Running   0          2m8s   192.168.xx.xxx   virtual-kubelet-cn-hangzhou-j   <none>           <none>
    dep-node-selector-demo-b4578576b-rpp8l   1/1     Running   0          2m8s   192.168.xx.xxx   virtual-kubelet-cn-hangzhou-j   <none>           <none>

    可以看到4個Pod都分布在cn-hangzhou-j可用性區域。