はじめに

Pod は、Kubernetes で通常作成する最小のワークロードオブジェクトです。Pod は 1 つ以上のコンテナをラップし、それらに共有ネットワーク ID を提供し、Kubernetes がそれらをノードにスケジュールできるようにします。

このラボでは、小さなプリロード済みコンテナイメージを使用して単一の Pod を作成し、Kubernetes がそれを Ready 状態にするのを待ってから、さまざまな角度からオブジェクトを調査します。kubectl get、kubectl describe、および kubectl get -o yaml を使用します。これにより、後のマニフェスト作成ラボにおいて、YAML を暗記するのではなく、実際のオブジェクトの状態に基づいた理解を深めることができます。

Pod ワークスペースの準備

このステップでは、最初の Pod 専用のネームスペースを準備し、そのネームスペースをコマンドのデフォルトターゲットとして設定します。

CKAD 準備コース全体で使用される共有ワークスペースである /home/labex/project から開始します。

mkdir -p /home/labex/project
cd /home/labex/project

VM の起動後、Kubernetes API サーバーが接続可能になるまで少し時間がかかる場合があります。まず以下のコマンドを実行してください。サーバーがまだ準備できていないと報告された場合は、数秒待ってから、ノードが Ready になるまで再度実行してください。

kubectl get nodes --request-timeout=5s

期待される出力には、準備完了状態のコントロールプレーンノードが 1 つ含まれます。

NAME         STATUS   ROLES           AGE   VERSION
labex-v135   Ready    control-plane   ...   v1.35...

ckad-prep-pod という名前のネームスペースを作成します。ネームスペースを使用することで、このラボ独自のオブジェクトスコープが確保され、作成する Pod が他のラボのオブジェクトと混在することがなくなります。

kubectl create namespace ckad-prep-pod

コマンドはネームスペースの作成を確認するはずです。

namespace/ckad-prep-pod created

現在のコンテキストのネームスペースを ckad-prep-pod に設定します。これ以降、kubectl get pods のようなネームスペース指定コマンドは、デフォルトでこのネームスペースを参照するようになります。

kubectl config set-context --current --namespace=ckad-prep-pod

出力は、現在のコンテキストが変更されたことを確認する内容になります。

Context "labex-v135" modified.

現在のネームスペースが変更されたことを確認します。

kubectl config view --minify --output 'jsonpath={..namespace}'; echo

期待される出力:

ckad-prep-pod

Pod の作成

このステップでは、kubectl run を使用して単一の Pod を作成し、Ready 状態になるまで待機します。

kubectl run を使用すると、コマンドラインから直接基本的な Pod を作成できます。--image オプションでコンテナイメージを選択し、--restart=Never を指定することで、上位レベルのコントローラーを作成するのではなく、スタンドアロンの Pod として維持します。

このラボでは、準備された Kubernetes 環境にすでに存在する小さなイメージである registry.k8s.io/pause:3.10.1 を使用します。これはアプリケーションの設定なしで実行され続けるため、イメージのプルやアプリケーションの動作ではなく、Pod のライフサイクルに集中できます。

kubectl run sample-pod --image=registry.k8s.io/pause:3.10.1 --restart=Never

コマンドは、Kubernetes が Pod オブジェクトを受け入れたことを報告します。

pod/sample-pod created

作成は準備完了(Readiness)と同じではありません。Kubernetes は Pod をスケジュールし、コンテナを起動し、Pod を Ready とマークする必要があります。kubectl wait を使用して、Pod の Ready 条件を待ちます。

kubectl wait --for=condition=Ready pod/sample-pod --timeout=60s

期待される出力:

pod/sample-pod condition met

次に、現在のネームスペース内の Pod を一覧表示します。

kubectl get pods

sample-pod が 1/1 の準備完了コンテナを持ち、Running ステータスであることを確認できるはずです。

NAME      READY   STATUS    RESTARTS   AGE
sample-pod   1/1     Running   0          ...

Pod の配置とイベントの調査

このステップでは、Pod がどこで実行されているかを調査し、Kubernetes が起動時に記録したイベントの履歴を読み取ります。

通常の kubectl get pods ビューはコンパクトです。-o wide を追加すると、ノード名や Pod の IP アドレスなどのスケジューリングの詳細を確認できます。

kubectl get pod sample-pod -o wide

期待される出力には、ノードと内部 Pod IP が含まれます。

NAME      READY   STATUS    RESTARTS   AGE   IP           NODE
sample-pod   1/1     Running   0          ...   ...        labex-v135

kubectl describe は、人間が読みやすい形式でオブジェクトを表示します。これにはメタデータ、コンテナの詳細、条件、および最近のイベントが含まれます。初心者にとって、Events セクションは特に有用です。なぜなら、Pod を作成した後に Kubernetes が何を行ったかを示しているからです。

kubectl describe pod sample-pod

出力の中で、以下のような行を探してください。

Name:             sample-pod
Namespace:        ckad-prep-pod
Status:           Running
Containers:
  sample-pod:
    Image:        registry.k8s.io/pause:3.10.1
Conditions:
  Type                        Status
  Ready                       True
Events:
  Type    Reason     Age   From               Message
  Normal  Scheduled  ...   default-scheduler  Successfully assigned ...
  Normal  Pulled     ...   kubelet            Container image "registry.k8s.io/pause:3.10.1" already present ...
  Normal  Created    ...   kubelet            Created container ...
  Normal  Started    ...   kubelet            Started container ...

イベントの正確な経過時間やメッセージは異なる場合がありますが、重要な概念は一貫しています。Kubernetes は Pod をスケジュールし、イメージを準備し、コンテナを作成して起動します。

Pod オブジェクトフィールドの読み取り

このステップでは、YAML 形式で選択した Pod フィールドを調査し、前のラボで学んだオブジェクトの概念と結びつけます。

kubectl get は -o yaml を使用してオブジェクトを YAML として出力できます。これは API サーバーから返される実際のオブジェクト表現であり、作成後に Kubernetes が追加したフィールドも含まれます。以下のコマンドでは sed -n '1,80p' を使用して最初の 80 行のみを表示し、読みやすくしています。

kubectl get pod sample-pod -o yaml | sed -n '1,80p'

出力の中で、トップレベルのフィールドとコンテナイメージを探してください。

apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
  namespace: ckad-prep-pod
spec:
  containers:
  - image: registry.k8s.io/pause:3.10.1
    name: sample-pod
...
status:
...

生成されたすべてのフィールドを暗記する必要はありません。今のところは、apiVersion、kind、metadata、spec、status という基本的な構造に注目してください。次のラボでは、重要な部分を自分で記述することになります。

ターゲットを絞った JSONPath クエリを使用して、イメージフィールドのみを出力します。JSONPath 式は、大きなオブジェクトから特定の値を抽出する必要がある場合に便利です。

kubectl get pod sample-pod -o jsonpath='{.spec.containers[0].image}'; echo

期待される出力:

registry.k8s.io/pause:3.10.1

まとめ

スタンドアロンの Pod を作成し、Kubernetes が Ready とマークするのを待ち、スケジューリングとイベントの詳細を調査し、YAML および JSONPath 出力から主要なオブジェクトフィールドを読み取りました。これにより、次のラボで kubectl run を使用して直接オブジェクトを作成する代わりに Pod マニフェストを記述する際、具体的な Pod のイメージを関連付けることができます。