iT邦幫忙

2026 iThome 鐵人賽

DAY 17
0
Kubernetes

從零開始的 Kubernetes 基礎觀念與實作系列 第 17 篇

從零開始的 Kubernetes 基礎觀念與實作 DAY17

  • 分享至 

  • xImage
  •  

Pod 排程

建立 Pod 時,通常不會直接指定它要在哪個 Node 上執行。Kubernetes 會由 kube-scheduler 替 Pod 選擇合適的 Node,讓該 Node 上的 kubelet 啟動 Pod。
Kubernetes 排程器會考量 Pod 的資源需求,以及它設定的排程條件。例如,Pod 的 resources.requests 會影響 Node 是否有足夠的可用資源;nodeSelector 則能限制 Pod 只能排到具有指定 Label 的 Node 上。DAY6 已經介紹過 nodeSelector 的基本用法,這篇會用它來觀察排程結果。

排程器如何選擇 Node?

可以先把排程過程理解為兩個階段:

  1. 篩選 Node:排除資源不足,或不符合 Pod 排程條件的 Node。
  2. 選擇 Node:從符合條件的 Node 中評分,選出合適的 Node,再將 Pod 指派給它。
    如果沒有任何 Node 符合條件,Pod 就暫時沒有 Node 可以執行。
    除了 nodeSelector,Kubernetes 也提供 Node Affinity、Pod Affinity/Anti-Affinity 等進階排程條件。這篇先使用 nodeSelector 示範排程結果,其他條件之後有機會再深入介紹。

觀察排程成功與失敗

先查看叢集中的 Node:kubectl get nodes
image

選擇一個 Node,替它加上 schedule-demo=worker 這個 Label。
以 minikube-m02 為例,請依照自己的 Node 名稱調整:
kubectl label nodes minikube-m02 schedule-demo=worker

確認 Label 已加入:
kubectl get nodes -L schedule-demo
image

建立 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.yaml
kubectl get pods -o wide
image

查看 Pod 詳細資訊與事件:
kubectl describe pod <Pod名稱>

在 Events 區段可以看到排程失敗的原因。
image

此例中,Pod 找不到符合 nodeSelector 的 Node,因此尚未被指派到任何 Node。kubectl get pods -o wide 的 NODE 欄位也會是空的。

修改排程條件

將 YAML 中的值:
schedule-demo: not-exist

改成:
schedule-demo: worker

重新套用後查看結果:
kubectl apply -f schedule-demo.yaml
kubectl rollout status deployment/schedule-demo
kubectl get pods -o wide
image

這次 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。


上一篇
從零開始的 Kubernetes 基礎觀念與實作 DAY16
系列文
從零開始的 Kubernetes 基礎觀念與實作 共 17 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言