简介

在本实验中,你将了解 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 的基本构建单元。

你已经成功完成以下操作:

  1. 编写 Nginx Pod 的 YAML 蓝图。
  2. 使用 kubectl apply 将其部署到集群。
  3. 使用 kubectl get 验证其状态为 Running。
  4. 使用 kubectl describe 查看其详细启动历史。

理解 Pod 非常重要,因为 Kubernetes 中的其他概念——Deployment、Service、StatefulSet——最终都是围绕 Pod 的管理展开的。现在,你已经可以继续学习更高级的主题了!