Kubernetes調(diào)度機(jī)制與策略實(shí)驗(yàn)詳解
實(shí)驗(yàn)?zāi)康?/h2>
通過(guò)實(shí)際操作,理解 Kubernetes 調(diào)度機(jī)制的核心原理和常用調(diào)度策略的配置方法,包括節(jié)點(diǎn)選擇、親和性與反親和性、污點(diǎn)與容忍等。
實(shí)驗(yàn)環(huán)境
- Kubernetes 集群(至少包含一個(gè) Master 節(jié)點(diǎn)和兩個(gè) Worker 節(jié)點(diǎn))。
- kubectl 命令行工具。
- Docker 鏡像(如
nginx或其他簡(jiǎn)單應(yīng)用鏡像)。
實(shí)驗(yàn)步驟
步驟 1:查看集群節(jié)點(diǎn)信息
目的:了解集群中可用的節(jié)點(diǎn)及其狀態(tài)。
kubectl get nodes -o wide
輸出示例:
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME k8s-master Ready control-plane 1d v1.28.0 192.168.1.10 <none> Ubuntu 22.04 5.15.0-46-generic docker://20.10.12 k8s-node1 Ready <none> 1d v1.28.0 192.168.1.11 <none> Ubuntu 22.04 5.15.0-46-generic docker://20.10.12 k8s-node2 Ready <none> 1d v1.28.0 192.168.1.12 <none> Ubuntu 22.04 5.15.0-46-generic docker://20.10.12
說(shuō)明:確保所有節(jié)點(diǎn)狀態(tài)為 Ready,表示集群正常運(yùn)行。
步驟 2:使用nodeName調(diào)度 Pod
目的:理解 nodeName 的作用,即直接指定 Pod 調(diào)度到特定節(jié)點(diǎn)。
創(chuàng)建 Pod 配置文件 (pod-nodeName.yaml):
apiVersion: v1
kind: Pod
metadata:
name: pod-node1
spec:
nodeName: k8s-node1
containers:
- name: nginx
image: nginx應(yīng)用配置文件:
kubectl apply -f pod-nodeName.yaml
驗(yàn)證 Pod 是否運(yùn)行在指定節(jié)點(diǎn):
kubectl get pods -o wide
輸出示例:

說(shuō)明:nodeName 是最簡(jiǎn)單的調(diào)度方式,適用于調(diào)試或測(cè)試場(chǎng)景。
步驟 3:使用nodeSelector調(diào)度 Pod
目的:理解 nodeSelector 的作用,即通過(guò)節(jié)點(diǎn)標(biāo)簽選擇目標(biāo)節(jié)點(diǎn)。
為節(jié)點(diǎn)添加標(biāo)簽:
kubectl label nodes k8s-node1 disk=ssd kubectl label nodes k8s-node2 disk=hdd
創(chuàng)建 Pod 配置文件 (pod-nodeSelector.yaml):
apiVersion: v1
kind: Pod
metadata:
name: pod-ssd
spec:
nodeSelector:
disk: ssd
containers:
- name: nginx
image: nginx應(yīng)用配置文件:
kubectl apply -f pod-nodeSelector.yaml
驗(yàn)證 Pod 是否運(yùn)行在帶有指定標(biāo)簽的節(jié)點(diǎn):
kubectl get pods -o wide
輸出示例:

