【ITニュース解説】Pod - The smallest unit in Kubernetes
2025年09月06日に「Dev.to」が公開したITニュース「Pod - The smallest unit in Kubernetes」について初心者にもわかりやすいように丁寧に解説しています。
ITニュース概要
Podは、Kubernetesでアプリケーションを動かすための最小単位だ。一つまたは複数のコンテナを内包し、互いにリソースを共有する。簡単なアプリをPodとしてデプロイし、実行する手順を通じて、Podの基本的な役割と仕組みが学べる。
ITニュース解説
システムエンジニアを目指す初心者がKubernetesの世界に足を踏み入れる際、まず理解すべき最も基本的な要素が「Pod」である。PodはKubernetesにおけるアプリケーションのデプロイと実行の最小単位であり、これなくしてKubernetesは語れない。たとえ将来的にPodを直接操作する機会が少なくても、その概念を深く理解することはKubernetes全体のアーキテクチャを把握する上で不可欠だ。
Podは一つ、または複数のコンテナを内包する。コンテナとは、アプリケーションとその実行に必要なすべての要素(コード、ランタイム、システムツール、ライブラリなど)を一つのパッケージにまとめたもので、隔離された環境でアプリケーションを実行できる技術だ。例えば、Node.jsで書かれたWebアプリケーションを実行する場合、Node.jsのランタイムや必要なライブラリを含むコンテナを作成し、そのコンテナをPodの中で実行する。
Podの中に複数のコンテナが存在する場合、それらのコンテナはPodが持つリソース、具体的にはネットワークやストレージなどを共有する。これは、まるで同じ物理サーバー上で動作する複数のプロセスがネットワークインターフェースやファイルシステムを共有するのと似ている。これにより、密接に連携する必要があるアプリケーションのコンポーネントを一つのPodとしてまとめ、効率的に管理することが可能になる。例えば、メインのアプリケーションコンテナに加えて、ログを収集するサイドカーコンテナや、設定ファイルを同期する初期化コンテナなどを一つのPodに配置することが考えられる。
実際にPodをデプロイする手順を見てみよう。Kubernetesでは、アプリケーションの構成やデプロイ方法をYAML形式のファイルで記述することが一般的だ。このファイルを「マニフェスト」と呼ぶ。
まず、Podのマニフェストファイルtest.yamlを作成する。
apiVersion: v1は、使用するKubernetes APIのバージョンを指定する。これにより、KubernetesクラスターがこのマニフェストをどのAPIスキーマで解釈すべきかを判断する。v1は最も基本的なAPIバージョンだ。
kind: Podは、このマニフェストがPodというリソースを定義していることを明示する。KubernetesにはPod以外にもDeploymentやServiceなど様々なリソースが存在するため、このkindフィールドでその種類を区別する。
metadata:セクションには、リソースに関するメタ情報、つまり「リソースそのものではないが、リソースを管理するために必要な情報」を記述する。name: hello-podは、このPodに「hello-pod」という名前を付けることを意味する。Kubernetesクラスター内で一意の名前である必要がある。
spec:セクションは、Podの具体的な仕様、つまり「このPodをどのように動かしたいか」という情報を定義する。
containers:は、このPod内で実行するコンテナのリストを指定する。Podは一つ以上のコンテナを持つことができるため、リスト形式で記述する。
- image: okteto/hello-world:nodeは、コンテナを作成するために使用するDockerイメージを指定する。「okteto/hello-world:node」という名前のイメージは、あらかじめDocker Hubのようなコンテナイメージレジストリに公開されているNode.js製の「Hello World」アプリケーションイメージを指す。Kubernetesはこの指定されたイメージをレジストリからダウンロードしてコンテナを生成する。
name: hello-podは、このコンテナに「hello-pod」という名前を付ける。Pod内の複数のコンテナを区別するために使用される。
ports:は、コンテナがリッスンする(外部からの接続を待つ)ポート情報を定義する。
- containerPort: 3000は、コンテナ内部でアプリケーションがポート3000番を使用していることを示す。これはPodの外部に公開されるポートではなく、あくまでコンテナ内部でのポート番号である。
protocol: TCPは、このポートでTCPプロトコルを使用することを指定する。
このYAMLファイルを作成したら、Kubernetesクラスターにデプロイする。それにはkubectl apply -f test.yamlというコマンドを実行する。kubectlはKubernetesクラスターを操作するためのコマンドラインツールで、applyは指定されたマニフェストファイルの内容をクラスターに適用するコマンドだ。-fオプションで対象のファイル名を指定する。このコマンドを実行すると、Kubernetesマスターノードがマニフェストを解析し、「hello-pod」という名前のPodを作成し、指定されたコンテナイメージに基づいてコンテナを起動する。
Podが正常にデプロイされたかを確認するには、kubectl get podコマンドを使用する。このコマンドは現在Kubernetesクラスターに存在するPodの一覧とそのステータスを表示する。もしhello-podという名前のPodがRunningというステータスで表示されれば、Podは正常に動作している。もしContainerCreatingなどのステータスが表示された場合は、コンテナイメージのダウンロードや起動に時間がかかっている可能性があるため、しばらく待ってから再度確認する必要がある。
Podが起動していることを確認したら、アプリケーションにアクセスしてみよう。通常、Kubernetesクラスター内のPodは外部ネットワークから直接アクセスできないようになっている。しかし、テスト目的で一時的にアクセスしたい場合、「ポートフォワーディング」という機能を利用できる。
kubectl port-forward pod/hello-pod 3000:3000コマンドは、ローカルマシン(コマンドを実行した場所)のポート3000番と、Kubernetesクラスター内のhello-podのコンテナ内部のポート3000番を直接接続する。これにより、ローカルマシンのポート3000番へのアクセスが、hello-pod内部のアプリケーションに転送されるようになる。
このコマンドを実行した状態で、別のターミナルを開き、curl localhost:3000を実行してみる。もし「hello message」のような応答があれば、無事に最初のKubernetesアプリケーションをデプロイし、アクセスすることに成功したことになる。
ここまででPodのデプロイと動作確認の方法を学んだが、実際の運用現場では、Podを直接デプロイすることは稀だ。なぜなら、Podは一度作成するとその状態が固定され、スケーリング(Podの数を増減させること)や自動回復(Podがクラッシュした場合に自動的に再起動すること)といった高度な機能が提供されないからだ。 実際のアプリケーションでは、通常「Deployment」や「StatefulSet」、「DaemonSet」といった、Podを管理するための上位のリソースを使用する。これらのリソースは、Podの自動的な生成、更新、スケーリング、障害時の回復などを自動的に行ってくれる。しかし、これらの上位リソースも、その内部では最終的にPodを作成し、管理しているため、Podの基本的な振る舞いを理解しておくことは非常に重要なのである。 今回紹介した内容は、Kubernetesの最も土台となる部分であり、このPodの理解が、より複雑なKubernetesの概念を学ぶための第一歩となるだろう。将来的にラベルや名前空間を使ったPodのグループ化や管理といった、さらに進んだトピックへと繋がっていく。