建立 Pod 時,通常不會直接指定它要在哪個 Node 上執行。Kubernetes 會由 kube-scheduler 替 Pod 選擇合適的 Node,讓該 Node 上的 kubelet 啟動 Pod。
Kubernetes 排程器會考量 Pod 的資源需求,以及它設定的排程條件。例如,Pod 的 resources.requests 會影響 Node 是否有足夠的可用資源;nodeSelector 則能限制 Pod 只能排到具有指定 Label 的 Node 上。DAY6 已經介紹過 nodeSelector 的基本用法,這篇會用它來觀察排程結果。
可以先把排程過程理解為兩個階段:
先查看叢集中的 Node:kubectl get nodes
選擇一個 Node,替它加上 schedule-demo=worker 這個 Label。
以 minikube-m02 為例,請依照自己的 Node 名稱調整:kubectl label nodes minikube-m02 schedule-demo=worker
確認 Label 已加入:kubectl get nodes -L schedule-demo
建立 schedule-demo.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: schedule-demo
spec:
replicas: 1
selector:
matchLabels:
app: schedule-demo
template:
metadata:
labels:
app: schedule-demo
spec:
nodeSelector:
schedule-demo: not-exist
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
目前 minikube-m02 上的 Label 是 schedule-demo=worker,但 Pod 要求的是 schedule-demo=not-exist,因此沒有 Node 符合條件。
套用設定並查看 Pod:kubectl apply -f schedule-demo.yamlkubectl get pods -o wide
查看 Pod 詳細資訊與事件:kubectl describe pod <Pod名稱>
在 Events 區段可以看到排程失敗的原因。
此例中,Pod 找不到符合 nodeSelector 的 Node,因此尚未被指派到任何 Node。kubectl get pods -o wide 的 NODE 欄位也會是空的。
將 YAML 中的值:schedule-demo: not-exist
改成:schedule-demo: worker
重新套用後查看結果:kubectl apply -f schedule-demo.yamlkubectl rollout status deployment/schedule-demokubectl get pods -o wide
這次 Pod 符合 Node 上的 Label,排程器就能選擇該 Node。確認 NODE 欄位顯示 minikube-m02,代表 Pod 已被安排到該節點。
Pod 排程是 Kubernetes 為 Pod 選擇執行 Node 的過程。排程器會檢查 Pod 的資源需求和排程條件,再從符合條件的 Node 中選擇一個。
DAY6 介紹的 nodeSelector 是限制 Pod 可被安排到哪些 Node 的一種方式。如果 Pod 一直沒有被指派到 Node,可以先用 kubectl describe pod <Pod名稱> 查看事件,檢查資源是否足夠,以及排程條件是否有符合的 Node。