Google Cloud Platformに戻る | GKE (Google Kubernetes Engine)に戻る

GKEのPod(ポッド)

Podとは

Pod(ポッド)は、Kubernetesにおける最小のデプロイ単位であり、Google Kubernetes Engine (GKE)でアプリケーションを実行する基本的な構成要素です。Podは1つ以上のコンテナをグループ化し、それらが同じ実行環境を共有できるようにします。これらのコンテナは同じノード上で実行され、同じネットワーク名前空間、IPアドレス、ポート空間を共有します。

重要なポイント

Podは一時的(エフェメラル)なリソースとして設計されています。ノードの障害、リソース不足、または他の理由でPodが終了した場合、Kubernetesは自動的に新しいPodを作成して置き換えることができます。このため、永続的なデータはPodの外部(例:永続ボリューム)に保存する必要があります。

Podの構造と構成要素

Podは以下の主要な構成要素で構成されています:

構成要素 説明
コンテナ Pod内で実行されるDockerなどのコンテナ。メインアプリケーションコンテナとサイドカーコンテナ(補助的な機能を提供)が含まれることがある
ボリューム Pod内のコンテナ間でデータを共有するためのストレージ。Pod内のすべてのコンテナからアクセス可能
ネットワーク名前空間 Pod内のすべてのコンテナが共有するネットワーク設定。各Podには固有のIPアドレスが割り当てられる
リソース仕様 CPUやメモリなど、Podが要求または制限するリソースの量
ラベルとアノテーション Podを識別・分類するためのメタデータ
セキュリティコンテキスト Pod内のコンテナの実行権限や分離レベルを定義

Podのライフサイクル

Podは以下のライフサイクルフェーズを経ます:

  1. Pending(保留中): Podが作成されたが、すべてのコンテナがまだ実行状態になっていない状態
  2. Running(実行中): Podがノードにスケジュールされ、すべてのコンテナが作成され、少なくとも1つのコンテナが実行中または起動/再起動中
  3. Succeeded(成功): Pod内のすべてのコンテナが正常に終了し、再起動されない状態
  4. Failed(失敗): Pod内の少なくとも1つのコンテナが失敗して終了
  5. Unknown(不明): 何らかの理由でPodの状態を取得できない状態

Podのライフサイクルを確認するコマンド

kubectl get pod my-pod -o wide
kubectl describe pod my-pod

Pod条件(Conditions)

Podの状態をより詳細に表す条件フラグ:

Podの作成と管理

GKEでPodを作成・管理するには、通常以下の方法を使用します:

YAMLマニフェストを使用したPodの作成

基本的なPodマニフェストの例

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.21
    ports:
    - containerPort: 80
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

このマニフェストをapplyコマンドで適用します:

kubectl apply -f nginx-pod.yaml

直接Podを作成する代わりに上位レベルのリソースを使用する

実際の運用環境では、単独のPodを直接作成するよりも、Deployment、StatefulSet、DaemonSetなどの上位レベルのコントローラーを使用することが推奨されます。これらのコントローラーはPodの自動再起動、スケーリング、ローリングアップデートなどの機能を提供します。

マルチコンテナPod

1つのPodに複数のコンテナを配置することで、密接に関連するプロセスを一緒に実行できます:

マルチコンテナPodの例

apiVersion: v1
kind: Pod
metadata:
  name: web-app
spec:
  containers:
  - name: web
    image: nginx:1.21
    ports:
    - containerPort: 80
  - name: log-collector
    image: fluentd:v1.14
    volumeMounts:
    - name: log-volume
      mountPath: /var/log/nginx
  volumes:
  - name: log-volume
    emptyDir: {}

一般的なPodパターン

Podのリソース管理

GKEでPodのリソースを効率的に管理するには、リソース要求(requests)と制限(limits)を適切に設定することが重要です:

リソース要求と制限

リソース要求と制限の設定例

apiVersion: v1
kind: Pod
metadata:
  name: resource-demo
spec:
  containers:
  - name: app
    image: nginx
    resources:
      requests:
        memory: "128Mi"
        cpu: "500m"
      limits:
        memory: "256Mi"
        cpu: "1000m"

リソース単位

CPUリソースは「m」(ミリCPU)で指定され、1000mが1コアに相当します。メモリリソースはMi(メビバイト)やGi(ギビバイト)などの単位で指定されます。

QoS(Quality of Service)クラス

