Kubernetes 实战 —— 03. pod: 运行于 Kubernetes 中的容器

本文深入探讨了Kubernetes中的核心概念Pod,解释了为何需要Pod以及其重要性。Pod作为基本构建模块,允许多个容器并置运行,共享命名空间和资源。文章还介绍了Pod间的部分隔离、网络通信以及如何通过标签和注解进行管理和组织。此外,讨论了如何创建、管理Pod,包括端口映射、日志查看、使用标签选择器等,强调了合理利用Pod来部署和管理容器的重要性。
摘要由CSDN通过智能技术生成

Kubernetes 实战 —— 01. Kubernetes 介绍
Kubernetes 实战 —— 02. 开始使用 Kubernetes 和 Docker
Kubernetes 实战 —— 03. pod: 运行于 Kubernetes 中的容器
Kubernetes 实战 —— 04. 副本机制和其他控制器:部署托管的 pod
Kubernetes 实战 —— 05. 服务:让客户端发现 pod 并与之通信(上
Kubernetes 实战 —— 05. 服务:让客户端发现 pod 并与之通信(下

介绍 pod

pod 是 Kubernetes 中最为重要的核心概念,而其他对象仅仅用于 pod 管理、 pod 暴露或被 pod 使用。 pod 是一组并置的容器,代表了 Kubernetes 中的基本构建模块。

当一个 pod 包含多个容器时,这些容器总是运行于同一个工作节点上——一个 pod 绝不会跨越多个工作节点。
在这里插入图片描述

为何需要 pod

为何多个容器比单个容器中包含多个进程要好

假设一个由多个进程组成的应用程序,无论是通过 IPC (进程间通信)还是本地存储文件进行通信,都要求它们运行于同一台机器上。如果在单个容器中运行多个不相关的进程,那么保持所有进程运行、管理它们的日志等将会是我们的责任。例如,我们需要包含一种在进程奔溃时能够自动重启的机制;同时这些进程都将记录到相同的标准输出中,而此时我们将很难确定每个进程分别记录了什么。

了解 pod

由于不能将多个进程聚集在一个单独的容器中,我们需要另一种更高级的结构来将容器绑定在一起,并将它们作为一个单元进行管理,这就是 pod 背后的真正原因。

在包含容器的 pod 下,我们可以同时运行一些密切相关的进程,并为它们提供(几乎)相同的环境,此时这些进程就好像全部运行于单个容器中一样,同时又保持着一定的距离。这样一来,我们便能全面地利用容器所提供的特性,同时对这些进程来说它们就像运行在一起一样。

同一 pod 中容器之间的部分隔离

Kubernetes 通过配置 Docker 来让一个 pod 内的所有容器共享相同的 Linux 命名空间,而不是每个容器都有自己的一组命名空间。

由于一个 pod 中的所有容器都在相同的 Network 和 UTS 命名空间下运行(01. Kubernetes 介绍),所以它们都共享相同的主机名和网络接口。同样地,这些容器也都在相同的 IPC 命名空间下运行,因此能够通过 IPC 进行通信。在最新的 Kubernetes 和 Docker 版本中,它们也能够共享相同的 PID 命名空间,但是该特性默认未开启。

注意:当一个 pod 中的容器使用单独的 PID 命名空间时,在容器中执行 ps aux 就只会看到容器自己的进程。

由于大多数容器的文件系统来自容器镜像,因此默认情况下,每个容器的文件系统与其他容器完全隔离。但我们可以使用名为 Volume 的 Kubernetes 资源来共享文件目录。

容器如何共享相同的 IP 和端口空间

由于同一个 pod 中的容器运行于相同的 Network 命名空间中,因此在同一个 pod 中的容器运行的多个进程需要注意不能绑定到相同的端口号,否则会导致端口冲突。同一个 pod 中的所有容器具有相同的 loopback 网络接口,因此容器可以通过 localhost 与同一 pod 中的其他容器进行通信。

由于每个 pod 都有独立的端口空间,对于不同 pod 中的容器来说则永远不会遇到端口冲突。

介绍扁平化 pod 间网络

Kubernetes 集群中的所有 pod 都在同一个共享网络地址空间中,每个 pod 都可以通过其他 pod 的 IP 地址来实现相互访问,即这些 pod 之间没有 NAT (网络地址转换)网关。当两个 pod 彼此之间发送网络数据包时,它们都会将对方的实际 IP 地址看作数据包中的源 IP

在这里插入图片描述
总结: pod 是逻辑主机,其行为与非容器世界中的物理主机或虚拟机非常相似。运行在同一个 pod 中的进程与运行在同一物理机或虚拟机上的进程相似,只是每个进程都封装在一个容器之中。

通过 pod 合理管理容器

将多层应用分散到多个 pod 中

基于扩缩容考虑而分割到多个 pod 中: Kubernetes 不能横向扩缩单个容器,只能扩缩整个 pod
紧密耦合到容器组可以添加到同一个 pod 中:通常为一个主容器和若干个支持容器
主容器:可以是 Web 服务器
支持容器:可以是日志轮转器、收集器、数据处理器、通信适配器等

在这里插入图片描述
除非有特定的原因要求容器是同一个 pod 中的一部分,否则应该在单独的 pod 中运行容器

  • 它们需要一起运行还是可以在不同的主机上运行?
  • 它们代表的是一个整体还是相互独立的组件?
  • 它们必须一起进行扩缩容还是可以分别进行?

在这里插入图片描述
以 YAML 或 JSON 描述文件创建 pod
通过 YAML 文件定义所有的 Kubernetes 对象之后,还可以将它们存储在版本控制系统中,充分利用版本控制所带来的便利性。//加入Java开发交流君样:756584822一起吹水聊天
检查现有 pod 的 YAML 描述文件
kubectl get pod -o yam 命令可以查看指定 pod 的完整 YAML 定义。

介绍 pod 定义的主要部分

YAML 中使用的 Kubernetes API 版本

YAML 描述的资源类型

metadata: 包括名称、命名空间、标签和关于该容器的其他信息
spec: 包含 pod 内容的实际说明,例如 pod 的容器、卷和其他数据
status: 包含运行中的 pod 的当前信息,例如 pod 所处的条件、每个容器的描述和状态,以及内部 IP 和其他基本信息
status 包含只读的运行时数据,该数据展示了给定时刻的资源状态。在创建新的 pod 时, status 部分不需要提供
创建

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值