Help us understand the problem. What is going on with this article?

kubernetes: 特定のコンテナ(Pod)だけ特定のホストで

kuberenetsで複数のコンテナを複数クラスタ上で運用すると、リソースの関係などで特定のコンテナ(Pod)だけ特定のホストで実行したいケースがある。

label機能を使うことで実現できる。

参照) Constraining pods to run on particular nodes
http://kubernetes.io/docs/user-guide/node-selection/

host(minion node)にlabelを付ける

初期状態として以下のworker(minion) nodeとする

$ kubectl get nodes
NAME              LABELS                                   STATUS    AGE
ip-172-31-25-70   kubernetes.io/hostname=ip-172-31-25-70   Ready     1m
ip-172-31-25-72   kubernetes.io/hostname=ip-172-31-25-72   Ready     1m

それぞれのホストにlabelを付与する

kubectl label nodes ip-172-31-25-70 type=app1
kubectl label nodes ip-172-31-25-72 type=app2

※上書きするときは--overwrite オプションを付ければ良い。

任意のkey=value形式で、例ではtype=app1、app2とそれぞれ付与した。

以下のようにlabelが付与されていることが確認できる。

$ kubectl get nodes
NAME              LABELS                                             STATUS    AGE
ip-172-31-25-70   kubernetes.io/hostname=ip-172-31-25-70,type=app1   Ready     31m
ip-172-31-25-72   kubernetes.io/hostname=ip-172-31-25-72,type=app2   Ready     31m

※バージョンによっては kubectl get node -L type で確認

Pod/RC(or Replica Set/Deployment)にlabelを付与する

yamlファイルのspecにて nodeSelectorを追記。
以下はReplication Controllerのyaml設定例。

apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    app: nginx
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
      nodeSelector:
        type: app2

上記ではtype=app2のlabelを付与したホスト(ip-172-31-25-72)に限定することを意味する。

動作確認

RCを起動して、Podが指定したホストのみで起動されることを確認。

$ kubectl create -f test.yaml

以下の通り、type=app2のlabelを付与したホスト(ip-172-31-25-72)へのみアサインされていることがわかる。

$ kubectl get pod -o wide
NAME          READY     STATUS    RESTARTS   AGE       NODE
nginx-5w09v   1/1       Running   0          17m       ip-172-31-25-72
nginx-mf4l7   1/1       Running   0          20m       ip-172-31-25-72
nginx-p79e9   1/1       Running   0          17m       ip-172-31-25-72

試しにyamlファイルのreplicasを3から5に変更してapplyすると、新たに2つのPodが追加され、かつtype=app2のlabelを付与したホスト(ip-172-31-25-72)へのみアサインされていることがわかる。

$ kubectl get pod -o wide
NAME          READY     STATUS    RESTARTS   AGE       NODE
nginx-5w09v   1/1       Running   0          17m       ip-172-31-25-72
nginx-mf4l7   1/1       Running   0          20m       ip-172-31-25-72
nginx-p79e9   1/1       Running   0          17m       ip-172-31-25-72
nginx-r7dmc   1/1       Running   0          20m       ip-172-31-25-72
nginx-yu0r3   1/1       Running   0          20m       ip-172-31-25-72
suzukihi724
各種備忘録
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away