创建并检查 Pod

KubernetesBeginner
立即练习

介绍

Pod 是你在 Kubernetes 中通常会创建的最小工作负载对象。它封装了一个或多个容器,为它们提供共享的网络标识,并允许 Kubernetes 将它们调度到节点上。

在本实验中,你将使用一个预加载的小型容器镜像创建一个独立的 Pod,等待 Kubernetes 将其标记为就绪(Ready),并从多个角度检查该对象。你将使用 kubectl get、kubectl describe 和 kubectl get -o yaml,以便在后续的清单(manifest)编写实验中,能够基于真实的资源状态而非死记硬背 YAML 来进行操作。

准备 Pod 工作空间

在此步骤中,你将为你的第一个 Pod 准备一个专用命名空间(namespace),并将该命名空间设置为命令的默认目标。

从 /home/labex/project 开始,这是整个 CKAD 备考实验中使用的共享工作空间。

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

虚拟机启动后,Kubernetes API 服务器可能需要片刻时间才能连接。请先运行此命令。如果它报告服务器尚未就绪,请等待几秒钟并再次运行,直到节点状态为 Ready。

kubectl get nodes --request-timeout=5s

预期的输出应包含一个就绪的控制平面(control-plane)节点:

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,并等待其进入就绪状态。

kubectl run 可以直接从命令行创建一个基础 Pod。--image 选项用于选择容器镜像,--restart=Never 选项确保将其作为独立的 Pod 运行,而不是创建一个更高级别的控制器。

本实验使用 registry.k8s.io/pause:3.10.1,这是一个在预置的 Kubernetes 环境中已经存在的微型镜像。它无需应用程序配置即可保持运行,这让你能够专注于 Pod 的生命周期,而不是镜像拉取或应用程序行为。

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

该命令应报告 Kubernetes 已接受该 Pod 对象:

pod/sample-pod created

创建成功并不等同于就绪。Kubernetes 仍需调度 Pod、启动容器并将 Pod 标记为就绪。使用 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 将其标记为就绪,检查了调度和事件详情,并从 YAML 和 JSONPath 输出中读取了关键的对象字段。这为你提供了一个具体的 Pod 实例,以便与下一个实验衔接——在下一个实验中,你将编写 Pod 清单,而不是直接使用 kubectl run 创建对象。