在上一篇文章中,我们了解了Kubernetes 的基础知识以及对其主要架构的介绍。
介绍完毕后,就该探索如何在 Kubernetes 中运行应用程序了。
容器包装器
在 Kubernetes 中,我们无法直接创建单个容器。相反,为了更好,我们可以将容器包装成一个单元,其中包括:
规范:多个容器可以使用与可部署单元相同的规范
共享存储:他们可以使用共享存储,因此相同的卷可以跨多个容器安装
单一网络:同一包装器下的容器可以共享单一网络,因此它们可以相互通信
与 Docker 相比,这种包装器类似于docker-compose.yml,其中不同的服务(容器)可以共享一个共同的规范、卷和网络。
是的,我们正在谈论 Pods。
豆荚
Pod是您可以在 Kubernetes 中创建和管理的最小可部署单元。
在 Pod 中,我们可以将多个容器分组,这些容器应该使用相同的网络或通过共享卷以某种方式相互通信。
让我们创建一些 Pod。
永远使用 YAML
到目前为止,我们已经使用kubectlorder 来创建 pod,例如:
$ kubectl run <container_name> --image=<some_image>
它非常适合运行实验性 Pod、在 k8s 中创建临时资源和其他工作负载(稍后我们将讨论工作负载)。
我们可以使用创建多个 Pod kubectl run ...,但是如果我们想与其他人、团队甚至开源社区分享我们如何声明我们的 Pod怎么办?
如何在像 Git 这样的 VCS 存储库中使用标准序列化格式在 k8s中共享我们应用程序所需状态的表示?
Kubernetes 带来了一种序列化格式,可以用来表示我们的 Pod,是的,不管你喜不喜欢,它就是众所周知的YAML。
创建一个 Pod
使用 YAML,我们可以使用kind属性声明 Kubernetes 对象。K8s 使用了许多不同类型的对象,我们将在以后的文章中探讨这些对象,但此时我们将从 Kubernetes 中最常见和最小的单元开始:一个 Pod。
我们的Pod 规范应该由以下部分组成:
一个名为“服务器”的容器,由图像支持ubuntu,与 Pod 共享一个卷。这个容器将在共享卷中创建一个UNIX 命名管道,又名FIFO,监听进入 FIFO 的一些消息。
一个名为“客户端”的容器,也由图像支持ubuntu,与 Pod 共享一个卷。该容器将向共享卷写入一条名为“嘿”的简单消息。
期待
服务器启动时,将在共享卷中创建 FIFO。服务器一直在等待一些消息到达 FIFO。
当客户端启动时,它会将消息“Hey”写入共享卷。
之后,我们查看容器服务器日志,因为它应该打印客户端发送的消息 Hey。
让我们声明 YAMl 文件fifo-pod.yml:
kind:PodapiVersion:v1metadata:name:fifo-podspec:volumes:-name:queueemptyDir:{}containers:-name:serverimage:ubuntuvolumeMounts:-name:queuemountPath:/var/lib/queuecommand:["/bin/sh"]args:["-c","mkfifo /var/lib/queue/fifo; cat /var/lib/queue/fifo"]-name:clientimage:ubuntuvolumeMounts:-name:queuemountPath:/var/lib/queuecommand:["/bin/sh"]args:["-c","echo Hey > /var/lib/queue/fifo"]
kind:对象种类。在这种情况下,只需 Pod
metadata name:集群中 Pod 的名称,在当前默认命名空间下(我们将在以后的文章中讨论命名空间)
volumes:Pod 的共享卷。我们正在使用emptyDir它将共享 Pod 文件系统中的任何空目录
volumeMounts:将 Pod 的共享卷挂载到容器文件系统的某个目录中
command:要在容器中执行的命令
声明后,我们可以使用 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
我们有一个名为 Podnginx的Running6 天。这很容易理解,因为我在 6 天前运行过kubectl run nginx --image=nginx。另外,众所周知,NGINX 是一个持续运行的 Web 服务器(监听 TCP 连接),因此 Pod 仍处于 Running状态。
但是我们刚刚创建的 Podfifo-pod正在返回一个Completed状态。为什么?
Pod 生命周期
与Docker 中的容器一样,Pod 被设计为短暂的。一旦 Pod 被调度(分配)到一个节点,Pod 就会在该节点上运行,直到它停止或终止。
Pod 生命周期按阶段工作。让我们了解每个阶段。
待办的
这是当一个 Pod 被集群接受但它的容器还没有准备好时。Pod尚未调度到任何节点。
跑步
所有容器都已创建,并且Pod 已被调度到一个节点。
至少有一个容器仍在运行或正在启动。
成功/失败
如果所有容器都Terminated成功,则 Pod 状态为Succeeded。
但是如果所有容器都已终止但至少有 1 个容器失败终止,则 Pod 状态为Failed。
终止/完成
表示所有容器都已终止(在 Kubernetes 内部)或已完成。
更多关于 Pod 生命周期
Pod 生命周期在 Kubernetes 中是一个比较大的话题,涵盖了 Pod 的状态、就绪性、活跃度等。我们将在以后的文章中深入探讨有关生命周期的更多细节。
包起来
这篇文章更多地展示了Pod,它是Kubernetes 中最小和主要的可部署单元。
最重要的是,我们还创建了一个 Pod,其中包含两个使用 FIFO 和共享卷相互通信的容器。
此外,我们还了解了Pod 生命周期。因此,Pod 生命周期及其生命周期对于理解即将发布的帖子的主题至关重要:Kubernetes 中的自我修复能力。
敬请期待!