Pod(ポッド)は、Kubernetesにおける最小のデプロイ単位であり、Google Kubernetes Engine (GKE)でアプリケーションを実行する基本的な構成要素です。Podは1つ以上のコンテナをグループ化し、それらが同じ実行環境を共有できるようにします。これらのコンテナは同じノード上で実行され、同じネットワーク名前空間、IPアドレス、ポート空間を共有します。
Podは一時的(エフェメラル)なリソースとして設計されています。ノードの障害、リソース不足、または他の理由でPodが終了した場合、Kubernetesは自動的に新しいPodを作成して置き換えることができます。このため、永続的なデータはPodの外部(例:永続ボリューム)に保存する必要があります。
Podは以下の主要な構成要素で構成されています:
構成要素 | 説明 |
---|---|
コンテナ | Pod内で実行されるDockerなどのコンテナ。メインアプリケーションコンテナとサイドカーコンテナ(補助的な機能を提供)が含まれることがある |
ボリューム | Pod内のコンテナ間でデータを共有するためのストレージ。Pod内のすべてのコンテナからアクセス可能 |
ネットワーク名前空間 | Pod内のすべてのコンテナが共有するネットワーク設定。各Podには固有のIPアドレスが割り当てられる |
リソース仕様 | CPUやメモリなど、Podが要求または制限するリソースの量 |
ラベルとアノテーション | Podを識別・分類するためのメタデータ |
セキュリティコンテキスト | Pod内のコンテナの実行権限や分離レベルを定義 |
Podは以下のライフサイクルフェーズを経ます:
kubectl get pod my-pod -o wide
kubectl describe pod my-pod
Podの状態をより詳細に表す条件フラグ:
GKEで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を直接作成するよりも、Deployment、StatefulSet、DaemonSetなどの上位レベルのコントローラーを使用することが推奨されます。これらのコントローラーはPodの自動再起動、スケーリング、ローリングアップデートなどの機能を提供します。
1つの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: {}
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(ギビバイト)などの単位で指定されます。
Kubernetesは、リソース要求と制限の設定に基づいて、各Podに以下のQoSクラスを自動的に割り当てます:
リソース不足が発生した場合、Kubernetesは優先度の低いQoSクラス(BestEffort、次にBurstable)のPodから終了させます。
GKEにおけるPodのネットワーキングの主な特徴:
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
GKEの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
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
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
GKEでPodの問題をトラブルシューティングするための一般的なコマンドとテクニック:
kubectl get pods
kubectl describe pod <pod-name>
kubectl logs <pod-name>
kubectl logs <pod-name> -c <container-name> # マルチコンテナ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モードでは、Podの管理方法に以下の特徴があります:
Autopilotでは、アプリケーションの実際の要件に基づいて正確なリソース要求を設定することが特に重要です。過大な要求はコストの増加につながり、過小な要求はパフォーマンスの問題を引き起こす可能性があります。
Podは、GKEおよびKubernetesにおけるアプリケーション実行の基本単位です。効果的なPod設計と管理は、GKEでのアプリケーションの信頼性、スケーラビリティ、セキュリティを確保するために不可欠です。
Podを効果的に活用するためのポイント:
これらの原則に従うことで、GKEでのコンテナ化アプリケーションの運用を効率化し、安定したサービス提供を実現できます。