简介
在本实验中,你将了解 Kubernetes 中最小的可部署单元:Pod。
Pod 是 Kubernetes 调度到节点上的对象。在 Kubernetes 中,你通常不会直接单独运行容器,而是将容器放在 Pod 中运行。
一个 Pod 可以包含一个或多个共享网络和存储上下文的容器。大多数入门示例只使用一个容器,但这种共享环境的设计才是需要重点理解的概念。
你将学习如何:
- 使用 YAML 配置文件(蓝图)定义 Pod。
- 使用
kubectl在集群中创建 Pod。 - 检查 Pod 的状态,确保它正在运行。
- 查看 Pod 的详细配置和事件历史。
完成本实验后,你将在集群中的 Pod 内运行一个真实的 Web 服务器。
定义 Pod
在此步骤中,你将定义第一个 Pod。Kubernetes 使用 YAML 描述资源。YAML 文件就像一份蓝图或配方,用于准确描述应用程序应当是什么样子。
Pod 是 Kubernetes 调度的最小对象,但它并不等同于容器。容器是正在运行的应用程序进程及其文件系统映像。Pod 是 Kubernetes 为一个或多个容器提供的封装层。这个封装层为容器提供共享的网络身份、共享的生命周期,以及可选的共享存储。
Pod 定义需要包含四个主要部分:
- apiVersion:表示所使用的 Kubernetes API 版本。
- kind:表示要创建的对象类型(此处为
Pod)。 - metadata:用于标识对象的信息,例如名称和标签。
- spec:即「规格」,也是配置的核心部分,用于描述要运行的容器。
你将创建名为 nginx-pod.yaml 的文件。该文件会定义一个名为 nginx-pod 的 Pod,并使用 nginx 镜像运行一个容器。nginx 是一种常用的 Web 服务器。
使用 nano 文本编辑器创建文件:
nano nginx-pod.yaml
将以下内容复制并粘贴到文件中。仔细阅读这些内容,查看前面介绍的四个部分:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
要在标准 nano 中保存并退出:按 Ctrl+X,然后输入 Y 确认保存,最后按 Enter 将内容写入该文件。
现在,你已经编写了第一个 Kubernetes 蓝图!它告诉 Kubernetes:「我需要一个名为 nginx-pod 的 Pod,并请在其中使用 nginx 镜像运行一个 容器。」
创建 Pod
现在你已经准备好蓝图(nginx-pod.yaml),接下来将它交给 Kubernetes 这个「施工团队」。
使用 kubectl apply 命令完成此操作。该命令会告诉 Kubernetes:「这是我期望的状态,请将系统调整为这个状态。」
期望状态是 Kubernetes 的核心概念之一。你不需要告诉系统每一个底层操作步骤,而是声明希望达到的最终结果,然后由 Kubernetes 控制器持续工作,直到实际状态与声明一致。
执行以下命令创建 Pod:
kubectl apply -f nginx-pod.yaml
你应该会看到确认信息:
pod/nginx-pod created
执行此命令时,你将蓝图发送给了 Kubernetes API 服务器(控制平面)。随后,调度器会为 Pod 找到合适的节点,该节点上的 Kubelet 会开始下载用于运行 Pod 的 Nginx 镜像。
检查状态
在此步骤中,你将检查新 Pod 的运行进度。创建 Pod 并不是瞬间完成的,系统需要一些时间来下载容器镜像并启动应用程序。
需要记住的一点是:kubectl apply 通常会很快返回,因为它只负责提交请求。实际工作会在集群内部异步进行。因此,检查状态是正常的后续步骤,并不表示出现了问题。
使用 get 命令查看 Pod 的状态:
kubectl get pods
你将看到一个列出 Pod 的表格。查看其中的 STATUS 列:
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 15s
STATUS:这是最重要的字段。
ContainerCreating:系统仍在下载镜像或启动容器。Running:操作成功!Pod 已启动并且运行正常。Pending:集群正在确定将 Pod 放置到哪个节点上。Error或CrashLoopBackOff:出现了问题,例如应用程序崩溃。
READY:显示
1/1,表示 Pod 中定义的 1 个容器中,有 1 个容器已经准备好提供流量。
如果看到 ContainerCreating,等待几秒钟,然后再次运行 kubectl get pods。当状态变为 Running 后,Nginx Web 服务器就已经运行起来了。
查看详细信息
在此步骤中,你将学习如何「查看内部运行情况」。get 命令提供的是摘要信息,但有时你需要准确了解正在发生什么,尤其是在出现问题时。
describe 命令会提供 Kubernetes 资源的详细报告。
对于初学者来说,可以将 kubectl get 和 kubectl describe 理解为两个不同级别的观察方式。get 回答「当前的总体状态是什么?」而 describe 回答「发生了什么,才导致当前状态?」事件历史通常是找到根本原因最快的方法。
运行以下命令查看 nginx-pod:
kubectl describe pod nginx-pod
该命令会输出大量信息。滚动到输出底部,查找 Events 部分。这里会按时间顺序记录 Pod 的启动过程:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled ... default-scheduler Successfully assigned default/nginx-pod...
Normal Pulling ... kubelet Pulling image "nginx:latest"
Normal Pulled ... kubelet Successfully pulled image "nginx:latest"...
Normal Created ... kubelet Created container nginx
Normal Started ... kubelet Started container nginx
事件日志是排查问题时首先要查看的内容。如果 Pod 卡在 Pending 或 Error 状态,Events 部分通常会说明原因,例如「Insuficient CPU」或「ImagePullBackOff」。
现在,你已经创建、验证并检查了第一个 Kubernetes Pod!
总结
在本实验中,你掌握了 Pod 的概念,它是 Kubernetes 的基本构建单元。
你已经成功完成以下操作:
- 编写 Nginx Pod 的 YAML 蓝图。
- 使用
kubectl apply将其部署到集群。 - 使用
kubectl get验证其状态为 Running。 - 使用
kubectl describe查看其详细启动历史。
理解 Pod 非常重要,因为 Kubernetes 中的其他概念——Deployment、Service、StatefulSet——最终都是围绕 Pod 的管理展开的。现在,你已经可以继续学习更高级的主题了!


