Kubernetes調(diào)度機制與策略實驗詳解
實驗?zāi)康?/h2>
通過實際操作,理解 Kubernetes 調(diào)度機制的核心原理和常用調(diào)度策略的配置方法,包括節(jié)點選擇、親和性與反親和性、污點與容忍等。
實驗環(huán)境
- Kubernetes 集群(至少包含一個 Master 節(jié)點和兩個 Worker 節(jié)點)。
- kubectl 命令行工具。
- Docker 鏡像(如
nginx或其他簡單應(yīng)用鏡像)。
實驗步驟
步驟 1:查看集群節(jié)點信息
目的:了解集群中可用的節(jié)點及其狀態(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
說明:確保所有節(jié)點狀態(tài)為 Ready,表示集群正常運行。
步驟 2:使用nodeName調(diào)度 Pod
目的:理解 nodeName 的作用,即直接指定 Pod 調(diào)度到特定節(jié)點。
創(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
驗證 Pod 是否運行在指定節(jié)點:
kubectl get pods -o wide
輸出示例:

說明:nodeName 是最簡單的調(diào)度方式,適用于調(diào)試或測試場景。
步驟 3:使用nodeSelector調(diào)度 Pod
目的:理解 nodeSelector 的作用,即通過節(jié)點標(biāo)簽選擇目標(biāo)節(jié)點。
為節(jié)點添加標(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
驗證 Pod 是否運行在帶有指定標(biāo)簽的節(jié)點:
kubectl get pods -o wide
輸出示例:

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

說明:節(jié)點親和性比 nodeSelector 更靈活,支持復(fù)雜的匹配規(guī)則。
步驟 5:使用 Pod 親和性與反親和性調(diào)度 Pod
目的:理解 Pod 親和性與反親和性的作用,即通過 Pod 標(biāo)簽選擇調(diào)度位置。
kubectl label pod pod-node-affinity role=frontend
創(chuàng)建帶有親和性的 Pod 配置文件 (pod-affinity.yaml):
這個配置文件的目的是創(chuàng)建一個名為 pod-affinity 的 Pod,并通過 Pod 親和性 規(guī)則將它調(diào)度到與已存在的、帶有 role=frontend 標(biāo)簽的 Pod 相同的節(jié)點上。
關(guān)鍵點解釋
apiVersion: v1 # 指定 Kubernetes API 的版本,這里使用的是 v1 版本。
kind: Pod # 指定資源類型為 Pod。
metadata: # 定義 Pod 的元數(shù)據(jù)。
name: pod-affinity # Pod 的名稱,用于標(biāo)識這個 Pod。
labels: # Pod 的標(biāo)簽,用于標(biāo)識 Pod 的角色或其他屬性。
role: frontend # 定義一個標(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é)點的主機名。
containers: # 定義 Pod 中的容器列表。
- name: nginx # 容器的名稱,這里是 "nginx"。
image: nginx # 容器使用的鏡像,這里是官方的 nginx 鏡像。創(chuàng)建帶有反親和性的 Pod 配置文件 (pod-antiAffinity.yaml):
這個配置文件的目的是創(chuàng)建一個名為 pod-anti-affinity 的 Pod,并通過 Pod 反親和性 規(guī)則將其調(diào)度到與帶有 role=frontend 標(biāo)簽的 Pod 不同 的節(jié)點上。
apiVersion: v1 # 指定使用的 Kubernetes API 版本為 v1。
kind: Pod # 指定資源類型為 Pod。
metadata: # 定義 Pod 的元數(shù)據(jù),包括名稱和標(biāo)簽。
name: pod-anti-affinity # Pod 的名稱,用于標(biāo)識這個 Pod。
labels: # 定義 Pod 的標(biāo)簽。
role: backend # 為 Pod 添加一個標(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é)點的主機名。
containers: # 定義 Pod 中的容器列表。
- name: nginx # 定義容器的名稱,這里是 "nginx"。
image: nginx # 定義容器使用的鏡像,這里是官方的 nginx 鏡像。應(yīng)用配置文件:
kubectl apply -f pod-affinity.yaml kubectl apply -f pod-antiAffinity.yaml
驗證 Pod 是否運行在符合條件的位置:
kubectl get pods -o wide
輸出示例:

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

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

說明:調(diào)度優(yōu)先級允許為 Pod 分配優(yōu)先級,高優(yōu)先級的 Pod 會優(yōu)先調(diào)度。
步驟 8:清理實驗環(huá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)先級類:
kubectl delete priorityclass high-priority
刪除節(jié)點標(biāo)簽和污點:
kubectl label nodes k8s-node1 disk- kubectl label nodes k8s-node2 disk- kubectl taint nodes k8s-node1 special:NoSchedule-
實驗總結(jié)
通過以上實驗,我們詳細(xì)驗證了 Kubernetes 調(diào)度機制的核心原理和常用調(diào)度策略的實際應(yīng)用。以下是關(guān)鍵知識點的總結(jié):
調(diào)度器的作用:將 Pod 分配到合適的節(jié)點,確保資源合理利用和應(yīng)用高可用性。
調(diào)度方法:
- nodeName:直接指定節(jié)點,適用于調(diào)試或測試。
- nodeSelector:通過節(jié)點標(biāo)簽選擇目標(biāo)節(jié)點,適用于根據(jù)硬件類型或地理位置調(diào)度。
- 節(jié)點親和性(nodeAffinity):支持復(fù)雜的標(biāo)簽匹配規(guī)則,更靈活。
- Pod 親和性與反親和性(podAffinity/podAntiAffinity):根據(jù) Pod 標(biāo)簽選擇調(diào)度位置。
- 污點與容忍(Taints & Tolerations):通過污點限制調(diào)度,并通過容忍允許調(diào)度到帶有特定污點的節(jié)點。
- 調(diào)度優(yōu)先級(Priority Classes):為 Pod 分配優(yōu)先級,高優(yōu)先級的 Pod 優(yōu)先調(diào)度。
- 調(diào)度器優(yōu)化:通過調(diào)整調(diào)度策略文件或參數(shù)優(yōu)化調(diào)度器性能。
- 監(jiān)控調(diào)度器:使用 Prometheus 和 Grafana 監(jiān)控調(diào)度器性能指標(biāo)。
通過實踐這些調(diào)度策略,你可以根據(jù)應(yīng)用需求優(yōu)化 Kubernetes 集群的資源分配和應(yīng)用部署。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Kubernetes中創(chuàng)建命名空間實現(xiàn)方法
這篇文章主要為大家介紹了Kubernetes中創(chuàng)建命名空間實現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
KubeSphere中部署Wiki系統(tǒng)wiki.js并啟用中文全文檢索
這篇文章主要為大家介紹了KubeSphere中部署Wiki系統(tǒng)wiki.js并啟用中文全文檢索實現(xiàn)過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Kubernetes刪除ns實現(xiàn)方式(namespace)
文章介紹了在Kubernetes中刪除無法正常刪除的命名空間(namespace)的幾種方法,首先,通過查看和修改命名空間的JSON文件來刪除`finalizers`,然后使用`kubectl proxy`命令來繞過Kubernetes的安全機制,最終成功刪除了命名空間2026-01-01
通過kubernetes部署nginx+php網(wǎng)站環(huán)境過程
本文詳細(xì)介紹了如何在Kubernetes中部署Nginx+PHP網(wǎng)站環(huán)境,包括環(huán)境準(zhǔn)備、部署步驟、Service、ConfigMap、Ingress等配置,并提供了具體的YAML文件示例和命令,通過這些步驟,可以實現(xiàn)高可用、可擴展的Web服務(wù)2026-01-01

