Kubernetes 101,第二部分,Pod
在上一篇文章中,我们已经了解了Kubernetes 的基础知识及其主要架构的介绍。
了解了 Kubernetes 之后,接下来就要探讨如何在 Kubernetes 中运行应用程序了。
容器的包装器
在 Kubernetes 中,我们无法直接创建单个容器。为了更好地实现这一点,我们可以将多个容器封装成一个包含以下组件的单元:
- 规范:多个容器可以使用相同的规范作为可部署单元
- 共享存储:它们可以使用共享存储,以便将相同的卷挂载到多个容器中。
- 同一个网络:同一包装器下的容器可以共享同一个网络,因此它们可以相互通信。
与 Docker 相比,这种包装器类似于docker-compose.yml,不同的服务(容器)可以共享一个通用规范、卷和网络。
是的,我们说的就是 Pods。
豆荚
Pod是Kubernetes 中可以创建和管理的最小可部署单元。
在 Pod 中,我们可以将多个容器分组,这些容器应该以某种方式相互通信,无论是使用相同的网络还是通过共享卷。
我们来创建一些 Pod。
善用 YAML
到目前为止,我们已经使用kubectl过以下方法来创建 pod,例如:
$ kubectl run <container_name> --image=<some_image>
它在运行实验性 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”的简单消息写入共享卷。
期待
服务器启动时,会在共享卷中创建FIFO。服务器会持续等待消息到达FIFO中。
客户端启动时,会将消息“Hey”写入共享卷。
之后,我们查看容器服务器日志,因为它应该会打印客户端发送的消息“Hey”。
让我们声明 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"]
- 类型:对象类型。在本例中,就是 Pod。
- 元数据名称:集群中 Pod 的名称,位于当前默认命名空间下(我们将在后续文章中讨论命名空间)。
- volumes:Pod 的共享卷。我们使用
emptyDir它来共享 Pod 文件系统中的任何空目录。 - volumeMounts:将 Pod 的共享卷挂载到容器文件系统的某个目录中
- 命令:要在容器中执行的命令
声明完成后,我们可以使用 Git 与朋友、同事等共享 YAML 文件。但该对象尚未在我们的集群中创建。我们可以使用以下命令来完成此操作kubectl apply:
$ kubectl apply -f fifo-pod.yml
pod/fifo-pod created
我们来查看容器的日志server。我们可以使用命令kubectl logs <pod>获取 Pod 中每个容器的日志。但是,我们只想获取目标server容器的日志:
$ kubectl logs fifo-pod -c server
Hey
耶!成功了! 🚀
获取 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
我们有一个名为“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。
已终止/已完成
表示所有容器均已终止(由 Kubernetes 内部终止)或已完成。
关于 Pod 生命周期的更多信息
Pod 生命周期是 Kubernetes 中一个非常重要的话题,它涵盖了 Pod 的状态、就绪状态、存活状态等等。我们将在后续文章中深入探讨生命周期的更多细节。
总结
这篇文章更详细地介绍了Pod,它是Kubernetes 中最小也是主要的部署单元。
除此之外,我们还创建了一个 Pod,其中包含两个容器,它们使用 FIFO 和共享卷相互通信。
此外,我们已经对Pod 生命周期有了一些了解。因此,理解 Pod 生命周期及其持续时间对于理解下一篇文章的主题——Kubernetes中的自愈能力——至关重要。
敬请期待,谢谢!
文章来源:https://dev.to/leandronsp/kubernetes-101-part-ii-pods-19pb