說(shuō)明:nodeSelector 是基于節(jié)點(diǎn)標(biāo)簽的調(diào)度方式,適用于根據(jù)節(jié)點(diǎn)特性(如硬件類型)進(jìn)行調(diào)度。
步驟 4:使用節(jié)點(diǎn)親和性(nodeAffinity)調(diào)度 Pod
目的:理解節(jié)點(diǎn)親和性的作用,即通過(guò)復(fù)雜的標(biāo)簽匹配規(guī)則選擇目標(biāo)節(jié)點(diǎn)。
kubectl label pod pod-node-affinity role=frontend
創(chuàng)建 Pod 配置文件 (pod-nodeAffinity.yaml):
這個(gè)配置文件的目的是創(chuàng)建一個(gè)名為 pod-node-affinity 的 Pod,并通過(guò)節(jié)點(diǎn)親和性規(guī)則將它調(diào)度到帶有 disk=ssd 標(biāo)簽的節(jié)點(diǎn)上
apiVersion: v1 # 指定 Kubernetes API 的版本,這里使用的是 v1 版本。
kind: Pod # 指定資源類型,這里是 Pod。
metadata: # 定義 Pod 的元數(shù)據(jù),包括名稱、標(biāo)簽等。
name: pod-node-affinity # Pod 的名稱,用于標(biāo)識(shí)這個(gè) Pod。
spec: # 定義 Pod 的規(guī)格,包括調(diào)度策略和容器配置。
affinity: # 定義 Pod 的親和性規(guī)則,用于控制調(diào)度行為。
nodeAffinity: # 節(jié)點(diǎn)親和性規(guī)則,用于根據(jù)節(jié)點(diǎn)的標(biāo)簽選擇目標(biāo)節(jié)點(diǎn)。
requiredDuringSchedulingIgnoredDuringExecution: # 必須滿足的節(jié)點(diǎn)親和性約束。
nodeSelectorTerms: # 定義節(jié)點(diǎn)選擇條件的列表,調(diào)度器會(huì)檢查這些條件。
- matchExpressions: # 定義匹配表達(dá)式,用于匹配節(jié)點(diǎn)標(biāo)簽。
- key: disk # 節(jié)點(diǎn)標(biāo)簽的鍵,這里匹配節(jié)點(diǎn)的 "disk" 標(biāo)簽。
operator: In # 操作符,表示 "包含在",即節(jié)點(diǎn)的 "disk" 標(biāo)簽值必須在 values 列表中。
values: # 定義允許的標(biāo)簽值列表。
- ssd # 允許的標(biāo)簽值之一,表示節(jié)點(diǎn)的 "disk" 標(biāo)簽值為 "ssd"。
containers: # 定義 Pod 中的容器列表。
- name: nginx # 容器的名稱,這里是 "nginx"。
image: nginx # 容器使用的鏡像,這里是官方的 nginx 鏡像。應(yīng)用配置文件:
kubectl apply -f pod-nodeAffinity.yaml
驗(yàn)證 Pod 是否運(yùn)行在符合條件的節(jié)點(diǎn):
kubectl get pods -o wide
- 輸出示例:

