NodeSelector 分配 Pod 至指定節點
在某些情境下,我們可能會想要將 Pod 部署到特定節點,比方說我們要做 machine learning
的訓練時,會想將 Pod 部署到有 GPU 卡的節點。
將 Pod 部署到 GPU 節點
然而在未調整設定的情況下,Kubernetes 會分配 Pod 至隨機節點,針對這種情況我們就可以使用 NodeSelector
來限制每個 pod 能夠在哪些節點上開啟。
動手做
查詢現有標籤
查看目前節點上所含有的標籤
$ kubectl get nodes --show-labels
NAME STATUS AGE LABELS
192.168.1.1 Ready 4d beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=192.168.1.1
192.168.1.2 Ready 4d beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=192.168.1.2
192.168.1.3 Ready 4d beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=192.168.1.3
新增標籤
假設節點 192.168.1.1
有安裝 Nvidia GPU 的話,我們給予他對應的標籤 gpu=nvidia
。
$ kubectl label node <node name> <label>=<value>
$ kubectl label node 192.168.1.1 gpu=nvidia
確認 labels 是否有更新上去
$ kubectl get nodes --show-labels
NAME STATUS AGE LABELS
192.168.1.1 Ready 4d gpu=nvidia,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=192.168.1.1
...
移除標籤
若想要移除標籤的話,可以使用 <label>-
來移除錯誤的標籤 (重點在後面的 -
號)。
$ kubectl label node 192.168.1.1 gpu-
建立測試用 Deployment
接著我們就可以在 controller.spec
加上對應的 NodeSelector
nodeSelector:
gpu: "nvidia"
以 Deployment 為例 (spec.template.spec
)
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: tensorflow-test
namespace: default
spec:
replicas: 3
template:
metadata:
name: tensorflow
spec:
containers:
- name: tensorflow
image: tensorflow
imagePullPolicy: IfNotPresent
nodeSelector:
gpu: "nvidia"
小技巧: 利用雙引號 ("
) 將標籤值括起來避免錯誤
確認 Pods 在哪些節點開啟
現在我們可以看到 Pod 都跑在 192.168.1.1
意即有 gpu=nvidia
標籤的節點上。
$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
tensorflow-test-3190407156-4g8k5 1/1 Running 0 17s 172.16.88.2 192.168.1.1
tensorflow-test-3190407156-837ad 1/1 Running 0 17s 172.16.88.3 192.168.1.1
tensorflow-test-3190407156-o95l8 1/1 Running 0 17s 172.16.84.2 192.168.1.1