Kubernetes(K8s)의.Pod.개념을 「무엇인지 → 왜필요한지 → 核心운作모티브 → 작업프로세스 → 입문실습 → 常用문제 및 해결방안」의 논리로 전면적이며 명확하게 설명하고자 합니다. 이하 단계별로 차분히 분해하여 학습자에게 친화적인 설명을 제공하겠습니다.
- 什么是:Pod の 核心定義と特徴
Pod は Kubernetes における最小の、配置可能単位です。これを「コンテナの包み/組み合わせ」と理解してください。1つの Pod に1つ以上の密接に結びつくコンテナを含めることができ、これらは共通のネットワーク、ストレージリソースを共有し、Pod として一括して作成、スケジュール、起動、破棄されます。
核心概念と重要な特徴
- 最小配置単位:K8s は単独のコンテナを直接スケジュールしません。すべてのコンテナは Pod に包まれてからのみスケジュール及管理されます;
- 原子性管理:Pod 内のすべてのコンテナが「共生死」を遂げる —— 它們は同じノードにスケジュールされ、一緒に起動し、一緒に停止し、1つのコンテナが異常終了した場合、K8s は.Pod の再起動ポリシーに基づいて処理を行います;
- リソース共有:Pod 内のすべてのコンテナが共通のネットワーク名前空間(同じ IP アドレスとポート空間)、IPC 名前空間(ローカル プロセス間通信可能)を共有し、Pod にマウントされた ストレージ ボリューム を共有します;
- 短命性:Pod は「 일회용」です。破棄 후 다시 自動的に復元되지 않습니다(Deployment/StatefulSet 等のコントローラーによって 再建される必要があります)且建 מחדש된.Pod.IP は変化する可能性があります;
- 内蔵 Pause コンテナ:各.Pod は事前にデフォルトで 1つの Pause コンテナ(ルート コンテナ)を作成し、ネットワーク名前空間を維持し、ビジネスポッドのネットワーク共有を保証します。
- なぜ必要:解決する 核心的な課題と価値
単独のコンテナを直接管理する場合、多くの問題に直面します。Pod はこれらの課題を解決するために生まれました。
核心的な問題(Podなしの場合の課題)
- コンテナ間の連携が困難:例えば、1つのアプリ コンテナ + ログ収集用サイドカー コンテナ —— 単独配置時は、2つのコンテナ間でネットワーク/ストレージを共有するのが難しい。通信は跨节点ネットワークを通じる必要があり、複雑さが伴います;
- スケジュールの分散化:単独のコンテナを分散スケジュールすると、関連性の高いコンテナが異なるノードに配置され、ネットワーク遅延や通信コストが増大します;
- ライフサイクル管理の混乱:関連コンテナが「同時起動、同時停止」を保証できない —— 例:データベース コンテナが起動していない状態で、アプリ コンテナが誤って起動しエラーを引き起こす可能性があります;
- リソースの隔离と共有のバランスが取れない:純粋なコンテナ レベルの管理は、完全な隔離(リソースを共有できない)か完全な共有(境界がない)のいずれかに陥ります。
実際の応用価値
- 編成を簡略化:関連 コンテナを Pod にまとめて、一度のスケジュールと管理で、運用コストを削減;
- 連携性を保証:緊密に結合したコンテナ(例:主アプリ + サイドカー)を同一のノードに配置し、リソース共有、通信を効率化(localhost での通信可能);
- ** atomic 配置**:Pod として一括配置することで、一部のコンテナが成功し、一部が失敗する中途状態を防ぎます;
- フレキシブルなスケール:Deployment 等のコントローラーと組み合わせることで、Pod を通じてアプリケーションの拡張/収縮を迅速に行えます。
- 核心的な働き方:作動logyと重要な要素
Pod の 核心的な作動logy は「宣言式定義 + 状態の一貫性保証」です —— 構成者は.Pod の「期待状態」(PodSpec)を定義し、K8s は.Pod の「現状態」(PodStatus)を期待状態に一致させるようにします。
キーファクターとその関連性
| 核心的な要素 | 作用 |
|---|---|
| PodSpec | 用户が YAML/JSON で定義した Pod の期待状態(例:コンテナイメージ、リソース制限、再起動ポリシー) |
| PodStatus | Pod の現在の実行状態(例:Pending/Running/CrashLoopBackOff)を報告します(例:Kubelet が報告) |
| コンテナの種類 | ① メイン コンテナ:核のビジネス コンテナ;② Init コンテナ:メイン コンテナ起動前に実行される初期化 コンテナ(順番に実行);③ サイドカー コンテナ:メイン コンテナを補助する コンテナ(例:ログ収集) |
| Pause コンテナ | 各.Pod のルート コンテナ。Pod のネットワーク名前空間を作成し、維持します。すべてのビジネスポッドがこの名前空間を共有します |
| 再起動ポリシー | 異常終了時の再起動規則を制御(Always/OnFailure/Never) |
| リソース要求/制限 | 定义 Pod が必要とする CPU/メモリ(要求:スケジュールを保証;制限:リソースの乱用を防ぐ) |
要素の関連性のロジック
-
構成者は.PodSpec で期待状態を定義し、K8s API Server に提出;
-
K8s スケジューラーは.PodSpec のリソース要求に基づいて、Pod を適切なノードにスケジュール;
-
目的ノードの Kubelet はまず Pause コンテナを作成し、ネットワーク名前空間を初期化;
-
初期化 コンテナを順番に実行(全て終了且成功後)、メイン コンテナ/サイドカー コンテナ を起動;
-
Kubelet はコンテナの状態を監視し、PodSpec と異なっている場合(例:コンテナ崩壊)、再起動ポリシーに基づいて修復;
-
Kubelet は定期的に.PodStatus を API Server に報告し、etcd に更新します。
-
働き方:Pod の 完全な 生命周期(フローチャート付)
1つの Nginx Pod を作成する例を基に、Pod が作成から実行までの 完全な作業フロー を解説します。
Mermaid フローチャート(v11.4.1仕様に準拠)
flowchart TD A[ユーザー操作] -->|1.Pod.YAML を作成し、kubectl/API を通じて提出| B[API Server] B -->|2.YAML 合法性を検証し、PodSpec をetcdに保存| C[etcd] B -->|3.「未スケジュールPod」のイベントをプッシュ| D[Schedulerスケジューラー] D -->|4.リソース/ラベル/アフィニティ等に基づいてターゲットノードを選定| B B -->|5.「已スケジュールPod」のイベントをプッシュ| E[ターゲットノードKubelet] E -->|6.コンテナランタイム(containerd)にPause コンテナを作成するよう指示| F[Pause コンテナ] F -->|7.Init コンテナを作成し(順番に実行し、全て成功終了するまで)、メイン コンテナ/サイドカー コンテナを作成する| G[Init コンテナ] G -->|8.メイン コンテナ/サイドカー コンテナを起動| H[ビジネスポッド群] H -->|9.Kubeletが定期的にAPI ServerにPod状態を報告する| C H -->|10.コンテナの状態を監視し、異常時は再起動ポリシーに基づいて修復する| H style A fill:#f9f,stroke:#333,stroke-width:2px style H fill:#9ff,stroke:#333,stroke-width:2px
ステップ分解(通俗版)
-
定義の提出:ユーザーは.Pod の YAML 設定ファイルを作成し、
kubectl applyコマンドを通じて K8s API Server に提出; -
検証と保存:API Server はまず YAML 言語の合法性と権限を検証し、無事であれば.Pod の期待状態を etcd(K8s のデータベース)に保存;
-
スケジュール選定:スケジューラー(Scheduler)は「未スケジュールの Pod」を検出し、リソースやラベル、アフィニティ等に基づいてターゲットノードを選定;
-
ノード実行:ターゲットノードの Kubelet はスケジュール指示に基づき、まず Pause コンテナを作成し、ネットワーク環境を整備;
-
初期化操作:初期化 コンテナを順番に実行(例:設定ファイルの取得、データベース初期化)し、全て成功終了後にメイン コンテナを起動;
-
状態監視:メイン コンテナ/サイドカーが起動後、Kubelet はコンテナの状態を継続的に監視し、異常時は再起動ポリシーに基づいて修復。また定期的に.Pod 状態(例:Running)を API Server に報告;
-
破棄と削除:
kubectl delete podコマンドが実行されると、Kubelet は全てのコンテナを停止し、Pod を削除し、API Server に状態を報告します。 -
入門実践:ゼロから初めての 1つの Pod を作成する
事前条件
- K8s クラスタがインストールされている(初心者は
minikube startで単ノードクラスタを作成、またはkind create clusterでローカルクラスタを作成); kubectlコマンドラインツールが構成済み(kubectl versionでバージョンを確認)。
実践手順(Nginx Pod を例に)
手順 1:Pod.YAML 設定ファイルを作成
nginx-pod.yaml ファイルを作成し、以下のような内容を記入(注釈付きの重要なフィールドを強調):
# apiVersion:K8s API バージョン(Pod は v1)
apiVersion: v1
# kind:リソースタイプ(ここではPod)
kind: Pod
# metadata:メタデータ(名称、ラベル)
metadata:
name: nginx-demo # Pod 名称
labels:
app: nginx # ラベル(Pod を選択するため)
# spec:Pod 規格(核設定)
spec:
# コンテナのリスト(1つのPodに複数のコンテナを含めることができます)
containers:
- name: nginx-container # コンテナ名称
image: nginx:1.25 # コンテナイメージ(指定バージョンで.pull最新版の失敗を防ぎます)
ports:
- containerPort: 80 # コンテナが公開するポート
# リソースの制限(任意。ノードリソースを浪費するのを防ぎます)
resources:
requests:
cpu: "100m" # 0.1CPUをリクエスト
memory: "128Mi" # 128MBのメモリをリクエスト
limits:
cpu: "200m" # 最大使用量 0.2CPU
memory: "256Mi" # 最大使用量 256MBのメモリ
# 再起動ポリシー(デフォルトはAlways:コンテナが崩壊したら再起動)
restartPolicy: Always
手順 2:Pod を作成する
設定ファイルを提出するコマンドを実行して、Pod を作成します:
kubectl apply -f nginx-pod.yaml
出力:pod/nginx-demo created は作成成功を示します。
手順 3:Pod の状態を確認する
Pod の実行状態を確認するコマンドを実行:
kubectl get pods
出力例(STATUS が Running 时表示正常実行):
NAME READY STATUS RESTARTS AGE
nginx-demo 1/1 Running 0 10s
READY:1/1 はPod 内の 1つのコンテナが正常に起動したことを示します;RESTARTS:再起動回数(0 は再起動なし);AGE:実行時間。
手順 4:Pod 内の Nginx サービスにアクセスする
端点フォワードを実行して、Nginx サービスにアクセスします:
kubectl port-forward pod/nginx-demo 8080:80
これにより、ブラウザで http://localhost:8080 を開いて、Nginx のデフォルトページを見ることができます。
手順 5:Pod を削除する
kubectl delete pod nginx-demo
出力:pod "nginx-demo" deleted は削除成功を示します。
キーアクション ポイント
- YAML 核心フィールド:
apiVersion(v1)、kind(Pod)、metadata(名称/ラベル)、spec.containers(コンテナ設定)は必須フィールド; - 再起動ポリシー:
Always:デフォルト値。コンテナが何らかの理由で停止した場合、再起動します;OnFailure:コンテナが異常終了(終了コード非 0)した場合にのみ再起動します;Never:決して再起動しません(コンテナが崩壊しても);
- 詳細情報を確認する:Pod 状態が異常な場合、
kubectl describe pod nginx-demoを実行してイベントログを確認します。
実践 注意点
- Pod は「短命」です:削除后、自動的に復元されません。本番環境ではDeployment 等のコントローラーを利用して Pod を管理する必要があります(Pod だけで管理しないでください);
- イメージのプル:イメージアドレスが正常にアクセスできることを確認(国内では阿里云イメージに切り替え可能);
- リソース制限:ノードリソースが不足すると、Pod は
Pending状態になります。resourcesフィールドを調整してリソース要求量を減らすか、ノードのリソースを拡張してください。
- 常用問題と解決策
問題 1:Pod が常に Pending 状態にある
現象
kubectl get pods を実行した際、Pod の STATUS が常に Pending で、Running に移行しません。
原因
- ノードリソース不足(CPU/メモリ不足);
- スケジュールポリシーの制限(ノードラベル不一致、アフィニティ規則の衝突);
- イメージプル問題(例:イメージが存在しない、プルタイムアウト)。
解決策
- Pod の詳細なイベント情報を確認します:``` kubectl describe pod nginx-demo
出力の `Events` 部分に原因(例:`Insufficient memory`)が記載されています;
2. リソース不足の場合:
- `spec.containers.resources.requests` を減らしてリソース要求量を下げます;
- ノードのリソースを拡張するか、無用なPodを削除してリソースを解放します;
3. スケジュール規則の衝突の場合:Pod のノードアフィニティ、スティッカ/_toleration 設定を確認し、ノードが一致するようにします;
4. イメージプル失敗の場合:イメージ名を確認し、またはイメージリポジトリのシークレットを設定します。
### 問題 2:Pod が CrashLoopBackOff 状態にある
#### 現象
Pod が反復的に起動し崩壊し、`STATUS` が `CrashLoopBackOff`(再起動後一定時間後に再試行)を示します。
#### 原因
- コンテナ起動コマンドが間違っています;
- アプリケーション構成が間違っています(例:構成ファイルが欠損、ポートが占用されている);
- 健康チェックが失敗しています;
- 依存サービスが起動していない(例:データベース接続が失敗)。
#### 解決策
1. コンテナのログを確認して崩壊原因を特定します:```
# 最新ログを確認
kubectl logs nginx-demo
# 崩壊後に起動した際のログ(再起動前のログ)
kubectl logs nginx-demo --previous
- 起動コマンドを確認します:
spec.containers.command/argsが正しく設定されているか確認; - 構成ファイルを確認します:Pod 内に構成ファイルが存在するか、
kubectl exec -it nginx-demo -- /bin/bashを使って確認; - 健康チェックを調整します:例:
livenessProbe/readinessProbeのタイムアウトパラメータを調整して、健康チェック失敗を防ぎます。
問題 3:Pod 内のコンテナ間で通信できない
現象
Pod 内のメイン コンテナとサイドカー コンテナ間で localhost を通じた通信ができない、またはポートへのアクセスが失敗します。
原因
- Pause コンテナが異常(ネットワーク名前空間が作成されなかった);
- ポートが衝突しています;
- サイドカー コンテナが正常に起動していません。
解決策
- Pause コンテナの状態を確認します:```
ノード上のコンテナ一覧を確認(crictl 必要)
crictl ps | grep nginx-demo
Pause コンテナが実行されていない場合は、Kubelet を再起動します(`systemctl restart kubelet`);
2. ポートの衝突を確認します:Pod 内の各コンテナが独自のポートを使用していることを確認し、ポート範囲外ではないことを確かめ;
3. コンテナ内でのネットワークをテストします:メイン コンテナ内から `curl localhost:サイドカー ポート` を実行し、アクセスが可能か確認;
4. サイドカー コンテナのログを確認します:`kubectl logs nginx-demo -c sidecar-container`(サイドカー コンテナ名を置換)し、起動失敗の原因を特定します。
### 総じて
1. **核心的な定義**:Pod は K8s で最小の配置単位で、1つ以上のコンテナを包み、ネットワーク/ストレージを共有し、原子的な管理が可能です;
2. **核心的な価値**:コンテナ間の連携難、スケジュールの分散化問題を解決し、関連コンテナの統一管理と効率的な通信を保証します;
3. **実践の要点**:初心者はまず.Pod YAML 核心フィールド、状態の確認(`kubectl describe/logs`)、再起動ポリシーを学び、本番環境ではDeployment 等のコントローラーを利用して Pod を管理してください;
4. **トラブルシューティングの考え方**:Pod 異常時は状態 → イベント → ログ を確認し、リソース → 構成 → ネットワーク の順番で問題を特定します。