如需將特定應用調度至特定配置的節點,可以為節點池設定標籤(Labels),並為應用配置相應的 nodeSelector 或 nodeAffinity。
工作原理
將 Pod 調度到指定節點池,本質是利用 Kubernetes 的原生調度機制,通過節點標籤將 Pod 匹配到節點池內的節點。流程如下。
標記節點池:節點池可用於納管一組具有相同配置的節點。為節點池配置節點標籤(Labels)後,ACK 可將標籤同步到節點池內所有節點(包括未來新擴容的節點)。
在節點池配置中勾選同步更新存量節點的汙點(Taints)及節點標籤(Labels)後,ACK會自動將節點標籤同步至節點池內的已有節點。
定義 Pod 調度規則:在 Pod YAML中通過
nodeSelector或nodeAffinity指定目標節點的標籤。(可選)配置獨佔:為節點池配置Taint,確保只有添加了相應Toleration的Pod才會被調度到該節點池。
自動調度:調度器根據上述規則,自動將 Pod 調度到合格節點。
步驟一:為節點池設定標籤
支援為節點池添加自訂標籤,用於標識業務屬性、環境等,便於調度管理。
ACK 會為每個節點池自動建立一個全域唯一的標籤 alibabacloud.com/nodepool-id,可用於精確匹配節點池。登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在操作列,單擊目標節點池對應的編輯,展開進階選項地區,完成如下配置。
節點標籤(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)。
在左側導覽列,選擇,然後單擊標籤與汙點管理,在標籤頁簽下查看節點標籤。
步驟二:配置應用調度策略
擷取節點池標籤後,可在應用 YAML 中配置 nodeAffinity 或nodeSelector,將應用調度到目標節點池。
nodeSelector:簡單直接的節點綁定方式,通過精確匹配標籤來將 Pod 部署到特定節點上。nodeAffinity:相較於nodeSelector更為靈活。不僅支援精確匹配,還支援
In、NotIn、Exists等運算式。支援“軟親和性”(
preferredDuringSchedulingIgnoredDuringExecution),即優先調度到滿足條件的節點,若無滿足條件的節點,也可以調度到其他節點。
建立
deployment.yaml。nodeAffinitynodeAffinity包含以下調度策略: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"部署應用。
kubectl apply -f deployment.yaml驗證 Pod 的運行狀態及調度結果。
添加
-o wide參數可查看 Pod 被調度到的具體節點。kubectl get pods -l app=nginx -o wide可在輸出中查看Pod是否被調度到了目標節點。
相關文檔
除通過節點池統一管理,也可以通過管理節點標籤為單個節點設定標籤,實現更精細的調度。
Pod出現異常,如長時間處於Pending狀態,請參見Pod異常問題排查。
ACK提供更多靈活的調度策略,如指定不同執行個體資源的順序擴容及逆序縮容、 基於節點實際資源使用方式的負載感知調度等,請參見ACK提供的調度策略。
若使用硬親和性調度,當叢集中沒有滿足條件的節點時,如果存在已配置帶有相應標籤且已啟用節點伸縮的節點池,ACK會自動從該節點池擴容新節點。
節點池功能推出前建立的老叢集中,可能存在未被節點池納管的游離Worker節點,請遷移游離節點至節點池。