オウルです。
Kubernetes はコンテナオーケストレーションプラットフォームです。Pod は、Kubernetes クラスターでアプリケーションを動作させる(デプロイする)最小単位になります。それでは、初心者(オウル)目線で分かりやすく Pod を前編・後編に分けて説明したいと思います。今回は前編です。
Kuberbetes における Pod
冒頭でも言いましたが、Kubernetes 上の最小単位はコンテナではなく、Pod になります。どういうことかというと下がイメージになります。

Pod 内の各コンテナはそれぞれの cgroup 上で動作しますが、Linuxネームスペースの多くを共有します。ん?cgroup?Linuxネームスペース?となった方は、「初心者でもDockerのうれしいことが分かってしまう!!」を見てください。
つまり、
同じ Pod 内のアプリケーションは、同じIPアドレスとポート(ネットワークネームスペース)を使用し、同じホスト名(UTSネームスペース)を持ち、System VIPC や POSIX メッセージキューを経由したネイティブなプロセス間通信チャネル(IPC ネームスペース)を使って通信できます。
同じIPアドレスとポートという点での具体例を挙げると、ローカルのパソコンに、IIS と Apache のWebサーバが同居している場合は、どちらか一方しか 80 ポートを使用できませんよね。Pod 内のコンテナ同士はネットワーク的に隔離されていません。もちろん別 Pod とは分離されています。
・同じ Pod 内のアプリケーションは、同じIPアドレスとポート(ネットワークネームスペース)を使用
Pod のデザインパターン
パターン | 役割 |
サイドカーパターン | メインコンテナに機能を追加する |
アンバサダーパターン | 外部システムとのやり取りの代理を行う |
アダプターパターン | 外部からのアクセスのインターフェースとなる |
デザインパターンはプログラミングの経験がある人であればお馴染みですね。有名な書籍だと ↓ が有名かと思います。個人的には ”Chain of Responsibility” が好きです。
上記のパターンの中でサイドカーパターンについて少し紹介します。
サイドカーパターン
代表的な例として、”Web アプリケーションコンテナ” と ”Git コンテナ” です。Git リポジトリとローカルストレージ(下の図の共有ストレージ)を同期、We アプリケーションコンテナは同期のとれたローカルストレージのファイルを参照するといったパターンです。