說(shuō)明:節(jié)點(diǎn)親和性比 nodeSelector 更靈活,支持復(fù)雜的匹配規(guī)則。
步驟 5:使用 Pod 親和性與反親和性調(diào)度 Pod
目的:理解 Pod 親和性與反親和性的作用,即通過(guò) Pod 標(biāo)簽選擇調(diào)度位置。
kubectl label pod pod-node-affinity role=frontend
創(chuàng)建帶有親和性的 Pod 配置文件 (pod-affinity.yaml):
這個(gè)配置文件的目的是創(chuàng)建一個(gè)名為 pod-affinity 的 Pod,并通過(guò) Pod 親和性 規(guī)則將它調(diào)度到與已存在的、帶有 role=frontend 標(biāo)簽的 Pod 相同的節(jié)點(diǎn)上。
關(guān)鍵點(diǎn)解釋
apiVersion: v1 # 指定 Kubernetes API 的版本,這里使用的是 v1 版本。
kind: Pod # 指定資源類型為 Pod。
metadata: # 定義 Pod 的元數(shù)據(jù)。
name: pod-affinity # Pod 的名稱,用于標(biāo)識(shí)這個(gè) Pod。
labels: # Pod 的標(biāo)簽,用于標(biāo)識(shí) Pod 的角色或其他屬性。
role: frontend # 定義一個(gè)標(biāo)簽,鍵為 "role",值為 "frontend"。
spec: # 定義 Pod 的規(guī)格,包括調(diào)度策略和容器配置。
affinity: # 定義 Pod 的親和性規(guī)則。
podAffinity: # 定義 Pod 親和性規(guī)則,用于根據(jù)其他 Pod 的標(biāo)簽選擇調(diào)度位置。
requiredDuringSchedulingIgnoredDuringExecution: # 必須滿足的 Pod 親和性約束。
- labelSelector: # 定義用于選擇目標(biāo) Pod 的標(biāo)簽選擇器。
matchExpressions: # 定義匹配表達(dá)式,用于匹配目標(biāo) Pod 的標(biāo)簽。
- key: role # 目標(biāo) Pod 的標(biāo)簽鍵,這里匹配 "role" 標(biāo)簽。
operator: In # 操作符,表示 "包含在",即目標(biāo) Pod 的 "role" 標(biāo)簽值必須在 values 列表中。
values: # 定義允許的標(biāo)簽值列表。
- frontend # 允許的標(biāo)簽值之一,表示目標(biāo) Pod 的 "role" 標(biāo)簽值為 "frontend"。
topologyKey: kubernetes.io/hostname # 定義親和性約束的拓?fù)溆?,這里是節(jié)點(diǎn)的主機(jī)名。
containers: # 定義 Pod 中的容器列表。
- name: nginx # 容器的名稱,這里是 "nginx"。
image: nginx # 容器使用的鏡像,這里是官方的 nginx 鏡像。創(chuàng)建帶有反親和性的 Pod 配置文件 (pod-antiAffinity.yaml):
這個(gè)配置文件的目的是創(chuàng)建一個(gè)名為 pod-anti-affinity 的 Pod,并通過(guò) Pod 反親和性 規(guī)則將其調(diào)度到與帶有 role=frontend 標(biāo)簽的 Pod 不同 的節(jié)點(diǎn)上。
apiVersion: v1 # 指定使用的 Kubernetes API 版本為 v1。
kind: Pod # 指定資源類型為 Pod。
metadata: # 定義 Pod 的元數(shù)據(jù),包括名稱和標(biāo)簽。
name: pod-anti-affinity # Pod 的名稱,用于標(biāo)識(shí)這個(gè) Pod。
labels: # 定義 Pod 的標(biāo)簽。
role: backend # 為 Pod 添加一個(gè)標(biāo)簽,鍵為 "role",值為 "backend"。
spec: # 定義 Pod 的規(guī)格,包括容器配置和調(diào)度策略。
affinity: # 定義 Pod 的親和性規(guī)則。
podAntiAffinity: # 定義 Pod 的反親和性規(guī)則。
requiredDuringSchedulingIgnoredDuringExecution: # 定義必須滿足的反親和性約束。
- labelSelector: # 定義用于選擇目標(biāo) Pod 的標(biāo)簽選擇器。
matchExpressions: # 定義匹配表達(dá)式,用于匹配目標(biāo) Pod 的標(biāo)簽。
- key: role # 目標(biāo) Pod 的標(biāo)簽鍵,這里匹配 "role" 標(biāo)簽。
operator: In # 操作符,表示 "包含在",即目標(biāo) Pod 的 "role" 標(biāo)簽值必須在 values 列表中。
values: # 定義允許的標(biāo)簽值列表。
- frontend # 允許的標(biāo)簽值之一,表示目標(biāo) Pod 的 "role" 標(biāo)簽值為 "frontend"。
topologyKey: kubernetes.io/hostname # 定義反親和性約束的拓?fù)溆?,這里是節(jié)點(diǎn)的主機(jī)名。
containers: # 定義 Pod 中的容器列表。
- name: nginx # 定義容器的名稱,這里是 "nginx"。
image: nginx # 定義容器使用的鏡像,這里是官方的 nginx 鏡像。應(yīng)用配置文件:
kubectl apply -f pod-affinity.yaml kubectl apply -f pod-antiAffinity.yaml
驗(yàn)證 Pod 是否運(yùn)行在符合條件的位置:
kubectl get pods -o wide
輸出示例:

