TechLunch

The free lunch is over.

Kubernetes入門5: Podを特定のノードに割り当てる

Kubernetesでは、スケジューラがPodをどのノードで実行するかを判断します。PodをGPUSSDが搭載された特定のノードで実行したい場合は、nodeSelectorなどを利用することで、実現できます。

KubernetesドキュメントのAssign Pods to Nodesを参考にしながら、試してみました。

準備

可能なら複数台のノードを用意できると良いです。Kubernetesのインストールはkubeadmを利用した方法が簡単です。

ノードにLabelを追加する

KubernetesクラスタにJoin済のノード一覧を表示します。

$ kubectl get nodes
NAME      STATUS    ROLES     AGE       VERSION
master     Ready     master    8d        v1.11.2
worker1    Ready     <none>    8d        v1.11.2
worker2    Ready     <none>    8d        v1.11.2

私のクラスタ環境は1台のmaster、2台のworkerで構成されていることがわかります。

次に、worker1にdisktype=ssdというlabelを付与します。

$ kubectl label nodes worker1 disktype=ssd
$ kubectl get nodes --show-labels
...

これで、worker1にはPodを割り当てる時のヒントになるlabelが付与されました。

Podを特定のノード上で動かす

次の設定ファイルでPodを作成します。

# https://k8s.io/examples/pods/pod-nginx.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    disktype: ssd

設定ファイルのnodeSelectorの項目に、disktype: ssdという設定を記述することで、このlabelを持つノードにPodがスケジューリングされます。

Podを作成し、どのノードで実行されているか確認すると、worker1でPodが動いていることがわかります。

$ kubectl create -f https://k8s.io/examples/pods/pod-nginx.yaml
$ kubectl get pods --output=wide
...

該当するlabelを持つノードが存在しない場合

Podの設定で、nodeSelectorを指定してる際に、それに該当するノードが存在しない場合の挙動はどうなるか試してみました。

まず、先ほどworker1に付与したlabelを削除します。

$ kubectl label nodes worker1 disktype-

Podを実行して、状態を確認します。

$ kubectl create -f https://k8s.io/examples/pods/pod-nginx.yaml
$ kubectl describe pods nginx
Events:
  Type     Reason            Age               From               Message
  ----     ------            ----              ----               -------
  Warning  FailedScheduling  4s (x5 over 13s)  default-scheduler  0/3 nodes are available: 3 node(s) didn't match node selector.

すると、nodeSelectorにマッチするノードが存在しないということでPodがどのノードでも実行されていないことがわかります。

以上より、ノードにlabelという情報を付与することで、ユーザがPodを任意のノードに割り当てることができます。GPUSSDを利用するアプリケーションをデプロイしたい方は、ぜひ試してみてください。