Pod マニフェストでデプロイ
Pod 構成で一番多いのは、Pod:コンテナ = 1:1 です。ではこれから、その構成で、Pod の理解を深めるのに有効な kuard をデプロイしてみます(kuard は Sevice オブジェクトのサービスディスカバリーの理解にも有効なアプリケーションです)
マニフェスト作成
1 2 3 4 5 6 7 8 9 10 11 12 |
apiVersion: v1 kind: Pod metadata: name: kuard spec: containers: - image: gcr.io/kuar-demo/kuard-amd64:1 name: kuard ports: - containerPort: 8080 name: http protocol: TCP |
便利な無料エディタ
僕はマニフェストファイル作成するのに、Microsoftが提供するオープンソースのソースコードエディタの Visual Studio Code(無償)を使用しています。Visual Studio Code を使用する場合は、Visual Studio Marketplaceで提供されている ”Kubernetes Support” のインストールをお勧めします。なぜかというと、YAML は構造化されたデータを主にインデントを使って構造を表現するため、入力間違いが多くなってしまいがちですが、コード スニペットでより正確に作成できるからです。
デプロイ
1 2 3 4 |
# # 作成したマニフェストファイルで kuard をデプロイします kubectl apply -f .\kuard-pod-deploy.yaml pod "kuard" created |
Pod の一覧
デプロイした kuard が動作しているか確認します。
1 2 3 4 5 |
# # Pod の一覧を取得します kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE kuard 1/1 Running 0 9s 10.1.0.156 docker-for-desktop |
「STATUS」を確認すると「Running」になっています。問題なくデプロイできたようです。
Pod の「STATUS」には「Running」以外にもあります。正常にデプロイできた時は良いのですが、自分で作成したアプロケーションをデプロイする時はエラーが発生することがあります。「STATUS」を確認することで、”どこで” エラーが発生しているのかを見つけるヒントになります。
僕は、コンテナが起動しない、しないって調査をしている時に「STATUS」を見ると「Completed」だったっていうオチがありました。下記のURLに各「STATUS」の説明があります。
Pod の詳細情報
デプロイした Pod の詳細情報を確認することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# # Pod の詳細情報を確認します kubectl describe pod/kuard Name: kuard Namespace: default Node: docker-for-desktop/192.168.65.3 Start Time: Mon, 25 Feb 2019 13:48:18 +0900 Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"kuard","namespace":"default"},"spec":{"containers":[{"image":"gcr.io/kuar-demo/kua... Status: Running IP: 10.1.0.156 Containers: kuard: Container ID: docker://c740bccd8662c47c1ad917fce0a9fadbb474d84aa9ba259b89f78d56d7682b69 Image: gcr.io/kuar-demo/kuard-amd64:1 Image ID: docker-pullable://gcr.io/kuar-demo/kuard-amd64@sha256:bd17153e9a3319f401acc7a27759243f37d422c06cbbf01cb3e1f54bbbfe14f4 Port: 8080/TCP Host Port: 0/TCP State: Running Started: Mon, 25 Feb 2019 13:48:25 +0900 Ready: True Restart Count: 0 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-jdcv9 (ro) Conditions: Type Status Initialized True Ready True PodScheduled True Volumes: default-token-jdcv9: Type: Secret (a volume populated by a Secret) SecretName: default-token-jdcv9 Optional: false QoS Class: BestEffort Node-Selectors: <none> Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s node.kubernetes.io/unreachable:NoExecute for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 15m default-scheduler Successfully assigned kuard to docker-for-desktop Normal SuccessfulMountVolume 15m kubelet, docker-for-desktop MountVolume.SetUp succeeded for volume "default-token-jdcv9" Normal Pulling 15m kubelet, docker-for-desktop pulling image "gcr.io/kuar-demo/kuard-amd64:1" Normal Pulled 15m kubelet, docker-for-desktop Successfully pulled image "gcr.io/kuar-demo/kuard-amd64:1" Normal Created 15m kubelet, docker-for-desktop Created container Normal Started 15m kubelet, docker-for-desktop Started container |
Pod の詳細情報が表示されました。Pod の基本情報(デプロイした名前空間、ノードなど)に続いて、Pod 内のコンテナ情報(Docker イメージ、ポート番号など)、最後にイベントログです。この詳細情報は、Kubernetes の理解が深まるにつれて、各項目が何を意味しているのか次第に分かってくると思います。僕もそうですが、最初は「Events:」をよく見ます。なぜなら、初心者はエラーが発生して上手くいかないことが多いですからね。
Pod の削除
先ほどデプロイした kuard Pod を削除をします。
1 2 3 4 5 6 7 8 9 10 |
# # kuart Pod を削除します # デプロイ時のマニフェストファイルを使う場合 kubectl delete -f ./kuard-pod-deploy.yaml # マニフェストファイルを使わない場合 kubectl delete pod/kuard # 削除できたか、一覧で確認します kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE kuard 0/1 Terminating 0 33m 10.1.0.156 docker-for-desktop |
Pod の削除コマンドを実行しても、すぐには削除されません。削除後の Pod 一覧確認コマンドで「STATUS」が「Terminating」になっていることが分かります。これは、デフォルトで30秒の削除の猶予期間があるためです。「Terminating」に移行すると、該当の Pod は新しいリクエストは受け付けません。この猶予期間で既に受け付けたリクエストを完了させるようになります。
Pod にアクセス
今回はKubectl コマンドのポートフォワードで kuard Pod にアクセスします。
1 2 3 |
# # kuard Pod にアクセスします kubectl port-forward kuard 8080:8080 |

http://localhost:8080 でアクセスして kuard が表示されれば成功です。
おススメ書籍
1.6,5 のバージョンで解説(リポジトリ、注釈は翻訳時の最新1.9で更新)されています。バージョンは少し古いですが、初心者の入門書(おえるべきポイントはしっかり網羅されてる)としては、途中で挫折しない適度なボリューム(本の厚さ)で、とっかかりとしては良い本になっています。
僕は「入門 Kubernetes」⇒「Kubernetes完全ガイド」(現在進行形)という進み方をしていますが、より本番環境を想定した方法を学べます。特にWeb 系だと、https で使用する Ingress リソースなどもしっかり説明してくれています。「入門 Kubernetes」には、詳しい説明がなかったので個人的にはすごく助かっています。