Kubernetesは複数の要素で構成され、その中の1つがPodです。Podは最も基本的で重要な要素とされ、Kubernetesの機能を支えています。本記事では、k8s Podに関する情報を詳しく解説します。
まずはPodの意味から理解し、次にその他の詳細に進みます。
Podとは、機能するKubernetesクラスターが持つ単一かつ独立したインスタンスを意味します。Kubernetesエコシステムにおける最小の実行可能単位です。
より広い意味では、Podは次のように説明できます:
Containers
Podには1個または複数のコンテナが含まれることがあります。多くの場合、Pod内にはDockerコンテナが配置され、Pod起動時に複数のコンテナが動作し、一つのまとまりとして管理されます。
Resources
Podが持つリソースは、その中のコンテナと共有されます。通常はPodには1個のコンテナのみが含まれますが、高度なユースケースでは1つのPodに複数のコンテナを実行する場合もあります。
引き継がれるコンテナの機能性を維持するため、k8s Podは共有ストレージやネットワークリソースを備えています。
ネットワークリソースについては、Podには自動割り当てされた固有のIPアドレスが付与され、すべてのコンテナは同一のネットワークポート、IP、namespaceを共有します。
各コンテナはlocalhostを通じて相互に通信します。そのため、必要に応じた共有ストレージボリュームがPod内で定義されます。
SSH in k8s
Podの重要性を理解するためには、Kubernetes PodにおけるSSHの役割も押さえる必要があります。SSHの利用は、パブリックおよびプライベートクラウド上でPodを安全に保つための簡単な方法です。SocketXPはk8s PodでSSHを利用するための認定ツールです。
Nodes
Podはクラスター内のノード上で動作します。プロセスが継続する限りPodはそのノードに留まり、削除されるまでノードから離れません。
リソース不足やノードの故障により、Podがノードから切り離される場合もあります。Podはノードに依存せず、ノードの故障が発生すると自動的にPodが削除されます。
Variables
Kubernetes Podの環境変数とは、設定ファイルで宣言される変数のことです(記事下部のPod作成のセクションを参照ください)。
Podの基本的な意味が理解できたら、その役割を見ていきます。コントローラーがPodを作成し、さまざまな用途に利用します。たとえば:
これは1つのPodに1つのコンテナのみを含む、最も単純なPodタイプです。ワークロード展開によく利用され、生成も簡単でkubectlコマンド1つで作成できます。以下は例です:
apiVersion: v1
kind: Pod
metadata:
name: Tomcat
spec:
containers:
- name: Tomcat
image: tomcat: 8.0
ports:
containerPort: 7500
imagePullPolicy: Always
その名の通り、このPodタイプは1つのPodに複数のコンテナを含みます。主にメインコンテナとサブコンテナを同時に展開する際に利用され、メインコンテナはアプリホスティングを、サブコンテナは監視やログ集約などの補助機能を担います。
複数のコンテナを扱うため、マルチコンテナPodの管理はやや複雑です。各Podは相互に通信可能です。以下はKubernetes PodのYAMLで作成した例です。
apiVersion: v1
kind: Pod
metadata:
name: Tomcat
spec:
containers:
- name: Tomcat
image: tomcat: 8.0
ports:
containerPort: 7500
imagePullPolicy: Always
- name: Database
image: mongoDB
ports:
containerPort: 7501
imagePullPolicy: Always
Kubernetesは主にワークロード展開のためにPodを利用します。使用するPodの種類に応じ、さまざまな機能が提供されます。たとえば、スタティックPodはk8sのセルフホストのコントロールプレーンの実行に役立ちます。
マルチコンテナPodは、含まれる全コンテナを統一的に管理します。各Podは特定アプリの単一インスタンスの実行を担い、k8s環境ではアプリの水平スケールに利用されます。
Podは短命であり、さまざまな理由により削除・無効化される場合があります。Podが終了すると、その存在は完全に消去されます。Podは利用者やコントローラーによって削除されるまで機能し続けます。
Podに問題が発生しても自己修復は行われず、コントローラーの介入が必要です。Podのライフサイクルはノードに依存しており、ノードが故障または削除されると、連動するPodも削除または停止します。PodStatus APIオブジェクトは各Podの一部で、statusフィールドでその詳細が示されます。
Podはそのライフサイクルの間、以下のフェーズのいずれかに存在します。
このフェーズでは、Podは完全に作成されクラスターに追加されますが、1つ以上のコンテナが動作を開始していないため、完全な稼働状態には至りません。加えて、ノード上での待機時間やイメージのダウンロード時間もこのフェーズに含まれます。
Podがノードに接続され、全てのコンテナが動作していれば、Runningフェーズにあるとされます。
Pod内のすべてのコンテナが正常に終了すると、Succeededフェーズとなります。
ノード故障などにより、1つまたは複数のコンテナが終了するとFailedフェーズになります。
Podの状態が不明な場合はUnknownフェーズにあるとされます。
KubernetesにおけるPodの基本的な意味を理解するために、別々のPodを生成することは推奨されません。むしろ、複数の同一Pod(レプリカ)を生成する方法が推奨されます。
これらのPodの管理(ライフサイクル管理、Pod数の変更、水平スケーリングなど)はコントローラーによって行われます。デバッグや検査、トラブルシューティングの際も、コントローラーを経由する必要があります。
次に、YAMLを利用してPodを作成するためのファイルを開くか、CLIコマンドを実行してPodを作成できます。YAML構成の場合、構文は以下の通りです:
apiVersion: v1
kind: Pod
metadata:
…
…
…
spec:
…
…
…
一方、Pod作成用CLIコマンドの構文は以下の通りです:
kubectl run pod_name --image name_of_image:tag
各Podは、機能を維持するために一定のCPU、ストレージ、メモリを要求します。Podが起動すると、これらのリソース確保のためのリクエストがKubernetesに送信され、適切なノード上の領域が確保されます。
リクエストに応答が得られない場合、ノードのリソースが不足していることを意味し、Podが正常に動作しなくなります。Podリクエストを設定する際は、以下の点に注意してください。
前述の通り、Podはノード上で動作します。Podリミットとは、Podがノード上で消費できるCPUやメモリの量を指します。通常はリミットは設定されませんが、リソースの効率的な配分のため、Podリミットを設定することが推奨されます。
また、Podリミットに加えて、1つのPodに含まれるコンテナ数を制限することも可能です。コンテナリミットのみの場合、Podリミットは各コンテナリミットの合計となります。Podリミットとコンテナリミットの両方を設定する場合は、コンテナリミットの合計がPodリミットを超えないようにしてください。
不要になったPodを削除するには、$ kubectl delete pods <pod-name> コマンドを使用してください。Podの存在は完全に消去されます。
共有PodやレプリカPodを利用している場合は、先にレプリカPodを削除するようご注意ください。
前述の通り、コンテナはPod内に存在し、Podは1個または複数のコンテナを内包します。
コンテナは、アプリ開発を支えるためのアプリや実行環境の集合体として機能的な存在です。基本的には、Podが動作する際にKubernetesが利用するネットワークやストレージの構成を備えています。
Podは自律的な上位構造であり、コンテナは独立した下位構造です。Podはコンテナを内包できますが、コンテナ単体では動作せず、Podに含まれて初めて機能します。
一方、Podは独立した単位としてノード上で直接動作します。コンテナは、大量の貨物であるPodの一部とみなすことができ、Podから切り離されると目的地に到達できなくなります。
Kubernetesはコンテナ、Pod、ノードで構成されています。先ほどのコンテナとPodの違いに続き、今回はノードとPodの違いを見てみます。Podが貨物なら、ノードはその貨物を運ぶ運送パートナーに相当します。
ノードは、物理機または仮想マシンとして存在するk8sクラスター内の要素です。ノードの役割は、Podを動作させるための環境を提供することです。
各Podはノード上で特定のメモリを要求します。ノードはアプリが動作するための理想的なホスティング環境を提供し、Podはアプリの定義や展開において重要な役割を果たします。
PodはKubernetesのワークロードにとって欠かせない存在であり、ノードはKubernetesインフラの根幹となります。ノードはPodのホスティングに必要ですが、ノード自体はPodに依存しません。
Podはシームレスなワークロード展開を可能にするため、Kubernetesにおいて重要な役割を担っています。本記事では、Podについて詳しく解説しました。主なポイントは以下の通りです:
Kubernetesを利用する際には、Podの理解とその処理について知識を深めることが重要です。
最新情報を購読