介绍
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 创建对象。


