kubernetes的基本单位Pod详解( 二 )

在 kubernetes 进行调度的时候,会执行如下命令:
docker run --name expod-container busybox sh -c 'echo "Hello Kubernetes!"; sleep 3600'command 和 args 的设置会分别覆盖 Docker 镜像中定义的 EntryPoint 与 CMD 。
Pod 组织容器的方式Pod 是由各个容器组成的一个整体,同时调度到某台 Node 上,容器之间可以共享资源、网络环境和依赖,并拥有相同的生命周期 。
容器如何组成一个 Pod每个 Pod 都包含一个或一组密切相关的业务容器,但是还有一个成为”根容器“的特殊 Pause 容器 。Pause 容器是属于 Kubernetes 的一部分,如果一组业务容器作为一个整体,我们很难对整个容器进行判断,假如一个业务组容器当中的某个容器挂载了能代表整个 Pod 都挂载了吗?如果引入一个和业务无关的 Pause 容器,用它作为 Pod 的根容器,用它的状态代表整组容器的状态,就能解决这个问题 。而且一个 Pod 中的所有容器都共享 Pause 容器的 IP 地址及其挂载的存储卷,这样也简化了容器之间的通信和数据共享问题,类似于 Docker 容器网络的 Container 模式 。
我们在开始创建的 Pod,可以登录上对应的 Node 机器,查看容器信息 。
kubectl get pod -o wide

kubernetes的基本单位Pod详解

文章插图
 
登录 k8s-node2 以后,执行 docker ps 命令查看详细信息:
kubernetes的基本单位Pod详解

文章插图
 
可以看到有三个 pause 容器,其中两个是 flannel 和 proxy 容器,还有一个是我们的 expod 的容器,它与另一个 expod 容器共同组成了一个 Pod 。
Pod 中的容器共享两种资源-存储和网络 。
  • 存储
在 Pod 里面,我们可以指定一个或者多个存储卷,Pod 中的所有容器都可以访问这些存储卷,存储卷可以分为临时和持久化两种 。
kubernetes的基本单位Pod详解

文章插图
 
  • 网络
在 kubernetes 集群中,每个 Pod 都分配了唯一的 IP 地址,Pod 中的容器都共享网络命名空间,包括 IP 地址和网络端口 。在 Pod 内部各容器之间可以通过 localhost 互相通信 。我们可以对比一下 Docker 和 kubernetes 在网络空间上的差异 。
kubernetes的基本单位Pod详解

文章插图
Docker的网络空间
从图中可以看出,容器之间通过docker0网卡连接,每个容器拥有独立的内部网络地址
kubernetes的基本单位Pod详解

文章插图
kubernetes 的网络空间
从图中可以看出,Pod 中的所有容器共享一个网络地址
Pod 之间如何通信Pod 之间的通信主要分为两种情况:
  • 同一个 Node 上 Pod 之间的通信
同一个 Node 上的 Pod 使用的都是相同的网桥( docker0 )进行连接,相当于 Docker 的网络空间,只不过是以 Pod 为基础 。每个 Pod 都有一个全局 IP 地址,同一个 Node 内不同 Pod 之间通过 veth 连接在同一个 docker0 网桥上,其 IP 地址都是从 docker0 网桥上动态获取的,并且关联在同一个 docker0 网桥上,地址段也相同,所以它们之间能直接通信 。
  • 不同 Node 之间的 Pod 通信
要实现不同 Node 的 Pod 之间通信,首先要保证 Pod 在一个 kubernetes 集群中拥有全局唯一的 IP 地址 。又因为一个 Node 上的 Pod 是通过 Docker 网桥与外部进行通信的,所以只要将不同 Node 上的 Docker 网桥配置成不同的 IP 地址段就可以实现这个功能 。Flannel 会配置 Docker 网桥,通过修改 Docker 的启动参数 bip 来实现这一点,这样就使得集群中机器的 Docker 网桥就得到了全局唯一的 IP 地址段,机器上所创建的容器也就拥有了全局唯一的 IP 地址 。
kubernetes的基本单位Pod详解

文章插图
跨 Node 的 Pod 之间的通信
我们在搭建 kubernetes 集群的时候,在每个 Node 机器上都创建了一个 kube-flannel 容器,这是在每个 Node 机器上使用 Flannel 虚拟网卡接管容器并跨主机通信,当一个节点的容器访问另一个节点的容器时,源节点上的数据会从 docker0 网桥路由到 flannel0 网卡,在目的节点处会从 flannel0 网卡路由到 docker0 网桥,然后再转发给目标容器 。Flannel 重新规划了容器集群的网络,这样既保证了容器 IP 的全局唯一性,又让不同机器上的容器能通过内网 IP 地址互相通信 。但是,容器的 IP 地址并不是固定的,Flannel 只分配子网段,所以容器的 IP 地址是在此网段的范围内进行动态分配的 。


推荐阅读