說(shuō)明:Pod 親和性用于將 Pod 調(diào)度到與指定 Pod 相同的節(jié)點(diǎn),而 Pod 反親和性用于避免將 Pod 調(diào)度到與指定 Pod 相同的節(jié)點(diǎn)。
步驟 6:使用污點(diǎn)與容忍調(diào)度 Pod
目的:理解污點(diǎn)與容忍的作用,即通過(guò)節(jié)點(diǎn)上的污點(diǎn)限制 Pod 調(diào)度,并通過(guò)容忍允許 Pod 調(diào)度到帶有特定污點(diǎn)的節(jié)點(diǎn)。
為節(jié)點(diǎn)添加污點(diǎn):
kubectl taint nodes k8s-node1 special=true:NoSchedule
創(chuàng)建帶有容忍的 Pod 配置文件 (pod-tolerations.yaml):
這個(gè)配置文件的目的是創(chuàng)建一個(gè)名為 pod-tolerations 的 Pod,并通過(guò) 容忍(Tolerations) 規(guī)則使其能夠被調(diào)度到帶有特定污點(diǎn)(special=true:NoSchedule)的節(jié)點(diǎn)上。
apiVersion: v1 # 指定 Kubernetes API 的版本,這里使用的是 v1。
kind: Pod # 指定資源類型為 Pod。
metadata: # 定義 Pod 的元數(shù)據(jù)。
name: pod-tolerations # Pod 的名稱,用于標(biāo)識(shí)這個(gè) Pod。
spec: # 定義 Pod 的規(guī)格,包括容器配置和調(diào)度策略。
containers: # 定義 Pod 中的容器列表。
- name: nginx # 容器的名稱,這里是 "nginx"。
image: nginx # 容器使用的鏡像,這里是官方的 nginx 鏡像。
tolerations: # 定義 Pod 的容忍(Tolerations)規(guī)則。
- key: "special" # 容忍的鍵,表示節(jié)點(diǎn)上污點(diǎn)的鍵。
operator: "Equal" # 操作符,表示容忍的條件是鍵值對(duì)相等。
value: "true" # 容忍的值,表示節(jié)點(diǎn)上污點(diǎn)的值。
effect: "NoSchedule" # 容忍的效果,表示容忍節(jié)點(diǎn)上的 "NoSchedule" 污點(diǎn)。應(yīng)用配置文件:
kubectl apply -f pod-tolerations.yaml
驗(yàn)證 Pod 是否運(yùn)行在帶有污點(diǎn)的節(jié)點(diǎn):
kubectl get pods -o wide
輸出示例:

