kubernetes Pod 排程到指定的 Node
我們知道,kubernetes 的 Scheduler 服務(kube-scheduler程序)負責實現 Pod 的排程,整個排程過程通過執行一系列的演算法最終為每個 Pod 計算出一個最佳的目標節點,這一過程是自動完成的,我們無法知道 Pod 最終會被排程到哪個節點上。有時我們可能需要將 Pod 排程到一個指定的 Node 上,此時,我們可以通過 Node 的標籤 (Label)和Pod 的 nodeSelector 屬性相匹配,來達到上述目的。
首先,我們可以通過 kubectl label 命令給目標 Node 打上一個特定的標籤,下面是此命令的完整用法:
kubectl label nodes <node-name> <label-key>=<label-value>
這裡,我們為kubernetes-minion1 節點上打上一個 zone=north 的標籤,表明它是 “北方”的一個節點:
$ kubectl label nodes kubernetes-minion1 zone=north
NAME LABELS STATUS
kubernetes-minion1 kubernetes.io/hostname=kubernetes-minion1,zone=north Ready
上述命令操作也可以通過修改資源定義檔案的方式,並執行 kubectl replace -f xxx.yaml 命令來完成。
然後,在 Pod 的配置檔案中加入 nodeSelector 定義,以 redis-master0controller.yaml 為例:
apiVersion: v1
kind: ReplicationController
metadata:
name: redis-master
lables:
name: redis-master
spec:
replicas: 1
selector:
name: redis-master
template:
metadata:
lables:
name: redis-master
spec:
containers:
- name: master
images: kubeguide/redis-master
ports:
- containerPort: 6379
nodeSelector:
zone: north
執行 kubectl create -f 命令建立 Pod,scheduler 會將該 Pod 排程到擁有 zone=north 標籤的 node 上去。
使用 kubectl get pods -o wide
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE NODE
redis-master-1 1/1 Running 0 18s kubernetes-minion1
如果我們給多個 Node 都定義了相同的標籤(如 zone=north),則scheduler 將會根據排程演算法從這組 Node 中 挑選一個可用的 Node 進行Pod 排程。
這種基於 Node 標籤的排程方式靈活性很高,比如我們可以把一組 Node 分別貼上 “開發環境” “測試環境” “使用者驗收環境” 這三組標籤中的一種,此時一個 kubernetes叢集就承載了3個環境,這將大大提高開發效率。
需要注意的是,如果我們指定了 Pod 的 nodeSelector 條件,且叢集中不存在包含相應標籤的 Node時,即使還有其他可供排程的 Node,這個 Pod 也最終會排程失敗。