发布于 2026-01-06 0 阅读
0

Kubernetes 101,第二部分,Pod

Kubernetes 101,第二部分,Pod

上一篇文章中,我们已经了解了Kubernetes 的基础知识及其主要架构的介绍。

了解了 Kubernetes 之后,接下来就要探讨如何在 Kubernetes 中运行应用程序了。


容器的包装器

在 Kubernetes 中,我们无法直接创建单个容器。为了更好地实现这一点,我们可以将多个容器封装成一个包含以下组件的单元:

  • 规范:多个容器可以使用相同的规范作为可部署单元
  • 共享存储:它们可以使用共享存储,以便将相同的卷挂载到多个容器中。
  • 同一个网络:同一包装器下的容器可以共享同一个网络,因此它们可以相互通信。

与 Docker 相比,这种包装器类似于docker-compose.yml,不同的服务(容器)可以共享一个通用规范、卷和网络。

是的,我们说的就是 Pods


豆荚

PodKubernetes 中可以创建和管理的最小可部署单元。

在 Pod 中,我们可以将多个容器分组,这些容器应该以某种方式相互通信,无论是使用相同的网络还是通过共享卷

不同的舱体使用它们的容器

我们来创建一些 Pod。

善用 YAML

到目前为止,我们已经使用kubectl过以下方法来创建 pod,例如:



$ kubectl run <container_name> --image=<some_image>


Enter fullscreen mode Exit fullscreen mode

它在运行实验性 Pod、创建临时资源以及在 k8s 中创建其他工作负载方面效果相当不错(我们稍后会讨论工作负载)。

我们可以使用 Pod 创建多个 Pod kubectl run ...,但是如果我们想与其他人、团队甚至开源社区分享我们如何声明我们的 Pod,该怎么办呢?

如何使用标准序列化格式,在Git 等版本控制系统仓库中共享我们在 k8s 中应用程序所需状态的表示形式

Kubernetes 提供了一种序列化格式,可以用来表示我们的 Pod,是的,你可能喜欢也可能不喜欢,它就是众所周知的YAML

创建小组

使用 YAML,我们可以通过kind属性声明 Kubernetes 对象。K8s 使用了许多不同类型的对象,我们将在后续文章中进行探讨,但现在我们将从 Kubernetes 中最常见、最小的单元——Pod开始。

我们的Pod 规格应包含以下内容:

  • 一个名为“server”的容器,由镜像支持ubuntu,它与Pod共享一个卷。该容器将在共享卷中创建一个UNIX命名管道也称为FIFO),监听传入FIFO的消息。

  • 一个名为“client”的容器,也由一个镜像支持ubuntu,它与Pod共享一个卷。该容器会将一条名为“Hey”的简单消息写入共享卷。

Pod 与其内部容器共享一个空间

期待

服务器启动时,会在共享卷中创建FIFO。服务器会持续等待消息到达FIFO中。

客户端启动时,会将消息“Hey”写入共享卷。

之后,我们查看容器服务器日志,因为它应该会打印客户端发送的消息“Hey”

对使用共享卷的 Pod 进行更详细的概述

让我们声明 YAML 文件fifo-pod.yml



kind: Pod
apiVersion: v1
metadata:
  name: fifo-pod
spec:
  volumes:
    - name: queue
      emptyDir: {}
  containers:
    - name: server
      image: ubuntu
      volumeMounts:
        - name: queue
          mountPath: /var/lib/queue
      command: ["/bin/sh"]
      args: ["-c", "mkfifo /var/lib/queue/fifo; cat /var/lib/queue/fifo"]
    - name: client
      image: ubuntu
      volumeMounts:
        - name: queue
          mountPath: /var/lib/queue
      command: ["/bin/sh"]
      args: ["-c", "echo Hey > /var/lib/queue/fifo"]


Enter fullscreen mode Exit fullscreen mode
  • 类型:对象类型。在本例中,就是 Pod。
  • 元数据名称:集群中 Pod 的名称,位于当前默认命名空间下(我们将在后续文章中讨论命名空间)。
  • volumes:Pod 的共享卷。我们使用emptyDir它来共享 Pod 文件系统中的任何空目录。
  • volumeMounts将 Pod 的共享卷挂载到容器文件系统的某个目录中
  • 命令:要在容器中执行的命令

声明完成后,我们可以使用 Git 与朋友、同事等共享 YAML 文件。但该对象尚未在我们的集群中创建。我们可以使用以下命令来完成此操作kubectl apply



$ kubectl apply -f fifo-pod.yml
pod/fifo-pod created


Enter fullscreen mode Exit fullscreen mode

我们来查看容器的日志server。我们可以使用命令kubectl logs <pod>获取 Pod 中每个容器的日志。但是,我们只想获取目标server容器的日志:



$ kubectl logs fifo-pod -c server
Hey


Enter fullscreen mode Exit fullscreen mode

耶!成功了! 🚀

获取 Pod 列表

我们可以使用以下命令kubectl获取集群中的 Pod 列表:



$ kubectl get pods

NAME         READY   STATUS      RESTARTS      AGE
nginx        1/1     Running     1 (92m ago)   6d3h
fifo-pod     0/2     Completed   0             64m


Enter fullscreen mode Exit fullscreen mode

我们有一个名为“6 天运行nginx期”的Pod Running。这很容易理解,因为我kubectl run nginx --image=nginx六天前也运行过它。此外,众所周知,NGINX 是一个持续运行(监听 TCP 连接)的 Web 服务器,所以这个 Pod 才会一直处于运行状态。

但是我们刚刚创建的 Podfifo-pod返回了一个Completed状态。为什么?

胶囊生命周期

在 Kubernetes 中,Pod 遵循一定的生命周期。

与Docker 中的容器类似,Pod 的设计目标是短暂的。一旦 Pod 被调度(分配)到某个节点,它就会在该节点上运行,直到停止或被终止。

Pod 的生命周期分为多个阶段。让我们来了解每个阶段。

待办的

集群接受一个 Pod ,但其容器尚未准备就绪时,就会出现这种情况。该 Pod尚未被调度到任何节点上。

待定

跑步

所有容器均已创建,并且Pod 已调度到节点。

至少有一个容器仍在运行或正在启动。

舱段运行

成功/失败

如果所有容器都Terminated运行成功,则 Pod 状态为Succeeded

但是,如果所有容器都已终止,但至少有 1 个容器因故障而终止,则 Pod 状态为Failed

pod阶段成功/失败

已终止/已完成

表示所有容器均已终止(由 Kubernetes 内部终止)或已完成


关于 Pod 生命周期的更多信息

Pod 生命周期是 Kubernetes 中一个非常重要的话题,它涵盖了 Pod 的状态、就绪状态、存活状态等等。我们将在后续文章中深入探讨生命周期的更多细节。


总结

这篇文章更详细地介绍了Pod,它是Kubernetes 中最小也是主要的部署单元。

除此之外,我们还创建了一个 Pod,其中包含两个容器,它们使用 FIFO 和共享卷相互通信。

此外,我们已经对Pod 生命周期有了一些了解。因此,理解 Pod 生命周期及其持续时间对于理解下一篇文章的主题——Kubernetes中的自愈能力——至关重要。

敬请期待,谢谢!

文章来源:https://dev.to/leandronsp/kubernetes-101-part-ii-pods-19pb