pod はネットワークと名前空間を共有するコンテナの集まりで、Kubernetes におけるデプロイメントの基本単位です。pod 内のコンテナはすべて同じ node 上でスケジュールされます。

コンテナのイメージ mhausenblas/simpleservice:0.5.0 を使って、HTTP API をポート番号 9876 で公開する pod を起動するには、以下を実行します。

$ kubectl run sise --image=mhausenblas/simpleservice:0.5.0 --port=9876

pod が実行中であることは次のように確認できます。

$ kubectl get pods
NAME                      READY     STATUS    RESTARTS   AGE
sise-3210265840-k705b     1/1       Running   0          1m

$ kubectl describe pod sise-3210265840-k705b | grep IP:
IP:                     172.17.0.3

クラスタ内部から (たとえば minishift ssh を使うと) この pod には pod IP 172.17.0.3 でアクセスできます。IP アドレスは上のコマンド kubectl describe からわかります。

[cluster] $ curl 172.17.0.3:9876/info
{"host": "172.17.0.3:9876", "version": "0.5.0", "from": "172.17.0.1"}

なお、kubectl rundeployment を作成します。そのため、作成した pod を削除するには kubectl delete deployment sise を実行してください。

設定ファイルの使用

設定ファイルから pod を作成することもできます。今回の pod では上記で使用した simpleservice イメージと一般的な CentOS コンテナを一緒に実行します。

$ kubectl apply -f https://raw.githubusercontent.com/openshift-evangelists/kbe/master/specs/pods/pod.yaml

$ kubectl get pods
NAME                      READY     STATUS    RESTARTS   AGE
twocontainers             2/2       Running   0          7s

これで localhost から CentOS コンテナに exec を実行して、simpleservice にアクセスできます。

$ kubectl exec twocontainers -c shell -i -t -- bash
[root@twocontainers /]# curl -s localhost:9876/info
{"host": "localhost:9876", "version": "0.5.0", "from": "127.0.0.1"}

pod の中で resources フィールドを指定すると、CPU と RAM を pod 内のコンテナがどの程度使用できるかを制限できます。(ここでは RAM が 64MB、CPU が 0.5)

$ kubectl create -f https://raw.githubusercontent.com/openshift-evangelists/kbe/master/specs/pods/constraint-pod.yaml

$ kubectl describe pod constraintpod
...
Containers:
  sise:
    ...
    Limits:
      cpu:      500m
      memory:   64Mi
    Requests:
      cpu:      500m
      memory:   64Mi
...

Kubernetes のリソース制限についてさらに学ぶにはここここのドキュメントをお読みください。

作成した pod をすべて削除するには以下を実行するだけです。

$ kubectl delete pod twocontainers

$ kubectl delete pod constraintpod

まとめると、Kubernetes で一つ以上のコンテナを (一緒に) 起動するのは簡単ですが、上記のように直接起動しようとすると致命的な限界があります。障害があってもコンテナの実行を維持するためには手動で管理しなければならないからです。それよりも良い方法は、deployment で pod を管理することです。deployment を使えばライフサイクルをまたいで pod を制御できるため、新しいバージョンをロールアウトすることも可能です。

次へ