說(shuō)明:污點(diǎn)與容忍用于實(shí)現(xiàn)靈活的調(diào)度策略,例如隔離特殊節(jié)點(diǎn)或允許 Pod 調(diào)度到帶有特定污點(diǎn)的節(jié)點(diǎn)。
步驟 7:使用調(diào)度優(yōu)先級(jí)(Priority Classes)調(diào)度 Pod
目的:理解調(diào)度優(yōu)先級(jí)的作用,即為 Pod 分配優(yōu)先級(jí),高優(yōu)先級(jí)的 Pod 優(yōu)先調(diào)度。
創(chuàng)建優(yōu)先級(jí)類 (priority-class.yaml):
這個(gè)配置文件的目的是創(chuàng)建一個(gè)名為 high-priority 的 優(yōu)先級(jí)類(PriorityClass),其優(yōu)先級(jí)值為 1000000。
優(yōu)先級(jí)類用于定義 Pod 的調(diào)度優(yōu)先級(jí),調(diào)度器會(huì)根據(jù) Pod 的優(yōu)先級(jí)來(lái)決定調(diào)度順序
apiVersion: scheduling.k8s.io/v1 # 指定使用的 Kubernetes API 版本,這里使用的是 scheduling.k8s.io/v1,適用于優(yōu)先級(jí)類。 kind: PriorityClass # 指定資源類型為 PriorityClass,用于定義 Pod 的優(yōu)先級(jí)。 metadata: # 定義優(yōu)先級(jí)類的元數(shù)據(jù)。 name: high-priority # 優(yōu)先級(jí)類的名稱,用于標(biāo)識(shí)這個(gè)優(yōu)先級(jí)類。 value: 1000000 # 定義優(yōu)先級(jí)的數(shù)值,數(shù)值越大,優(yōu)先級(jí)越高。這里設(shè)置為 1000000,表示這是一個(gè)高優(yōu)先級(jí)。
應(yīng)用優(yōu)先級(jí)類:
kubectl apply -f priority-class.yaml
創(chuàng)建帶有高優(yōu)先級(jí)的 Pod 配置文件 (pod-priority.yaml):
這個(gè)配置文件的目的是創(chuàng)建一個(gè)名為 pod-priority 的 Pod,并為其設(shè)置一個(gè)高優(yōu)先級(jí)。調(diào)度器在調(diào)度 Pod 時(shí)會(huì)根據(jù)其優(yōu)先級(jí)進(jìn)行排序,優(yōu)先級(jí)高的 Pod 會(huì)優(yōu)先調(diào)度。如果集群資源有限,高優(yōu)先級(jí)的 Pod 甚至可以搶占低優(yōu)先級(jí)的 Pod。
apiVersion: v1 # 指定 Kubernetes API 的版本,這里使用的是 v1,適用于 Pod 資源。
kind: Pod # 指定資源類型為 Pod,即 Kubernetes 中的最小部署單元。
metadata: # 定義 Pod 的元數(shù)據(jù),包括名稱和其他標(biāo)識(shí)信息。
name: pod-priority # Pod 的名稱,用于標(biāo)識(shí)這個(gè) Pod。在同一個(gè)命名空間中,Pod 的名稱必須是唯一的。
spec: # 定義 Pod 的規(guī)格,包括容器配置和調(diào)度策略。
priorityClassName: high-priority # 引用一個(gè)名為 "high-priority" 的優(yōu)先級(jí)類(PriorityClass)。
# 這個(gè)優(yōu)先級(jí)類必須已經(jīng)存在于集群中,否則 Pod 無(wú)法正常調(diào)度。
# 優(yōu)先級(jí)類定義了 Pod 的調(diào)度優(yōu)先級(jí),數(shù)值越高,優(yōu)先級(jí)越高。
containers: # 定義 Pod 中的容器列表,一個(gè) Pod 可以包含一個(gè)或多個(gè)容器。
- name: nginx # 定義容器的名稱,這里是 "nginx"。
image: nginx # 定義容器使用的鏡像,這里是官方的 nginx 鏡像。應(yīng)用配置文件:
kubectl apply -f pod-priority.yaml
驗(yàn)證 Pod 是否優(yōu)先調(diào)度:
kubectl get pods -o wide
輸出示例:

