特定のノード上でのみPodを実行する

このページでは、DaemonSetの一部として、特定のノード上でのみPodを実行する方法を説明します。

始める前に

Kubernetesクラスターが必要、かつそのクラスターと通信するためにkubectlコマンドラインツールが設定されている必要があります。 このチュートリアルは、コントロールプレーンのホストとして動作していない少なくとも2つのノードを持つクラスターで実行することをおすすめします。 まだクラスターがない場合、minikubeを使って作成するか、 以下のいずれかのKubernetesプレイグラウンドも使用できます:

特定のノードでのみPodを実行する

DaemonSetを実行したいが、そのデーモンPodをローカルのソリッドステートドライブ(SSD)ストレージを備えたノードでのみ実行する必要があるとします。 例えば、Podがノードにキャッシュサービスを提供し、低遅延のローカルストレージが利用可能な場合にのみキャッシュが有用である場合などです。

ステップ1: ノードにラベルを追加する

SSDを持つノードにssd=trueというラベルを追加します。

kubectl label nodes example-node-1 example-node-2 ssd=true

ステップ2: マニフェストを作成する

SSDのラベルが付けられたノード上にのみデーモンPodを配置するDaemonSetを作成してみましょう。

次に、nodeSelectorを使用して、DaemonSetがssdラベルに"true"が設定されたノード上でのみPodを実行するようにします。

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: ssd-driver
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: ssd-driver-pod
  template:
    metadata:
      labels:
        app: ssd-driver-pod
    spec:
      nodeSelector:
        ssd: "true"
      containers:
        - name: example-container
          image: example-image

ステップ3: DaemonSetを作成する

kubectl createまたはkubectl applyを使用してマニフェストからDaemonSetを作成します。

別のノードにssd=trueというラベルを付けてみましょう。

kubectl label nodes example-node-3 ssd=true

ノードにラベルを付けると、それによってコントロールプレーン(正確にはDaemonSetコントローラー)がトリガーされ、そのノード上で新しいデーモンPodが実行されます。

kubectl get pods -o wide

出力は次のようになります:

NAME                              READY     STATUS    RESTARTS   AGE    IP      NODE
<daemonset-name><some-hash-01>    1/1       Running   0          13s    .....   example-node-1
<daemonset-name><some-hash-02>    1/1       Running   0          13s    .....   example-node-2
<daemonset-name><some-hash-03>    1/1       Running   0          5s     .....   example-node-3