Pod 概要

Pod 概要

Kubernetes Workloads APIs

Kubernetes における Workload とは、コンテナーを実行するためのリソースに関連するものを指します。Workloads APIs には次の種類があります。

  • Pod
  • ReplicationController
  • ReplicaSet
  • Deployment
  • DaemonSet
  • StatefulSet
  • Job
  • CronJob

Pod

Pod は Kubernetes において最小の Workload リソース単位です。Pod は 1 つ以上のコンテナーで構成されます。1 つの Pod には 1 つの IP アドレスが割り当てられ、Pod 内で複数のコンテナーがある場合は異なるポート番号を用いて通信することができます。これにより、Pod 内では localhost 宛でコンテナー間の通信を実現できます。

通常、コンテナーは 1 つで 1 つのアプリケーションを実行するように利用されます。そのため、1 Pod = 1 コンテナーとして使われることも多いですが、この場合でも Kubernetes から管理する対象は Pod としてラッパーされたワークロードです。

Pod のリソース設計として、短命であることを考慮して設計する必要があります。Pod はコントローラーによって自動修復や削除が行われる可能性があるため、永続的な展開を前提とした設計は避けることが望ましいです。

Pod には命名規則 (RFC 1123) があり、次のような条件に従う必要があります。

  • 使用可能な文字 : 英小文字、数字
  • 使用可能な記号 : 「-」、「.」
  • 始まりと終わりの文字は英小文字

Pod は最小のリソースのため単純な構成にすることが多いですが、補助的な機能を付加するために複数のコンテナーを内包する構成をとる場合があります。しかし、Web サーバーのコンテナーとデータベース サーバーのコンテナーといった、主要な機能のコンテナーを複数内包するような構成は、個々のコンテナーの拡張性や管理性の観点から一般的には推奨されません。

Pod デザイン パターン

Pod のデザイン パターンには主に次の 3 種類があります。

パターン説明
サイドカー パターンメイン コンテナーに役割を追加する
アンバサダー パターン外部システムとのやりとりを代理で行う
アダプター パターン外部からのアクセスに対するインタフェースとなる

サイドカー パターン

メイン コンテナーに機能を追加する構成として用いられます。補助的な機能を提供するコンテナーを内包します。主にはコンテナーの設定やデータの管理を動的に管理する目的で利用されます。

  • 特定の変更を検知し、動的な設定の変更を行う
  • 外部リポジトリの内容を動的に検知し、ローカル ストレージに反映する
  • 外部のストレージへログをエクスポートする

アンバサダー パターン

Pod 内のコンテナーからアウトバウンドの通信を代理で行うコンテナーを内包する構成で用いられます。外部サービスへの接続機能を分離することで、アプリ本体への個別の修正や変更を行う必要がなくなります。運用環境と開発環境で異なるデータベースを利用している場合などにも利用できます。

  • データベースへの接続を代理で行う
  • アプリと外部サービスの結合性を弱める

アダプター パターン

Pod 内のコンテナーへのインバウンドの通信を代理で行うコンテナーを内包する構成で用いられます。外部サービスからのリクエストに対しての差分を吸収するためのコンテナーを利用することで、アプリに対する実装の負担を軽減します。

  • 監視サービスに合わせてアプリ側の出力ログを整形する

Pod のネットワーク構成

spec.hostNetwork で Pod のネットワーク構成を定義できます。この設定を true にすると、Pod はホスト上のネットワーク構成をそのまま利用する HostNetwork 構成になります。

  • IP アドレス
  • DNS 設定
  • hosts 設定
  • など

Pod の DNS 設定

Pod が利用する DNS の設定は spec.dnsPolicy で定義できます。設定できる値は 4 種類あります。既定では ClusterFirst の動作となります。

設定値説明
DefaultPod が稼働しているノードから名前解決の設定を継承します。
ClusterFirstPod はまずクラスター内 DNS での名前解決を試み、解決できなかった場合はノードから継承した上位の DNS サーバーへ再問い合わせします。
ClusterFirstWithHostNetClusterFirst と同様の挙動をします。HostNetwork 構成の場合に設定します。
NonePod 定義内で静的に指定します。

None を指定した場合は、spec.dnsConfig で DNS の設定を定義します。

設定値説明
nameserversDNS サーバーとして利用する IP アドレスのリストを指定します。
searches名前解決のための DNS サーチドメインのリストを指定します。
optionsキー バリュー型のオプション設定を指定します。

Pod の hosts 設定

spec.hostAliases[] で、Pod の /etc/hosts 内に静的に設定する内容を定義します。iphostnames[] の組み合わせを記述します。

Pod 簡易マニフェスト出力

次のコマンドで簡易なマニフェストを YAML 形式で出力できます。ゼロからマニフェストを作るのは意外と面倒なのでベースから必要な部分をカスタマイズしていきます。

kubectl run <Pod 名> --image <イメージ名> --dry-run=client -o yaml

実行すると次のようになります。

> kubectl run test-pod --image nginx --dry-run=client -o yaml

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test-pod
  name: test-pod
spec:
  containers:
  - image: nginx
    name: test-pod
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}