說(shuō)明:調(diào)度優(yōu)先級(jí)允許為 Pod 分配優(yōu)先級(jí),高優(yōu)先級(jí)的 Pod 會(huì)優(yōu)先調(diào)度。
步驟 8:清理實(shí)驗(yàn)環(huán)境
目的:清理實(shí)驗(yàn)中創(chuàng)建的資源,恢復(fù)集群的初始狀態(tài)。
刪除創(chuàng)建的 Pod:
kubectl delete pod pod-node1 pod-ssd pod-node-affinity pod-anti-affinity pod-tolerations pod-priority
刪除優(yōu)先級(jí)類:
kubectl delete priorityclass high-priority
刪除節(jié)點(diǎn)標(biāo)簽和污點(diǎn):
kubectl label nodes k8s-node1 disk- kubectl label nodes k8s-node2 disk- kubectl taint nodes k8s-node1 special:NoSchedule-
實(shí)驗(yàn)總結(jié)
通過(guò)以上實(shí)驗(yàn),我們?cè)敿?xì)驗(yàn)證了 Kubernetes 調(diào)度機(jī)制的核心原理和常用調(diào)度策略的實(shí)際應(yīng)用。以下是關(guān)鍵知識(shí)點(diǎn)的總結(jié):
調(diào)度器的作用:將 Pod 分配到合適的節(jié)點(diǎn),確保資源合理利用和應(yīng)用高可用性。
調(diào)度方法:
- nodeName:直接指定節(jié)點(diǎn),適用于調(diào)試或測(cè)試。
- nodeSelector:通過(guò)節(jié)點(diǎn)標(biāo)簽選擇目標(biāo)節(jié)點(diǎn),適用于根據(jù)硬件類型或地理位置調(diào)度。
- 節(jié)點(diǎn)親和性(nodeAffinity):支持復(fù)雜的標(biāo)簽匹配規(guī)則,更靈活。
- Pod 親和性與反親和性(podAffinity/podAntiAffinity):根據(jù) Pod 標(biāo)簽選擇調(diào)度位置。
- 污點(diǎn)與容忍(Taints & Tolerations):通過(guò)污點(diǎn)限制調(diào)度,并通過(guò)容忍允許調(diào)度到帶有特定污點(diǎn)的節(jié)點(diǎn)。
- 調(diào)度優(yōu)先級(jí)(Priority Classes):為 Pod 分配優(yōu)先級(jí),高優(yōu)先級(jí)的 Pod 優(yōu)先調(diào)度。
- 調(diào)度器優(yōu)化:通過(guò)調(diào)整調(diào)度策略文件或參數(shù)優(yōu)化調(diào)度器性能。
- 監(jiān)控調(diào)度器:使用 Prometheus 和 Grafana 監(jiān)控調(diào)度器性能指標(biāo)。
通過(guò)實(shí)踐這些調(diào)度策略,你可以根據(jù)應(yīng)用需求優(yōu)化 Kubernetes 集群的資源分配和應(yīng)用部署。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
青龍面板拉庫(kù)解決沒(méi)有或丟失依賴can‘t?find?module的保姆級(jí)教程(附青龍面板腳本倉(cāng)庫(kù))
這篇文章主要介紹了青龍面板拉庫(kù)解決沒(méi)有或丟失依賴can‘t?find?module的保姆級(jí)教程(附青龍面板腳本倉(cāng)庫(kù)),需要的朋友可以參考下2022-05-05
k8s安裝calico時(shí)如何選擇網(wǎng)卡問(wèn)題
這篇文章主要介紹了k8s安裝calico時(shí)如何選擇網(wǎng)卡問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
Rancher通過(guò)界面管理K8s平臺(tái)的圖文步驟詳解
這篇文章主要為大家介紹了Rancher通過(guò)界面管理K8s平臺(tái)通過(guò)詳細(xì)的圖文進(jìn)行步驟講解,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
k8s kubectl啟動(dòng)成功,但執(zhí)行命令時(shí)報(bào)錯(cuò)解決:The connection to&
用戶使用kubectl時(shí)出現(xiàn)連接拒絕錯(cuò)誤,排查發(fā)現(xiàn)配置文件名非admin.conf,修改后問(wèn)題解決,提示需使用kubernetes-admin配置文件以確保正確性2025-08-08
Rainbond上部署API?Gateway?Kong及環(huán)境配置教程
這篇文章主要為大家介紹了Rainbond上部署API?Gateway?Kong及環(huán)境配置教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
KVM虛擬化技術(shù)之virt-manager使用及KVM虛擬化平臺(tái)網(wǎng)絡(luò)模型介紹
這篇文章主要介紹了KVM虛擬化技術(shù)之virt-manager使用及KVM虛擬化平臺(tái)網(wǎng)絡(luò)模型介紹,需要的朋友可以參考下2016-10-10
k8s中實(shí)現(xiàn)mysql主備過(guò)程詳解
文章講解了在K8s中使用StatefulSet部署MySQL主備架構(gòu),包含NFS安裝、storageClass配置、MySQL部署及同步檢查步驟,確保主備數(shù)據(jù)一致性與高可用性2025-09-09

