Kubernetes Pod とは
Pod(ポッド)とは、Kubernetes の最小実行単位です。Pod には 1 つ以上のアプリケーションが含まれます。Pod は一時的なものであり、Pod(または Pod を実行中のノード)に障害が発生した場合、Kubernetes は自動的にその Pod の新しいレプリカを作成して、処理を続行できるようにします。Pod には、1 つ以上のコンテナ(Docker コンテナなど)が含まれます。
また、Pod は、パーシステント ストレージ ボリューム(クラスタ内のすべての Pod が利用できる永続的なストレージ)や、Pod 内のコンテナを実行するために必要な構成データなど、環境の依存関係を提供します。

5 分でわかる Kubernetes

2021 年 Kubernetes の現状
Pod の機能
Pod はクラスタ上で実行されるプロセスとして提示されます。Kubernetes では、Pod を単一のプロセスに限定することにより、クラスタ内で実行されている各プロセスの健全性を把握できます。Pod は、以下の要素を備えています。
- 一意の IP アドレス(これにより Pod 同士の通信を実現)
- パーシステント ストレージ ボリューム(必要な場合)
- コンテナの実行方法を決定する構成情報
Pod には、基本的には 1 つのコンテナが含まれていますが、密接に連携して目的の機能を実行する複数のコンテナが配置されることもよくあります。
Pod のメリット
Pod に複数のコンテナが含まれる場合、コンテナ間の通信とデータ共有はシンプルになります。Pod 内のすべてのコンテナは同じネットワーク ネームスペースを共有するため、localhost を介して互いの場所を特定し、通信することができます。Pod 同士は、相手の Pod の IP アドレスを使用するか、相手の Pod に存在するリソースを参照することで通信できます。
Pod には、Pod の起動時に実行されるコンテナを含めることができます。これにより、アプリケーション コンテナの実行前に必要な開始処理を実行することなどができます。また、Pod では、需要の変化に応じて自動的にレプリカ Pod を作成および削除できるため、シンプルなスケーラビリティを実現できます。
Pod の仕組み
Pod は、コントローラと呼ばれるワークロード リソースによって作成されます。このコントローラは、クラスタ内の Pod の展開、レプリケーション、健全性を管理します。たとえば、クラスタ内のノードに障害が発生すると、コントローラはそのノード上の Pod が応答不能であることを検知し、ほかのノード上に代替 Pod を作成します。
もっとも一般的なタイプのコントローラとして、次の 3 つがあります。
- Job:一時的なバッチタイプのジョブ用のコントローラです。完了するまでタスクを実行します
- Deployment:Web サーバ(HTTP サーバ)などのステートレスで永続的なアプリケーション用です
- StatefulSet:データベースなどのステートフルで永続的なアプリケーション用です
Pod に複数のコンテナがある場合、それらはすべて、仮想マシンか物理サーバかを問わず、クラスタ内の同じサーバ上で一緒にスケジューリングされます。Pod 内のすべてのコンテナはリソースおよび依存関係を共有し、実行と終了を調和させることができます。たとえば、Pod に、アプリケーション コンテナの実行前に実行される「init」コンテナを含めて、後続のアプリケーション用に環境を設定することもできます。
通常、Pod はコントローラによって作成されます。コントローラは、障害が発生した Pod の交換、必要に応じた Pod のレプリケーション、Pod が完了または不要になった場合のクラスタ ノードからの Pod の退避など、Pod のライフサイクルを自動的に管理できます。
コントローラは、Pod テンプレートの情報を使用して Pod を作成し、実行中の Pod が Pod テンプレートで定義されたデプロイメントと一致するようにします(たとえば、デプロイメントで定義された数と一致するようにレプリカを作成します)。
Pod 間の通信方法
作成された Pod には、それぞれ一意の IP アドレスが割り当てられます。Pod 内に複数のコンテナがある場合、コンテナ同士は localhost だけで通信することができます。Pod 外部との通信は、ポートを公開することで実現されます。Kubernetes では、クラスタ内のすべての Pod にクラスタのプライベート IP アドレスが割り当てられます。クラスタ内の Pod 間の通信はこれに基づいて行われ、Pod 間のリンクを明示的に作成する必要も、コンテナ ポートをホスト ポートにマッピングする必要もありません。これにより、クラスタ内のすべての Pod が NAT なしに互いを認識できます。
基本的な kubectl コマンド
kubectl には多数のコマンドが用意されており、ユーザーは Pod を作成したり、デプロイメントを使用して Pod を実行したり、実行中の Pod のステータスを確認したり、不要になった Pod を停止したりすることができます。コマンドのエンコードには、JSON(JavaScript Object Notation)コマンドまたは YAML(YAML Ain't Markup Language)コマンドが有効です。
よく使われる kubectl コマンドを以下に示します。
Get
kubectl get コマンドは、1 つ以上のリソースに関する情報を表形式で表示します。ラベル セレクターを使用すると、情報をフィルタリングできます。自身のネームスペースの情報だけを表示することも、クラスタ内のすべてのネームスペースの情報を表示することもできます。
「kubectl api-resources」コマンドを実行すると、情報を取得(get)できるサポート対象のリソースの一覧が表示されます。kubectl get コマンドの一般的な形式は次のとおりです。
$ kubectl get [(-o|--output=)json|yaml|wide|custom-columns=...|custom-columns-file=...|go-template=...|go-template-file=...|jsonpath=...|jsonpath-file=...](TYPE[.VERSION][.GROUP] [NAME | -l label] | TYPE[.VERSION][.GROUP]/NAME ...)[flags]
Pod の作成
Pod は、次の形式で create コマンドを使用して作成します。
$ kubectl create -f FILENAME
コマンドの例:
「kubectl create -f ./mypod.yaml」 を実行すると、「mypod」という YAML ファイルから新しい Pod が作成されます。
Pod の削除
「kubectl delete -f ./mypod.yaml」コマンドを実行すると、クラスタから「mypod」という Pod が削除されます。Pod の削除はグレースフル プロセスです。Pod は、猶予期間(デフォルトは 30 秒)だけ実行が継続されてから強制的に終了されます。猶予期間の値は、必要に応じて –grace-period フラグで上書きできます。
関連するソリューションおよび製品
エンタープライズ対応の Kubernetes ランタイム
マルチクラウド インフラストラクチャ全体の運用を効率化
Kubernetes と Docker
コンテナの運用で成功するために必要なツール
Kubernetes 上の Docker コンテナ
概要を理解した後の次のステップ:コンテナと Kubernetes の連携