Kubernetes Pod 深堺解:基本概念부터 운영까지

Kubernetes(K8s)의.Pod.개념을 「무엇인지 → 왜필요한지 → 核心운作모티브 → 작업프로세스 → 입문실습 → 常用문제 및 해결방안」의 논리로 전면적이며 명확하게 설명하고자 합니다. 이하 단계별로 차분히 분해하여 학습자에게 친화적인 설명을 제공하겠습니다.

  1. 什么是: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 コンテナ(ルート コンテナ)を作成し、ネットワーク名前空間を維持し、ビジネスポッドのネットワーク共有を保証します。
  1. なぜ必要:解決する 核心的な課題と価値

単独のコンテナを直接管理する場合、多くの問題に直面します。Pod はこれらの課題を解決するために生まれました。

核心的な問題(Podなしの場合の課題)

  • コンテナ間の連携が困難:例えば、1つのアプリ コンテナ + ログ収集用サイドカー コンテナ —— 単独配置時は、2つのコンテナ間でネットワーク/ストレージを共有するのが難しい。通信は跨节点ネットワークを通じる必要があり、複雑さが伴います;
  • スケジュールの分散化:単独のコンテナを分散スケジュールすると、関連性の高いコンテナが異なるノードに配置され、ネットワーク遅延や通信コストが増大します;
  • ライフサイクル管理の混乱:関連コンテナが「同時起動、同時停止」を保証できない —— 例:データベース コンテナが起動していない状態で、アプリ コンテナが誤って起動しエラーを引き起こす可能性があります;
  • リソースの隔离と共有のバランスが取れない:純粋なコンテナ レベルの管理は、完全な隔離(リソースを共有できない)か完全な共有(境界がない)のいずれかに陥ります。

実際の応用価値

  • 編成を簡略化:関連 コンテナを Pod にまとめて、一度のスケジュールと管理で、運用コストを削減;
  • 連携性を保証:緊密に結合したコンテナ(例:主アプリ + サイドカー)を同一のノードに配置し、リソース共有、通信を効率化(localhost での通信可能);
  • ** atomic 配置**:Pod として一括配置することで、一部のコンテナが成功し、一部が失敗する中途状態を防ぎます;
  • フレキシブルなスケール:Deployment 等のコントローラーと組み合わせることで、Pod を通じてアプリケーションの拡張/収縮を迅速に行えます。
  1. 核心的な働き方:作動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/メモリ(要求:スケジュールを保証;制限:リソースの乱用を防ぐ)

要素の関連性のロジック

  1. 構成者は.PodSpec で期待状態を定義し、K8s API Server に提出;

  2. K8s スケジューラーは.PodSpec のリソース要求に基づいて、Pod を適切なノードにスケジュール;

  3. 目的ノードの Kubelet はまず Pause コンテナを作成し、ネットワーク名前空間を初期化;

  4. 初期化 コンテナを順番に実行(全て終了且成功後)、メイン コンテナ/サイドカー コンテナ を起動;

  5. Kubelet はコンテナの状態を監視し、PodSpec と異なっている場合(例:コンテナ崩壊)、再起動ポリシーに基づいて修復;

  6. Kubelet は定期的に.PodStatus を API Server に報告し、etcd に更新します。

  7. 働き方: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

ステップ分解(通俗版)

  1. 定義の提出:ユーザーは.Pod の YAML 設定ファイルを作成し、kubectl apply コマンドを通じて K8s API Server に提出;

  2. 検証と保存:API Server はまず YAML 言語の合法性と権限を検証し、無事であれば.Pod の期待状態を etcd(K8s のデータベース)に保存;

  3. スケジュール選定:スケジューラー(Scheduler)は「未スケジュールの Pod」を検出し、リソースやラベル、アフィニティ等に基づいてターゲットノードを選定;

  4. ノード実行:ターゲットノードの Kubelet はスケジュール指示に基づき、まず Pause コンテナを作成し、ネットワーク環境を整備;

  5. 初期化操作:初期化 コンテナを順番に実行(例:設定ファイルの取得、データベース初期化)し、全て成功終了後にメイン コンテナを起動;

  6. 状態監視:メイン コンテナ/サイドカーが起動後、Kubelet はコンテナの状態を継続的に監視し、異常時は再起動ポリシーに基づいて修復。また定期的に.Pod 状態(例:Running)を API Server に報告;

  7. 破棄と削除kubectl delete pod コマンドが実行されると、Kubelet は全てのコンテナを停止し、Pod を削除し、API Server に状態を報告します。

  8. 入門実践:ゼロから初めての 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

出力例(STATUSRunning 时表示正常実行):

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 は削除成功を示します。

キーアクション ポイント

  1. YAML 核心フィールドapiVersion(v1)、kind(Pod)、metadata(名称/ラベル)、spec.containers(コンテナ設定)は必須フィールド;
  2. 再起動ポリシー
  • Always:デフォルト値。コンテナが何らかの理由で停止した場合、再起動します;
  • OnFailure:コンテナが異常終了(終了コード非 0)した場合にのみ再起動します;
  • Never:決して再起動しません(コンテナが崩壊しても);
  1. 詳細情報を確認する:Pod 状態が異常な場合、kubectl describe pod nginx-demo を実行してイベントログを確認します。

実践 注意点

  • Pod は「短命」です:削除后、自動的に復元されません。本番環境ではDeployment 等のコントローラーを利用して Pod を管理する必要があります(Pod だけで管理しないでください);
  • イメージのプル:イメージアドレスが正常にアクセスできることを確認(国内では阿里云イメージに切り替え可能);
  • リソース制限:ノードリソースが不足すると、Pod は Pending 状態になります。resources フィールドを調整してリソース要求量を減らすか、ノードのリソースを拡張してください。
  1. 常用問題と解決策

問題 1:Pod が常に Pending 状態にある

現象

kubectl get pods を実行した際、Pod の STATUS が常に Pending で、Running に移行しません。

原因

  • ノードリソース不足(CPU/メモリ不足);
  • スケジュールポリシーの制限(ノードラベル不一致、アフィニティ規則の衝突);
  • イメージプル問題(例:イメージが存在しない、プルタイムアウト)。

解決策

  1. 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

  1. 起動コマンドを確認します:spec.containers.command/args が正しく設定されているか確認;
  2. 構成ファイルを確認します:Pod 内に構成ファイルが存在するか、kubectl exec -it nginx-demo -- /bin/bash を使って確認;
  3. 健康チェックを調整します:例:livenessProbe/readinessProbe のタイムアウトパラメータを調整して、健康チェック失敗を防ぎます。

問題 3:Pod 内のコンテナ間で通信できない

現象

Pod 内のメイン コンテナとサイドカー コンテナ間で localhost を通じた通信ができない、またはポートへのアクセスが失敗します。

原因

  • Pause コンテナが異常(ネットワーク名前空間が作成されなかった);
  • ポートが衝突しています;
  • サイドカー コンテナが正常に起動していません。

解決策

  1. 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 異常時は状態 → イベント → ログ を確認し、リソース → 構成 → ネットワーク の順番で問題を特定します。

タグ: Kubernetes Pod Docker Containers Scheduling

8月7日 00:16 投稿