Pod
とは
同一実行環境上で動作する、アプリケーションコンテナとストレージボリュームの集まりのこと。平易にいうと、1つ以上のコンテナを管理するための単位。Kubernetes クラスタ上での最小のデプロイ単位。 なぜ Pod か?
コンテナには、Docker コンテナ, rkt コンテナ等の種類があり、それぞれ要件が異なるので、これを吸収する
コンテナ管理のためには各種機能とその設定が必要となり、これを担う層となる
ヘルスチェック
コンテナ終了時に実行すべきアクションを定義する再起動ポリシー
Pod とコンテナ
1 つの Pod 内のコンテナは、全て同じマシン上に配置される
Pod 内のコンテナは、ある論理ホスト上で稼働するとみなせる ネットワークネームスペース、つまり IP アドレス、ポート空間、IPC ネームスペースを共有する
ボリュームを共有する
同一 Pod 内のコンテナは効率よく通信できる
粒度
違うマシンに配置しても正常に動作する単位 で、分離した方が良い
MySQL と WordpPress は同一 Pod にしない方が良い
別コンテナにデプロイしても、ネットワークで接続できていれば効率よく動作するはず
スケール戦略が異なる単位 で、分離した方が良い
MySQL と WordPress は、個別にスケールする可能性が高い
WordPress のスケールは簡単だが、MySQL のスケールは難しい
マニフェスト
code:yaml
apiVersion: v1
kind: Pod
metadata:
name: <Pod名>
spec:
containers:
- image: <イメージ名>
name: <コンテナ名>
protocol: TCP
ボリューム
以下のセクションを追加する必要がある。
spec.volumes マニフェスト内のコンテナからアクセスされ得る 全てのボリューム を列挙する
全てのコンテナが、この全てのボリュームをマウントできる必要がある
spec.containers[n].volumeMounts 特定のコンテナのボリューム設定。どのパスにボリュームをマウントするか?
そのほかの組み合わせ方としては、以下がある。
emptyDir Pod の停止までしか使えない。一時的な共有や、キャッシュなどに利用できる hostPath Node 上の任意の場所をコンテナにマウントできる機能。永続化目的でなく、ホストのFSにアクセスしたい場合 リモートディスク(nfs, ...) NFS, iSCSI や、Amazon Elastic Block Store 等をボリュームに利用できる
spec.volumes に列挙した際に、該当ボリュームに設定を追記することで利用できる
ヘルスチェック
Liveness probe
アプリケーションが 起動しているかどうか をチェックする
Readiness probe
アプリケーションが 応答できるかどうか をチェックする
リソース管理
以下のリソース指標を指定できる
resource request (リソース要求)
resource limit (リソース制限)
kubectl での操作
code:bash
# ポートフォワード
# 例えば、下記で localhost:8080 からコンテナ内の 8080 にアクセスできる
$ kubectl port-forward <Pod名> 8080:8080
# コンテナにファイルをコピーする
$ kubectl cp <Pod名>:/path/to/remote/file /path/to/local/file
$ kubectl cp /path/to/local/file <Pod名>:/path/to/remote/file
# 実行中のコンテナのログ
# -f オプションで継続的に出力
$ kubectl logs <Pod名>
# 実行中のコンテナ内でコマンドを実行
$ kubectl exec -it <Pod名> -- bash