NodeSelector 分配 Pod 至指定節點

根據不同應用場景,利用 NodeSelector 分配 Pod 至指定節點

NodeSelector 分配 Pod 至指定節點

NodeSelector 分配 Pod 至指定節點

在某些情境下,我們可能會想要將 Pod 部署到特定節點,比方說我們要做 machine learning 的訓練時,會想將 Pod 部署到有 GPU 卡的節點。


pod-to-gpu-node

將 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