全部產品
Search
文件中心

Container Compute Service:節點親和性調度

更新時間:Mar 22, 2025

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或以上。

注意事項

nodeSelector

nodeSelector中可以直接指定虛擬節點中的標籤,來實現節點親和性調度。針對不同種類的虛擬節點,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

alibabacloud.com/gpu-model-series

GPU型號

alibabacloud.com/gpu-model-series: <example-model>

nodeAffinity

nodeAffinity同樣可以聲明節點的親和性屬性,但其文法表達能力更強,對於不同的計算類型,ACS在具體欄位上存在以下約束。

計算類型

協議欄位

含義

約束條件

  • GPU型

  • 高效能網路GPU型

requiredDuringSchedulingIgnoredDuringExecution

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

nodeSelectorTerms欄位中:

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

  • 不支援填寫matchFields。

preferredDuringSchedulingIgnoredDuringExecution

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

不支援。

對於通用型和效能型執行個體,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可用性區域。