場景與目標
- 集群節點:master(4 核)、node1(16 核)、node2(16 核)。
- 目標:將一個高 CPU 消耗的工作負載橫向擴展到 4 個實例,并通過**節點親和性(軟親和)**確保 Pod 優先調度到 node1、node2(CPU 更充足)。
- 已完成:node1/node2 已打標簽 cpu-tier=high。
參考:Kubernetes 官方節點親和文檔(支持首選型 preferred、權重 1–100)、Kuboard 親和性教程(節點親和的概念與寫法)、以及中文教程對軟/硬親和的區分說明。
配置思路(為什么選“軟親和”)
- 軟親和(preferredDuringSchedulingIgnoredDuringExecution):調度器會為滿足規則的節點打分(可設定權重 1–100),盡量將 Pod 放到匹配節點(cpu-tier=high);若資源不足,仍可回退到其他節點,避免擴容/滾更卡在 Pending。
- 與 硬親和(required…) 相比,軟親和更利于彈性與可用性,減少因“條件太硬”而導致的調度失敗。
節點標簽(確認)
當前節點標簽示例(你已完成):
# 已有:為 16 核節點打上高 CPU 標簽
kubectl label node node1 cpu-tier=high --overwrite=true
kubectl label node node2 cpu-tier=high --overwrite=true
節點親和是基于節點標簽實現的,preferred規則通過標簽匹配給節點“加分”。
部署清單中的關鍵修改(僅節點軟親和)
在 Deployment 的 spec.template.spec 下添加 nodeAffinity(preferred),示例片段如下(可直接粘貼):
affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 100preference:matchExpressions:- key: cpu-tieroperator: Invalues:- high
weight: 100 表示強烈偏好匹配該表達式的節點;調度器按規則累積分值進行優先選擇。
一條命令合并補丁(不改其他字段)
將現有工作負載(以 prod/device 為例)打上節點軟親和,并把副本數擴到 4:
kubectl -n prod patch deploy device --type='merge' -p '
{"spec": {"replicas": 4,"template": {"spec": {"affinity": {"nodeAffinity": {"preferredDuringSchedulingIgnoredDuringExecution": [{"weight": 100,"preference": {"matchExpressions": [{ "key": "cpu-tier", "operator": "In", "values": ["high"] }]}}]}}}}}
}'
“首選型(preferred)”親和規則在滿足條件的節點上加分,確保優先調度到 node1/node2;當沒有可用資源時,調度器仍會將 Pod 放到其它節點,以保障發布成功。
驗證與觀測
- 查看分布與所在節點
kubectl -n prod get pod -l k8s.kuboard.cn/name=device -o wide
- 查看調度事件與親和匹配
kubectl -n prod describe pod <pod-name> | sed -n '1,120p'
觀察 Node:、Events 中的調度決策與親和性評估信息。
官方文檔:節點親和任務指南、概念詳解。
推薦的配套優化(可選)
- 聲明資源請求/限制:為高 CPU 負載容器設置 resources.requests.cpu、resources.limits.cpu,幫助調度器更準確評估可用余量,從而更傾向于選擇 16 核節點。
- 控制平面隔離:通常 master/control-plane 節點帶 NoSchedule 污點,業務 Pod 不會被調度到該節點;如曾清除,可按需恢復污點以保持隔離(此項與“軟親和”互補)。
- (若想進一步均衡)拓撲分布約束:在軟親和基礎上,你也可以為副本增加 topologySpreadConstraints,讓 4 個副本在 node1/node2 之間盡量均勻(如目標 2+2),但本次你要求“僅節點軟親和”,可暫不啟用。
參考資料
Kubernetes 官方文檔:Assign Pods to Nodes using Node Affinity(含 preferred/required 與權重說明)。
Kuboard 教程:親和性與反親和性(節點親和的概念與示例)。
中文教程:親和力軟/硬的對比與說明。
CSDN:Kubernetes 進階之容器組(Pod)(包含資源 requests/limits 的清單說明,可用于配合調度)。