全部產品
Search
文件中心

Container Service for Kubernetes:調度應用至指定節點池

更新時間:Sep 23, 2025

如需將特定應用調度至特定配置的節點,可以為節點池設定標籤(Labels),並為應用配置相應的 nodeSelector 或 nodeAffinity

工作原理

將 Pod 調度到指定節點池,本質是利用 Kubernetes 的原生調度機制,通過節點標籤將 Pod 匹配到節點池內的節點。流程如下。

  1. 標記節點池:節點池可用於納管一組具有相同配置的節點。為節點池配置節點標籤(Labels)後,ACK 可將標籤同步到節點池內所有節點(包括未來新擴容的節點)。

    節點池配置中勾選同步更新存量節點的汙點(Taints)及節點標籤(Labels)後,ACK會自動將節點標籤同步至節點池內的已有節點。
  2. 定義 Pod 調度規則:在 Pod YAML中通過 nodeSelector 或 nodeAffinity 指定目標節點的標籤。

  3. (可選)配置獨佔:為節點池配置Taint,確保只有添加了相應Toleration的Pod才會被調度到該節點池。

  4. 自動調度:調度器根據上述規則,自動將 Pod 調度到合格節點。

步驟一:為節點池設定標籤

支援為節點池添加自訂標籤,用於標識業務屬性、環境等,便於調度管理。

ACK 會為每個節點池自動建立一個全域唯一的標籤 alibabacloud.com/nodepool-id,可用於精確匹配節點池。
  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇節點管理 > 節點池

  3. 操作列,單擊目標節點池對應的編輯,展開進階選項地區,完成如下配置。

    • 節點標籤(Labels)

      • 鍵:格式為首碼/名稱

        • 名稱(必選):長度為1~63個字元,必須以字母數字字元[a-z0-9A-Z]開頭和結尾,中間可包含字母、數字、短劃線(-)、底線(_)、英文半形句號(.)。

        • 首碼(可選):必須為DNS子域,即由英文半形句號(.)分隔的DNS標籤,不超過253個字元,以正斜線(/)結尾。

          kubernetes.io/ 是為 Kubernetes 核心組件保留的首碼。因此,使用此命名空間時,標籤鍵必須以允許的首碼開頭:kubelet.kubernetes.io/node.kubernetes.io/

      • 值(可選):不超過63個字元,必須以字母數字字元[a-z0-9A-Z]開頭和結尾,可包含字母、數字、短劃線(-)、底線(_)和英文半形句號(.)。

    • (可選)按需選擇是否同步更新存量節點的汙點(Taints)及節點標籤(Labels)

  4. 在左側導覽列,選擇節點管理 > 節點,然後單擊標籤與汙點管理,在標籤頁簽下查看節點標籤。

步驟二:配置應用調度策略

擷取節點池標籤後,可在應用 YAML 中配置 nodeAffinitynodeSelector,將應用調度到目標節點池。

  • nodeSelector:簡單直接的節點綁定方式,通過精確匹配標籤來將 Pod 部署到特定節點上。

  • nodeAffinity:相較於 nodeSelector 更為靈活。

    • 不僅支援精確匹配,還支援 InNotInExists 等運算式。

    • 支援“軟親和性”(preferredDuringSchedulingIgnoredDuringExecution),即優先調度到滿足條件的節點,若無滿足條件的節點,也可以調度到其他節點。

  1. 建立deployment.yaml

    nodeAffinity

    nodeAffinity包含以下調度策略:

    • requiredDuringSchedulingIgnoredDuringExecution(硬親和性):Pod 必須調度到滿足條件的節點上。若無合格節點,Pod 會調度失敗並保持 Pending 狀態。

    • preferredDuringSchedulingIgnoredDuringExecution(軟親和性):調度器優先將 Pod 調度到滿足條件的節點上。如果找不到此類節點,調度器會忽略此偏好,將 Pod 調度到其他可用節點。

    以確保應用運行在帶有標籤pod: nginx的節點上為例。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-with-affinity
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          affinity:
            nodeAffinity:
              # 硬性要求:Pod 必須調度到滿足條件的節點上
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: pod         # 節點標籤的鍵
                    operator: In
                    values:
                    - nginx        # 節點標籤的值
          containers:
          - name: nginx-with-affinity
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80
            # 在生產環境中為容器聲明資源需求,以保證服務品質(QoS)
            resources:
              requests:
                cpu: "100m"
                memory: "128Mi"
              limits:
                cpu: "200m"
                memory: "256Mi"

    nodeSelector

    以確保應用始終運行在帶有標籤pod: nginx的節點上為例。

    apiVersion: apps/v1 
    kind: Deployment
    metadata:
      name: nginx-deployment-basic
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          nodeSelector:
            pod: nginx      # 指定節點必須包含此標籤,以確保 Pod 運行在目標節點上
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80
            # 在生產環境中為容器聲明資源需求,以保證服務品質(QoS)
            resources:
              requests:
                cpu: "100m"
                memory: "128Mi"
              limits:
                cpu: "200m"
                memory: "256Mi"
  2. 部署應用。

    kubectl apply -f deployment.yaml
  3. 驗證 Pod 的運行狀態及調度結果。

    添加 -o wide 參數可查看 Pod 被調度到的具體節點。
    kubectl get pods -l app=nginx -o wide

    可在輸出中查看Pod是否被調度到了目標節點。

相關文檔

  • 除通過節點池統一管理,也可以通過管理節點標籤為單個節點設定標籤,實現更精細的調度。

  • Pod出現異常,如長時間處於Pending狀態,請參見Pod異常問題排查

  • ACK提供更多靈活的調度策略,如指定不同執行個體資源的順序擴容及逆序縮容、 基於節點實際資源使用方式的負載感知調度等,請參見ACK提供的調度策略

  • 若使用硬親和性調度,當叢集中沒有滿足條件的節點時,如果存在已配置帶有相應標籤且已啟用節點伸縮的節點池,ACK會自動從該節點池擴容新節點。

  • 節點池功能推出前建立的老叢集中,可能存在未被節點池納管的游離Worker節點,請遷移游離節點至節點池