Kubernetesは、リソース要求と制限の設定に基づいて、各Podに以下のQoSクラスを自動的に割り当てます:

リソース不足が発生した場合、Kubernetesは優先度の低いQoSクラス(BestEffort、次にBurstable)のPodから終了させます。

Podのネットワーキング

GKEにおけるPodのネットワーキングの主な特徴:

Pod IPの確認方法

kubectl get pod nginx-pod -o wide

ネットワークポリシー

GKEでは、NetworkPolicyリソースを使用してPod間の通信を制限できます:

基本的なネットワークポリシーの例

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-backend
spec:
  podSelector:
    matchLabels:
      app: backend
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 8080

Podのストレージ

GKEのPodでデータを永続化するためのオプション:

ボリュームタイプ

PersistentVolumeClaimを使用したPodの例

apiVersion: v1
kind: Pod
metadata:
  name: database-pod
spec:
  containers:
  - name: db
    image: mysql:8.0
    volumeMounts:
    - name: data-volume
      mountPath: /var/lib/mysql
  volumes:
  - name: data-volume
    persistentVolumeClaim:
      claimName: mysql-pvc

Podのセキュリティ

GKEでPodのセキュリティを確保するためのベストプラクティス:

セキュリティコンテキスト

securityContextを使用して、Podまたはコンテナレベルでセキュリティ設定を構成できます:

セキュリティコンテキストの例

apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo
spec:
  securityContext:
    runAsNonRoot: true
    fsGroup: 1000
  containers:
  - name: app
    image: nginx
    securityContext:
      allowPrivilegeEscalation: false
      capabilities:
        drop:
        - ALL
      readOnlyRootFilesystem: true

その他のセキュリティベストプラクティス

Podのヘルスチェックとプローブ

GKEでは、以下の3種類のプローブを使用してPodの健全性を監視できます:

プローブの設定例

apiVersion: v1
kind: Pod
metadata:
  name: probe-demo
spec:
  containers:
  - name: app
    image: nginx
    ports:
    - containerPort: 80
    livenessProbe:
      httpGet:
        path: /healthz
        port: 80
      initialDelaySeconds: 15
      periodSeconds: 10
    readinessProbe:
      httpGet:
        path: /ready
        port: 80
      initialDelaySeconds: 5
      periodSeconds: 5

Podのデバッグとトラブルシューティング

GKEでPodの問題をトラブルシューティングするための一般的なコマンドとテクニック:

Podの状態確認

kubectl get pods
kubectl describe pod <pod-name>

ログの確認

kubectl logs <pod-name>
kubectl logs <pod-name> -c <container-name>  # マルチコンテナPodの場合

Podへの接続

kubectl exec -it <pod-name> -- /bin/bash
kubectl exec -it <pod-name> -c <container-name> -- /bin/bash  # マルチコンテナPodの場合

一般的な問題と解決策

問題 考えられる原因 解決策
Podが「Pending」状態 リソース不足、PVCのプロビジョニング待ち kubectl describe podでイベントを確認
クラスタのリソース状況を確認
Podが「CrashLoopBackOff」状態 コンテナの起動失敗、アプリケーションのクラッシュ kubectl logsでログを確認
コンテナの設定とアプリケーションコードを確認
Podが「ImagePullBackOff」状態 イメージが見つからない、プライベートレジストリの認証失敗 イメージ名とタグを確認
イメージプルシークレットを設定
Podが「Error」または「Completed」状態 ジョブまたはバッチ処理の完了または失敗 kubectl logsで実行結果を確認
必要に応じてジョブ設定を調整

GKE Autopilotにおけるポッド

GKE Autopilotモードでは、Podの管理方法に以下の特徴があります:

Autopilotでのベストプラクティス

Autopilotでは、アプリケーションの実際の要件に基づいて正確なリソース要求を設定することが特に重要です。過大な要求はコストの増加につながり、過小な要求はパフォーマンスの問題を引き起こす可能性があります。

まとめ

Podは、GKEおよびKubernetesにおけるアプリケーション実行の基本単位です。効果的なPod設計と管理は、GKEでのアプリケーションの信頼性、スケーラビリティ、セキュリティを確保するために不可欠です。

Podを効果的に活用するためのポイント:

これらの原則に従うことで、GKEでのコンテナ化アプリケーションの運用を効率化し、安定したサービス提供を実現できます。