K8S Pod定向部署到指定節(jié)點(diǎn)的實(shí)現(xiàn)全過(guò)程
一、K8S Pod定向部署的技術(shù)背景與核心價(jià)值
在Kubernetes(K8S)集群管理中,默認(rèn)情況下Scheduler會(huì)根據(jù)節(jié)點(diǎn)資源利用率、健康狀態(tài)等因素自動(dòng)調(diào)度Pod,但實(shí)際生產(chǎn)與學(xué)習(xí)場(chǎng)景中,常需將Pod部署到指定服務(wù)器(節(jié)點(diǎn)),核心應(yīng)用場(chǎng)景與技術(shù)價(jià)值如下:
- 資源適配需求:部分應(yīng)用(如AI訓(xùn)練、大數(shù)據(jù)計(jì)算)需依賴(lài)GPU、高IO存儲(chǔ)等特殊硬件,需定向調(diào)度到具備對(duì)應(yīng)資源的節(jié)點(diǎn);
- 業(yè)務(wù)隔離需求:核心業(yè)務(wù)(如支付服務(wù))需部署到專(zhuān)用節(jié)點(diǎn),避免與非核心業(yè)務(wù)共享資源導(dǎo)致性能波動(dòng);
- 運(yùn)維管理需求:需將Pod部署到特定機(jī)房、特定網(wǎng)段的節(jié)點(diǎn),滿(mǎn)足網(wǎng)絡(luò)策略、數(shù)據(jù)本地化等運(yùn)維規(guī)范;
- 故障排查需求:測(cè)試環(huán)境中,需將待調(diào)試Pod部署到固定節(jié)點(diǎn),便于日志收集與問(wèn)題定位。
該技術(shù)是K8S節(jié)點(diǎn)調(diào)度體系的基礎(chǔ)能力,是從“自動(dòng)調(diào)度”到“可控調(diào)度”的關(guān)鍵過(guò)渡,也是DevOps工程師、K8S運(yùn)維人員必須掌握的核心技能之一。
二、K8S Pod定向部署的核心技術(shù)方案
K8S提供多種機(jī)制實(shí)現(xiàn)Pod定向部署,不同方案適用于不同場(chǎng)景,核心技術(shù)方案分為節(jié)點(diǎn)標(biāo)簽與選擇器(Label & Selector)、節(jié)點(diǎn)親和性(Node Affinity)、節(jié)點(diǎn)污點(diǎn)與容忍(Taint & Toleration) 三類(lèi),三者的適用場(chǎng)景與優(yōu)先級(jí)對(duì)比如下表:
| 技術(shù)方案 | 核心原理 | 適用場(chǎng)景 | 調(diào)度優(yōu)先級(jí) |
|---|---|---|---|
| 節(jié)點(diǎn)標(biāo)簽與選擇器 | 通過(guò)為節(jié)點(diǎn)打標(biāo)簽,Pod通過(guò)nodeSelector指定標(biāo)簽,僅調(diào)度到匹配標(biāo)簽的節(jié)點(diǎn) | 簡(jiǎn)單、固定的定向需求(如“部署到所有GPU節(jié)點(diǎn)”) | 低(僅作基礎(chǔ)篩選) |
| 節(jié)點(diǎn)親和性 | 基于規(guī)則表達(dá)式定義Pod與節(jié)點(diǎn)的親和/反親和關(guān)系,支持軟策略(preferredDuringSchedulingIgnoredDuringExecution)與硬策略(requiredDuringSchedulingIgnoredDuringExecution) | 復(fù)雜、靈活的定向需求(如“優(yōu)先部署到GPU節(jié)點(diǎn),無(wú)GPU節(jié)點(diǎn)時(shí)可部署到CPU節(jié)點(diǎn)”) | 中(支持策略化調(diào)度) |
| 節(jié)點(diǎn)污點(diǎn)與容忍 | 節(jié)點(diǎn)通過(guò)taint設(shè)置“排斥規(guī)則”,Pod需通過(guò)toleration“容忍”該規(guī)則才能被調(diào)度到節(jié)點(diǎn),常用于節(jié)點(diǎn)專(zhuān)屬化(如“僅允許數(shù)據(jù)庫(kù)Pod部署到該節(jié)點(diǎn)”) | 節(jié)點(diǎn)專(zhuān)屬、資源獨(dú)占場(chǎng)景(如“GPU節(jié)點(diǎn)僅允許AI訓(xùn)練Pod部署”) | 高(直接控制節(jié)點(diǎn)訪(fǎng)問(wèn)權(quán)限) |
三、節(jié)點(diǎn)標(biāo)簽與選擇器(Label & Selector)實(shí)現(xiàn)定向部署
3.1 技術(shù)原理
節(jié)點(diǎn)標(biāo)簽(Label)是K8S中用于標(biāo)識(shí)節(jié)點(diǎn)屬性的鍵值對(duì)(如hardware=gpu、env=prod),可通過(guò)kubectl命令為節(jié)點(diǎn)動(dòng)態(tài)添加/刪除;Pod的nodeSelector字段會(huì)指定一組標(biāo)簽,Scheduler僅會(huì)將Pod調(diào)度到所有標(biāo)簽完全匹配的節(jié)點(diǎn)上。該方案是最基礎(chǔ)、最輕量的定向部署方式,僅支持“全匹配”邏輯,無(wú)靈活策略配置。
3.2 實(shí)際應(yīng)用場(chǎng)景
適用于需求固定、無(wú)容錯(cuò)的場(chǎng)景,例如:“將所有深度學(xué)習(xí)訓(xùn)練Pod(依賴(lài)GPU)部署到標(biāo)簽為hardware=gpu的節(jié)點(diǎn)”“將測(cè)試環(huán)境Pod僅部署到標(biāo)簽為env=test的節(jié)點(diǎn)”。
3.3 實(shí)戰(zhàn)案例與代碼
步驟1:為目標(biāo)節(jié)點(diǎn)添加標(biāo)簽
假設(shè)集群中有一個(gè)節(jié)點(diǎn)名為node-01,需將其標(biāo)記為“GPU節(jié)點(diǎn)”,執(zhí)行以下命令:
# 查看集群所有節(jié)點(diǎn)名稱(chēng) kubectl get nodes # 為node-01添加標(biāo)簽:hardware=gpu kubectl label nodes node-01 hardware=gpu # 驗(yàn)證標(biāo)簽是否添加成功(查看node-01的Labels字段) kubectl describe node node-01 | grep Labels
步驟2:編寫(xiě)Pod yaml文件(指定nodeSelector)
創(chuàng)建gpu-pod.yaml,定義一個(gè)依賴(lài)GPU的TensorFlow Pod,通過(guò)nodeSelector定向到hardware=gpu的節(jié)點(diǎn):
apiVersion: v1
kind: Pod
metadata:
name: tensorflow-gpu-pod
spec:
containers:
- name: tensorflow-container
image: tensorflow/tensorflow:latest-gpu # 依賴(lài)GPU的TensorFlow鏡像
command: ["sleep", "3600"] # 保持Pod運(yùn)行1小時(shí),便于驗(yàn)證
nodeSelector: # 定向到標(biāo)簽為hardware=gpu的節(jié)點(diǎn)
hardware: gpu
步驟3:部署Pod并驗(yàn)證
# 部署Pod kubectl apply -f gpu-pod.yaml # 查看Pod調(diào)度結(jié)果(觀察NODE字段是否為node-01) kubectl get pods tensorflow-gpu-pod -o wide
步驟4:刪除節(jié)點(diǎn)標(biāo)簽(可選)
若需取消節(jié)點(diǎn)的GPU標(biāo)記,執(zhí)行以下命令:
kubectl label nodes node-01 hardware- # 標(biāo)簽鍵后加“-”表示刪除該標(biāo)簽
四、節(jié)點(diǎn)親和性(Node Affinity)實(shí)現(xiàn)靈活定向部署
4.1 技術(shù)原理
節(jié)點(diǎn)親和性是對(duì)nodeSelector的增強(qiáng),支持更復(fù)雜的匹配規(guī)則(如“包含”“不包含”“存在”),且分為兩種策略:
- 硬親和性(requiredDuringSchedulingIgnoredDuringExecution):必須滿(mǎn)足規(guī)則才能調(diào)度(類(lèi)似
nodeSelector的強(qiáng)制匹配,但規(guī)則更靈活); - 軟親和性(preferredDuringSchedulingIgnoredDuringExecution):優(yōu)先滿(mǎn)足規(guī)則,若無(wú)匹配節(jié)點(diǎn)則調(diào)度到其他節(jié)點(diǎn)(支持權(quán)重配置,權(quán)重值1-100,值越大優(yōu)先級(jí)越高)。
該方案解決了nodeSelector“僅全匹配”的局限性,適用于需要“彈性定向”的場(chǎng)景。
4.2 實(shí)際應(yīng)用場(chǎng)景
- 硬親和性:“Pod必須部署到具備
storage=ssd標(biāo)簽且屬于zone=shanghai區(qū)域的節(jié)點(diǎn)”; - 軟親和性:“優(yōu)先將Web服務(wù)Pod部署到
env=prod且cpu=high的節(jié)點(diǎn),若無(wú)則調(diào)度到其他節(jié)點(diǎn)”。
4.3 實(shí)戰(zhàn)案例與代碼
案例1:硬親和性(必須部署到上海區(qū)域的SSD節(jié)點(diǎn))
創(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é)點(diǎn)存在storage標(biāo)簽(不限制值,只要有該標(biāo)簽即可)
案例2:軟親和性(優(yōu)先部署到高CPU節(jié)點(diǎn),無(wú)則 fallback)
創(chuàng)建web-pod-soft.yaml,配置軟親和性權(quán)重為80(優(yōu)先級(jí)較高):
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)先級(jí)越高
preference:
matchExpressions:
- key: cpu
operator: In
values:
- high # 優(yōu)先匹配cpu=high的節(jié)點(diǎn)
部署與驗(yàn)證
# 部署兩個(gè)Pod kubectl apply -f ssd-pod-hard.yaml -f web-pod-soft.yaml # 查看調(diào)度結(jié)果: # ssd-pod-hard僅會(huì)在zone=shanghai且有storage標(biāo)簽的節(jié)點(diǎn)上運(yùn)行 # web-pod-soft優(yōu)先在cpu=high節(jié)點(diǎn)運(yùn)行,若無(wú)則在其他節(jié)點(diǎn)運(yùn)行 kubectl get pods -o wide
五、節(jié)點(diǎn)污點(diǎn)與容忍(Taint & Toleration)實(shí)現(xiàn)節(jié)點(diǎn)專(zhuān)屬化
5.1 技術(shù)原理
節(jié)點(diǎn)污點(diǎn)(Taint)是節(jié)點(diǎn)對(duì)Pod的“排斥規(guī)則”,格式為key=value:effect,其中effect(作用)有三種:
- NoSchedule:僅排斥新Pod調(diào)度到該節(jié)點(diǎn),已運(yùn)行的Pod不受影響;
- NoExecute:排斥新Pod調(diào)度,且會(huì)驅(qū)逐已運(yùn)行的、無(wú)對(duì)應(yīng)容忍的Pod;
- PreferNoSchedule:盡量排斥新Pod調(diào)度,若無(wú)其他節(jié)點(diǎn)可選則允許調(diào)度。
Pod的容忍(Toleration)是用于“抵消”節(jié)點(diǎn)污點(diǎn)的配置,只有具備對(duì)應(yīng)容忍的Pod才能被調(diào)度到有污點(diǎn)的節(jié)點(diǎn)。該方案常用于“節(jié)點(diǎn)專(zhuān)屬化”,例如“GPU節(jié)點(diǎn)僅允許AI訓(xùn)練Pod訪(fǎng)問(wèn)”。
5.2 實(shí)際應(yīng)用場(chǎng)景
- 專(zhuān)屬節(jié)點(diǎn)保護(hù):為數(shù)據(jù)庫(kù)節(jié)點(diǎn)添加污點(diǎn),僅允許數(shù)據(jù)庫(kù)Pod通過(guò)容忍調(diào)度到該節(jié)點(diǎn);
- 故障節(jié)點(diǎn)隔離:為故障節(jié)點(diǎn)添加
NoExecute污點(diǎn),驅(qū)逐現(xiàn)有Pod并阻止新Pod調(diào)度,便于維護(hù); - 資源獨(dú)占:為GPU節(jié)點(diǎn)添加污點(diǎn),避免普通Pod占用GPU資源。
5.3 實(shí)戰(zhàn)案例與代碼
步驟1:為目標(biāo)節(jié)點(diǎn)添加污點(diǎn)(GPU節(jié)點(diǎn)專(zhuān)屬)
假設(shè)node-02是GPU專(zhuān)屬節(jié)點(diǎn),添加污點(diǎn)gpu-only=true:NoSchedule(僅允許有對(duì)應(yīng)容忍的Pod調(diào)度):
# 為node-02添加污點(diǎn) kubectl taint nodes node-02 gpu-only=true:NoSchedule # 查看節(jié)點(diǎn)污點(diǎn)(觀察Taints字段) kubectl describe node node-02 | grep Taints
步驟2:編寫(xiě)具備容忍的Pod yaml(AI訓(xùn)練Pod)
創(chuàng)建ai-training-pod.yaml,配置容忍以匹配node-02的污點(diǎn):
apiVersion: v1
kind: Pod
metadata:
name: ai-training-pod
spec:
containers:
- name: pytorch-container
image: pytorch/pytorch:latest
command: ["sleep", "3600"]
tolerations: # 配置容忍,抵消節(jié)點(diǎn)污點(diǎn)
- key: "gpu-only"
operator: "Equal" # 匹配規(guī)則:key和value與污點(diǎn)完全一致
value: "true"
effect: "NoSchedule" # 匹配污點(diǎn)的effect
步驟3:驗(yàn)證“無(wú)容忍Pod無(wú)法調(diào)度到污點(diǎn)節(jié)點(diǎn)”
創(chuàng)建一個(gè)無(wú)容忍的普通Pod(normal-pod.yaml):
apiVersion: v1
kind: Pod
metadata:
name: normal-pod
spec:
containers:
- name: alpine-container
image: alpine:latest
command: ["sleep", "3600"]
部署與驗(yàn)證
# 部署兩個(gè)Pod kubectl apply -f ai-training-pod.yaml -f normal-pod.yaml # 查看調(diào)度結(jié)果: # ai-training-pod(有容忍)會(huì)調(diào)度到node-02 # normal-pod(無(wú)容忍)會(huì)被node-02排斥,調(diào)度到其他節(jié)點(diǎn) kubectl get pods -o wide # (可選)刪除節(jié)點(diǎn)污點(diǎn),恢復(fù)節(jié)點(diǎn)為普通節(jié)點(diǎn) kubectl taint nodes node-02 gpu-only=true:NoSchedule-
六、三種定向部署方案的對(duì)比與選型建議
6.1 方案核心差異對(duì)比
| 對(duì)比維度 | 節(jié)點(diǎn)標(biāo)簽與選擇器 | 節(jié)點(diǎn)親和性 | 節(jié)點(diǎn)污點(diǎn)與容忍 |
|---|---|---|---|
| 匹配邏輯 | 僅支持“全量標(biāo)簽匹配” | 支持復(fù)雜規(guī)則(In/NotIn/Exists等) | 節(jié)點(diǎn)主動(dòng)排斥,Pod被動(dòng)容忍 |
| 策略靈活性 | 無(wú)策略(強(qiáng)制匹配) | 支持硬/軟策略(強(qiáng)制/優(yōu)先) | 支持NoSchedule/NoExecute等排斥強(qiáng)度 |
| 適用場(chǎng)景 | 簡(jiǎn)單、固定的定向需求 | 復(fù)雜、彈性的定向需求 | 節(jié)點(diǎn)專(zhuān)屬化、資源保護(hù) |
| 配置復(fù)雜度 | 低(僅需nodeSelector) | 中(需配置affinity規(guī)則) | 中(需同時(shí)配置節(jié)點(diǎn)污點(diǎn)與Pod容忍) |
6.2 選型建議
- 基礎(chǔ)定向需求:優(yōu)先選擇“節(jié)點(diǎn)標(biāo)簽與選擇器”,配置簡(jiǎn)單、性能開(kāi)銷(xiāo)低;
- 靈活定向需求:選擇“節(jié)點(diǎn)親和性”,例如需要“優(yōu)先部署到A節(jié)點(diǎn),無(wú)A則部署到B節(jié)點(diǎn)”的場(chǎng)景;
- 節(jié)點(diǎn)專(zhuān)屬/資源保護(hù)需求:選擇“節(jié)點(diǎn)污點(diǎn)與容忍”,例如GPU節(jié)點(diǎn)、數(shù)據(jù)庫(kù)節(jié)點(diǎn)的專(zhuān)屬化管理;
- 復(fù)雜場(chǎng)景組合:可結(jié)合多種方案,例如“污點(diǎn)+親和性”——先通過(guò)污點(diǎn)限制節(jié)點(diǎn)訪(fǎng)問(wèn),再通過(guò)親和性在允許訪(fǎng)問(wèn)的節(jié)點(diǎn)中進(jìn)一步篩選。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
K8S環(huán)境中Containerd運(yùn)行時(shí)占用文件定位安全清理方法
容器運(yùn)行時(shí)是Kubernetes最重要的組件之一,負(fù)責(zé)管理鏡像和容器的生命周期,這篇文章主要介紹了K8S環(huán)境中Containerd運(yùn)行時(shí)占用文件定位安全清理方法的相關(guān)資料,需要的朋友可以參考下2026-04-04
阿里云oss對(duì)象存儲(chǔ)使用詳細(xì)步驟
本文主要介紹了阿里云oss對(duì)象存儲(chǔ)使用詳細(xì)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
K8s?ConfigMaps與Secret實(shí)現(xiàn)配置分離過(guò)程
本文介紹Kubernetes中ConfigMaps和Secret的創(chuàng)建方式及應(yīng)用,涵蓋文件、literal、YAML方法,強(qiáng)調(diào)命名空間匹配與鍵名大小寫(xiě)一致性,Secret類(lèi)型如Opaque、dockerconfigjson用于加密配置,熱更新需注意envFrom等參數(shù)限制2025-08-08
K8s學(xué)習(xí)之Pod的定義及詳細(xì)資源調(diào)用案例
Kubernetes將所有內(nèi)容抽象為資源,通過(guò)操作資源管理集群,核心單元是Pod,通過(guò)控制器管理Pod,資源管理分為命令式對(duì)象管理、命令式對(duì)象配置和聲明式對(duì)象配置,各有適用場(chǎng)景,需要的朋友可以參考下2024-09-09
舉例詳解k8s是如何實(shí)現(xiàn)自動(dòng)擴(kuò)縮的
Kubernetes(簡(jiǎn)稱(chēng)k8s)是一個(gè)開(kāi)源的,用于自動(dòng)部署、擴(kuò)展和管理容器化應(yīng)用程序的系統(tǒng),這篇文章主要介紹了k8s是如何實(shí)現(xiàn)自動(dòng)擴(kuò)縮的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-07-07
K8s環(huán)境內(nèi)部的服務(wù)如何注冊(cè)到外部
文章主要討論了在K8s環(huán)境外部部署服務(wù)時(shí)如何與部署在K8s內(nèi)部的服務(wù)進(jìn)行服務(wù)注冊(cè),提出了使用LoadBalancer、Kong和NodePort三種方式,并詳細(xì)介紹了每種方式的實(shí)現(xiàn)步驟和注意事項(xiàng)2026-02-02
最新青龍面板2.10.2搭建+XDD-PLUS的保姆級(jí)教程
這篇文章主要介紹了最新青龍面板2.10.2搭建+XDD-PLUS的保姆級(jí)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05

