Kubernetes の pod とは?最小のデプロイ可能な単位
pod は Kubernetes の最小のデプロイ可能な単位です: ネットワーク名前空間とストレージを共有し、一緒にスケジュールされる、密結合な 1 つ以上のコンテナです。
Kubernetes はコンテナを直接スケジュールしません - pod をスケジュールします。通常 pod は単一のコンテナを保持しますが、並んで実行しリソースを共有する必要のある複数を保持することもできます。pod は意図的にエフェメラルであり、それがその周囲のすべての設計の仕方を形づくります。
pod が共有するもの
pod 内のコンテナは同じネットワーク名前空間を共有し - localhost で互いに到達し IP を共有します - マウントされたボリュームを共有できます。これにより pod は、本当に 1 つの論理単位であるコンテナのための正しいグルーピングになります。
1 つのコンテナか複数か
ほとんどの pod は単一のアプリコンテナを持ちます。複数コンテナの pod は、sidecar(ログシッパーや proxy)や最初に実行される init container のようなヘルパーを追加します。経験則: ライフサイクルを共有しなければならないコンテナだけを co-locate しましょう。
pod はエフェメラル
pod はペットではなく家畜です。node が故障したりスケールダウンしたりすると、pod は削除され、新しいものが別の場所に - 新しい IP で - 作成されます。特定の pod が生き残ることに依存することは決してなく、controller が正しい数を維持することに依存します。
pod を直接作ることはめったにない
- Deployment は stateless なアプリのために pod を作成・管理する。
- StatefulSet は安定した識別子を必要とする pod を管理する。
- Job はバッチ作業のために pod を完了まで実行する。
pod と CI/CD
CI pipeline は pod を所有する controller(例: Deployment)を更新することで deploy し、Kubernetes は新しくビルドされたイメージを実行する新しい pod を展開します。一部の CI システムは、各 job をクラスタ上の pod で実行することさえあります。
重要なポイント
- pod は最小のデプロイ可能な単位です - ネットワークとストレージを共有する 1 つ以上のコンテナ。
- pod はエフェメラルです。直接ではなく controller を通じて管理します。
- ライフサイクルを共有する場合にのみ、コンテナを 1 つの pod に co-locate しましょう。