K8S Pod定向部署到指定節(jié)點的實現(xiàn)全過程
一、K8S Pod定向部署的技術(shù)背景與核心價值
在Kubernetes(K8S)集群管理中,默認情況下Scheduler會根據(jù)節(jié)點資源利用率、健康狀態(tài)等因素自動調(diào)度Pod,但實際生產(chǎn)與學(xué)習(xí)場景中,常需將Pod部署到指定服務(wù)器(節(jié)點),核心應(yīng)用場景與技術(shù)價值如下:
- 資源適配需求:部分應(yīng)用(如AI訓(xùn)練、大數(shù)據(jù)計算)需依賴GPU、高IO存儲等特殊硬件,需定向調(diào)度到具備對應(yīng)資源的節(jié)點;
- 業(yè)務(wù)隔離需求:核心業(yè)務(wù)(如支付服務(wù))需部署到專用節(jié)點,避免與非核心業(yè)務(wù)共享資源導(dǎo)致性能波動;
- 運維管理需求:需將Pod部署到特定機房、特定網(wǎng)段的節(jié)點,滿足網(wǎng)絡(luò)策略、數(shù)據(jù)本地化等運維規(guī)范;
- 故障排查需求:測試環(huán)境中,需將待調(diào)試Pod部署到固定節(jié)點,便于日志收集與問題定位。
該技術(shù)是K8S節(jié)點調(diào)度體系的基礎(chǔ)能力,是從“自動調(diào)度”到“可控調(diào)度”的關(guān)鍵過渡,也是DevOps工程師、K8S運維人員必須掌握的核心技能之一。
二、K8S Pod定向部署的核心技術(shù)方案
K8S提供多種機制實現(xiàn)Pod定向部署,不同方案適用于不同場景,核心技術(shù)方案分為節(jié)點標簽與選擇器(Label & Selector)、節(jié)點親和性(Node Affinity)、節(jié)點污點與容忍(Taint & Toleration) 三類,三者的適用場景與優(yōu)先級對比如下表:
| 技術(shù)方案 | 核心原理 | 適用場景 | 調(diào)度優(yōu)先級 |
|---|---|---|---|
| 節(jié)點標簽與選擇器 | 通過為節(jié)點打標簽,Pod通過nodeSelector指定標簽,僅調(diào)度到匹配標簽的節(jié)點 | 簡單、固定的定向需求(如“部署到所有GPU節(jié)點”) | 低(僅作基礎(chǔ)篩選) |
| 節(jié)點親和性 | 基于規(guī)則表達式定義Pod與節(jié)點的親和/反親和關(guān)系,支持軟策略(preferredDuringSchedulingIgnoredDuringExecution)與硬策略(requiredDuringSchedulingIgnoredDuringExecution) | 復(fù)雜、靈活的定向需求(如“優(yōu)先部署到GPU節(jié)點,無GPU節(jié)點時可部署到CPU節(jié)點”) | 中(支持策略化調(diào)度) |
| 節(jié)點污點與容忍 | 節(jié)點通過taint設(shè)置“排斥規(guī)則”,Pod需通過toleration“容忍”該規(guī)則才能被調(diào)度到節(jié)點,常用于節(jié)點專屬化(如“僅允許數(shù)據(jù)庫Pod部署到該節(jié)點”) | 節(jié)點專屬、資源獨占場景(如“GPU節(jié)點僅允許AI訓(xùn)練Pod部署”) | 高(直接控制節(jié)點訪問權(quán)限) |
三、節(jié)點標簽與選擇器(Label & Selector)實現(xiàn)定向部署
3.1 技術(shù)原理
節(jié)點標簽(Label)是K8S中用于標識節(jié)點屬性的鍵值對(如hardware=gpu、env=prod),可通過kubectl命令為節(jié)點動態(tài)添加/刪除;Pod的nodeSelector字段會指定一組標簽,Scheduler僅會將Pod調(diào)度到所有標簽完全匹配的節(jié)點上。該方案是最基礎(chǔ)、最輕量的定向部署方式,僅支持“全匹配”邏輯,無靈活策略配置。
3.2 實際應(yīng)用場景
適用于需求固定、無容錯的場景,例如:“將所有深度學(xué)習(xí)訓(xùn)練Pod(依賴GPU)部署到標簽為hardware=gpu的節(jié)點”“將測試環(huán)境Pod僅部署到標簽為env=test的節(jié)點”。
3.3 實戰(zhàn)案例與代碼
步驟1:為目標節(jié)點添加標簽
假設(shè)集群中有一個節(jié)點名為node-01,需將其標記為“GPU節(jié)點”,執(zhí)行以下命令:
# 查看集群所有節(jié)點名稱 kubectl get nodes # 為node-01添加標簽:hardware=gpu kubectl label nodes node-01 hardware=gpu # 驗證標簽是否添加成功(查看node-01的Labels字段) kubectl describe node node-01 | grep Labels
步驟2:編寫Pod yaml文件(指定nodeSelector)
創(chuàng)建gpu-pod.yaml,定義一個依賴GPU的TensorFlow Pod,通過nodeSelector定向到hardware=gpu的節(jié)點:
apiVersion: v1
kind: Pod
metadata:
name: tensorflow-gpu-pod
spec:
containers:
- name: tensorflow-container
image: tensorflow/tensorflow:latest-gpu # 依賴GPU的TensorFlow鏡像
command: ["sleep", "3600"] # 保持Pod運行1小時,便于驗證
nodeSelector: # 定向到標簽為hardware=gpu的節(jié)點
hardware: gpu
步驟3:部署Pod并驗證
# 部署Pod kubectl apply -f gpu-pod.yaml # 查看Pod調(diào)度結(jié)果(觀察NODE字段是否為node-01) kubectl get pods tensorflow-gpu-pod -o wide
步驟4:刪除節(jié)點標簽(可選)
若需取消節(jié)點的GPU標記,執(zhí)行以下命令:
kubectl label nodes node-01 hardware- # 標簽鍵后加“-”表示刪除該標簽
四、節(jié)點親和性(Node Affinity)實現(xiàn)靈活定向部署
4.1 技術(shù)原理
節(jié)點親和性是對nodeSelector的增強,支持更復(fù)雜的匹配規(guī)則(如“包含”“不包含”“存在”),且分為兩種策略:
- 硬親和性(requiredDuringSchedulingIgnoredDuringExecution):必須滿足規(guī)則才能調(diào)度(類似
nodeSelector的強制匹配,但規(guī)則更靈活); - 軟親和性(preferredDuringSchedulingIgnoredDuringExecution):優(yōu)先滿足規(guī)則,若無匹配節(jié)點則調(diào)度到其他節(jié)點(支持權(quán)重配置,權(quán)重值1-100,值越大優(yōu)先級越高)。
該方案解決了nodeSelector“僅全匹配”的局限性,適用于需要“彈性定向”的場景。
4.2 實際應(yīng)用場景
- 硬親和性:“Pod必須部署到具備
storage=ssd標簽且屬于zone=shanghai區(qū)域的節(jié)點”; - 軟親和性:“優(yōu)先將Web服務(wù)Pod部署到
env=prod且cpu=high的節(jié)點,若無則調(diào)度到其他節(jié)點”。
4.3 實戰(zhàn)案例與代碼
案例1:硬親和性(必須部署到上海區(qū)域的SSD節(jié)點)
創(chuàng)建ssd-pod-hard.yaml:
apiVersion: v1
kind: Pod
metadata:
name: ssd-pod-hard
spec:
containers:
- name: nginx-container
image: nginx:latest
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution: # 硬親和性
nodeSelectorTerms:
- matchExpressions:
- key: zone
operator: In # 匹配規(guī)則:zone的值在[shanghai]中
values:
- shanghai
- key: storage
operator: Exists # 匹配規(guī)則:節(jié)點存在storage標簽(不限制值,只要有該標簽即可)
案例2:軟親和性(優(yōu)先部署到高CPU節(jié)點,無則 fallback)
創(chuàng)建web-pod-soft.yaml,配置軟親和性權(quán)重為80(優(yōu)先級較高):
apiVersion: v1
kind: Pod
metadata:
name: web-pod-soft
spec:
containers:
- name: tomcat-container
image: tomcat:9.0
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution: # 軟親和性
- weight: 80 # 權(quán)重(1-100),值越大優(yōu)先級越高
preference:
matchExpressions:
- key: cpu
operator: In
values:
- high # 優(yōu)先匹配cpu=high的節(jié)點
部署與驗證
# 部署兩個Pod kubectl apply -f ssd-pod-hard.yaml -f web-pod-soft.yaml # 查看調(diào)度結(jié)果: # ssd-pod-hard僅會在zone=shanghai且有storage標簽的節(jié)點上運行 # web-pod-soft優(yōu)先在cpu=high節(jié)點運行,若無則在其他節(jié)點運行 kubectl get pods -o wide
五、節(jié)點污點與容忍(Taint & Toleration)實現(xiàn)節(jié)點專屬化
5.1 技術(shù)原理
節(jié)點污點(Taint)是節(jié)點對Pod的“排斥規(guī)則”,格式為key=value:effect,其中effect(作用)有三種:
- NoSchedule:僅排斥新Pod調(diào)度到該節(jié)點,已運行的Pod不受影響;
- NoExecute:排斥新Pod調(diào)度,且會驅(qū)逐已運行的、無對應(yīng)容忍的Pod;
- PreferNoSchedule:盡量排斥新Pod調(diào)度,若無其他節(jié)點可選則允許調(diào)度。
Pod的容忍(Toleration)是用于“抵消”節(jié)點污點的配置,只有具備對應(yīng)容忍的Pod才能被調(diào)度到有污點的節(jié)點。該方案常用于“節(jié)點專屬化”,例如“GPU節(jié)點僅允許AI訓(xùn)練Pod訪問”。
5.2 實際應(yīng)用場景
- 專屬節(jié)點保護:為數(shù)據(jù)庫節(jié)點添加污點,僅允許數(shù)據(jù)庫Pod通過容忍調(diào)度到該節(jié)點;
- 故障節(jié)點隔離:為故障節(jié)點添加
NoExecute污點,驅(qū)逐現(xiàn)有Pod并阻止新Pod調(diào)度,便于維護; - 資源獨占:為GPU節(jié)點添加污點,避免普通Pod占用GPU資源。
5.3 實戰(zhàn)案例與代碼
步驟1:為目標節(jié)點添加污點(GPU節(jié)點專屬)
假設(shè)node-02是GPU專屬節(jié)點,添加污點gpu-only=true:NoSchedule(僅允許有對應(yīng)容忍的Pod調(diào)度):
# 為node-02添加污點 kubectl taint nodes node-02 gpu-only=true:NoSchedule # 查看節(jié)點污點(觀察Taints字段) kubectl describe node node-02 | grep Taints
步驟2:編寫具備容忍的Pod yaml(AI訓(xùn)練Pod)
創(chuàng)建ai-training-pod.yaml,配置容忍以匹配node-02的污點:
apiVersion: v1
kind: Pod
metadata:
name: ai-training-pod
spec:
containers:
- name: pytorch-container
image: pytorch/pytorch:latest
command: ["sleep", "3600"]
tolerations: # 配置容忍,抵消節(jié)點污點
- key: "gpu-only"
operator: "Equal" # 匹配規(guī)則:key和value與污點完全一致
value: "true"
effect: "NoSchedule" # 匹配污點的effect
步驟3:驗證“無容忍Pod無法調(diào)度到污點節(jié)點”
創(chuàng)建一個無容忍的普通Pod(normal-pod.yaml):
apiVersion: v1
kind: Pod
metadata:
name: normal-pod
spec:
containers:
- name: alpine-container
image: alpine:latest
command: ["sleep", "3600"]
部署與驗證
# 部署兩個Pod kubectl apply -f ai-training-pod.yaml -f normal-pod.yaml # 查看調(diào)度結(jié)果: # ai-training-pod(有容忍)會調(diào)度到node-02 # normal-pod(無容忍)會被node-02排斥,調(diào)度到其他節(jié)點 kubectl get pods -o wide # (可選)刪除節(jié)點污點,恢復(fù)節(jié)點為普通節(jié)點 kubectl taint nodes node-02 gpu-only=true:NoSchedule-
六、三種定向部署方案的對比與選型建議
6.1 方案核心差異對比
| 對比維度 | 節(jié)點標簽與選擇器 | 節(jié)點親和性 | 節(jié)點污點與容忍 |
|---|---|---|---|
| 匹配邏輯 | 僅支持“全量標簽匹配” | 支持復(fù)雜規(guī)則(In/NotIn/Exists等) | 節(jié)點主動排斥,Pod被動容忍 |
| 策略靈活性 | 無策略(強制匹配) | 支持硬/軟策略(強制/優(yōu)先) | 支持NoSchedule/NoExecute等排斥強度 |
| 適用場景 | 簡單、固定的定向需求 | 復(fù)雜、彈性的定向需求 | 節(jié)點專屬化、資源保護 |
| 配置復(fù)雜度 | 低(僅需nodeSelector) | 中(需配置affinity規(guī)則) | 中(需同時配置節(jié)點污點與Pod容忍) |
6.2 選型建議
- 基礎(chǔ)定向需求:優(yōu)先選擇“節(jié)點標簽與選擇器”,配置簡單、性能開銷低;
- 靈活定向需求:選擇“節(jié)點親和性”,例如需要“優(yōu)先部署到A節(jié)點,無A則部署到B節(jié)點”的場景;
- 節(jié)點專屬/資源保護需求:選擇“節(jié)點污點與容忍”,例如GPU節(jié)點、數(shù)據(jù)庫節(jié)點的專屬化管理;
- 復(fù)雜場景組合:可結(jié)合多種方案,例如“污點+親和性”——先通過污點限制節(jié)點訪問,再通過親和性在允許訪問的節(jié)點中進一步篩選。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
k8s容器狀態(tài)Terminating無法刪除的問題及解決
這篇文章主要介紹了k8s容器狀態(tài)Terminating無法刪除的問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-07-07
Kubekey安裝Kubernetes-1.24.8的詳細過程
這篇文章主要介紹了Kubekey安裝Kubernetes-1.24.8的詳細過程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05
k8s如何使用NFS作為StorageClass提供動態(tài)存儲
本文主要介紹了k8s中的StorageClass,包括其定義、引入的原因、實現(xiàn)方式、定義方法以及回收策略對數(shù)據(jù)的影響等,首先,StorageClass是在K8s集群中創(chuàng)建用于動態(tài)PV的管理,可以鏈接至不同的后端存儲,對存儲的請求可以指向StorageClass2024-09-09
Hadoop 2.x與3.x 22點比較,Hadoop 3.x比2.x的改進
本文介紹了Hadoop3版本中添加的新功能,Hadoop 2和Hadoop 3的區(qū)別,在這篇文章中,我們將討論Hadoop 2.x與Hadoop 3.x之間的比較。感興趣的朋友跟隨小編一起看一下2018-09-09
Centos?8.2?升級內(nèi)核通過elrepo源的方法
這篇文章主要介紹了Centos?8.2?升級內(nèi)核通過elrepo源,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-10-10
刪除Helm使用時關(guān)于kubernetes文件的警告問題
這篇文章主要介紹了刪除Helm使用時關(guān)于kubernetes文件的警告問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11
K8S?prometheus?operator監(jiān)控工作原理介紹
這篇文章主要為大家介紹了K8S?prometheus?operator監(jiān)控工作原理介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11
Kubernetes應(yīng)用服務(wù)質(zhì)量管理詳解
這篇文章主要為大家介紹了Kubernetes應(yīng)用服務(wù)質(zhì)量管理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11

