了解Pod

Pod是Kubernetes创建或部署的最小/最简单的基本单位,一个Pod代表集群上正在运行的一个进程。

一个Pod封装一个应用容器(也可以有多个容器),存储资源、一个独立的网络IP以及管理控制容器运行方式的策略选项。Pod代表部署的一个单位:Kubernetes中单个应用的实例,它可能由单个容器或多个容器共享组成的资源。

Kubernetes中的Pod使用可分两种主要方式:

<aside> 💡 还有一种容器, 称之为 sidecar, 指的就是我们可以在一个 Pod 中,启动一个辅助容器,来完成一些独立于主进程(主容器)之外的工作。这种容器可以以 Init Container 得方式, 在主 Container 运行之前完成, 譬如说准备好代码包, 拷贝一些文件等

</aside>

每个Pod都是运行应用的单个实例,如果需要水平扩展应用(例如,运行多个实例),则应该使用多个Pods,每个实例一个Pod。在Kubernetes中,这样通常称为Replication。Replication的Pod通常由Controller创建和管理。

创建Pod与 docker run --net --volumes-from 的本质区别在于, 使用 docker 的方式要求, 容器与容器之间有启动先后顺序之分, 这样一个 Pod 里的多个容器就不是对等关系,而是拓扑关系了.

所以, 在 Kubernetes 项目里,Pod 的实现需要使用一个中间容器,这个容器叫作 Infra 容器。在这个 Pod 中,Infra 容器永远都是第一个被创建的容器,而其他用户定义的容器,则通过 Join Network Namespace 的方式,与 Infra 容器关联在一起。

<aside> 💡 通过Infra容器使得Pod中得容器得以共享 Mount Namespace , Network Namespace 之后, 对于 Pod 里的容器 A 和容器 B 来说:

  1. 它们可以直接使用 localhost 进行通信;
  2. 它们看到的网络设备跟 Infra 容器看到的完全一样;
  3. 一个 Pod 只有一个 IP 地址,也就是这个 Pod 的 Network Namespace 对应的 IP 地址;
  4. 其他的所有网络资源,都是一个 Pod 一份,并且被该 Pod 中的所有容器共享;
  5. Pod 的生命周期只跟 Infra 容器一致,而与容器 A 和 B 无关。

</aside>

Pods如何管理多个容器

Pods的设计可用于支持多进程的协同工作(作为容器),形成一个cohesive的Service单位。Pod中的容器在集群中Node上被自动分配,容器之间可以共享资源、网络和相互依赖关系,并同时被调度使用。

请注意,在单个Pod中共同管理多个容器是一个相对高级的用法,应该只有在容器紧密耦合的特殊实例中使用此模式。例如,有一个容器被用作WEB服务器,用于共享volume,以及一个单独“sidecar”容器需要从远程获取资源来更新这些文件.

网络

每个Pod被分配一个独立的IP地址,Pod中的每个容器共享网络命名空间,包括IP地址和网络端口。Pod内的容器可以使用localhost相互通信。当Pod中的容器与Pod 外部通信时,他们必须协调如何使用共享网络资源(如端口)。

存储

Pod可以指定一组共享存储volumes。Pod中的所有容器都可以访问共享volumes,允许这些容器共享数据。volumes 还用于Pod中的数据持久化,以防其中一个容器需要重新启动而丢失数据。