Kubernetes in Action笔记 - (3) Pod介绍
文章目录
什么是Pod
Pod是k8s的基本构建模块,包含一个或者多个容器。一个Pod中的所有容器都运行在同—个节点上,绝不跨越两个节点
为何需要Pod
多个容器比单个容器中包含多个进程要好
想象一个由多个进程组成的应用程序, 无论是通过ipc (进程间通信)还是本地存储文件进行通信, 都要求它们运行于同一 台机器上。 在k8s中, 我们经常在容器中运行进程, 由于每一个容器都非常像一台独立的机器, 此时你可能认为在单个容器中运行多个进程是合乎逻辑的, 然而在实践中这种做法并不合理。
容器被设计为每个容器只运行一个进程(除非进程本身产生子进程)。如果在单个容器中运行多个不相关的进程, 那么保持所有进程运行、 管理它们的日志等将会是我们的责任。例如, 我们需要包含一种在进程崩溃时能够自动重启的机制。同时这些进程都将记录到相同的标准输出中, 而此时我们将很难确定每个进程分别记录了什么。
综上所述, 我们需要让每个进程运行于自己的容器中, 而这就是Docker和k8s期望使用的方式。
引入Pod
由于不能将多个进程聚集在一个单独的容器中, 我们需要另一种更高级的结构来将容器绑定在一起,并将它们作为一个单元进行管理,这就是 Pod 背后的根本原理。
在包含容器的 Pod 下,我们可以同时运行一些密切相关的进程,并为它们提供几乎相同的环境, 此时这些进程就好像全部运行于单个容器中一样, 同时又保持着一定的隔离。这样一来, 我们便能全面地利用容器所提供的特性, 同时对这些进程来说它们就像运行在一起一 样, 实现两全其美。
Pod的一些特征
同一Pod中容器之间的部分隔离
Pod内部的容器共享部分资源(不是全部),没有完全隔离。这些容器共享相同的 Linux 命名空间, 而不是每个容器都有自己的一组命名空间。比如,它们有相同的 network 和 UTS 命名空间,所以它们都共享相同的主机名和网络接口。
但当涉及文件系统时, 情况就有所不同。 由于大多数容器的文件系统来自容器镜像, 因此默认情况下, 每个容器的文件系统与其他容器完全隔离。但是,可以使用名为 Volume 的 k8s 资源来共享文件目录。
Pod内部容器共享相同的IP和端口空间
由于一个pod中的容器运行于相同的 Network 命名空间中, 因此它们共享相同的 IP 地址和端口空间。这意味着在同一 pod 中的容器运行的多个进程需要注意不能绑定到相同的端口号, 否则会导致端口冲突, 但这只涉及同一pod 中的容器。
由于每个 pod 都有独立的端口空间, 对于不同 pod 中的容器来说则永远不会遇到端口冲突。
此外, 一个pod 中的所有容器也都具有相同的 loopback网络接口, 因此容器可以通过 localhost 与同一 pod 中的其他容器进行通信。
平坦的Pod之间网络
k8s 集群中的所有 pod 都在同一个共享网络地址空间中, 这意味着每个 pod 都可以通过其他 pod 的 IP 地址来实现相互访问。 换句话说, 这也表示它们之间没有 NAT (网络地址转换) 网关。 当两个 pod 彼此之间发送网络数据包时, 它们都会将对方的实际 IP 地址看作数据包中的源 IP 。
不论是将两个 pod 安排在相同或是不同的工作节点上, 同时不管实际节点间的网络拓扑结构如何, 这些 pod 内的容器都能够像在无 NAT 的平坦网络中一样相互通信
通过Pod合理管理容器
- 应该将多层应用分散到多个 pod 中。比如前后端应用要分别在不同的pod中
- 基于扩缩容考虑而分割到多个 pod 中。不应该将应用程序都放到单一pod 中的原因就是扩缩容。 pod 也是扩缩 容的基本单位, 如果两个应用的扩缩容需求不一致,那肯定是要放在不同的pod中
将多个容器添加到单个 pod 的主要原因是应用可能由一个主进程和一个或多个辅助进程组成。比如一个是主业务服务容器,另外一个是sidecar容器。sidecar 容器的例子包括日志轮转器和收集器、数据处理器、通信适配器等。
基本上, 总是应该倾向于在单独的pod 中运行容器, 除非有特定的原因要求它们是同一 pod 的一部分。当决定是将两个容器放入一个 pod 还是两个单独的 pod 时, 需要考虑以下问题:
- 它们需要一起运行还是可以在不同的主机上运行?
- 它们代表的是一个 体还是相互独立的组件?
- 它们必须一起进行扩缩容还是可以分别进行?
图书资料: