【Kubernetes】第二章,pod介绍

容器本来是通过namespace分隔的,彼此之间独立的,pod实现容器间部分组件互相通信。只要运行一个pod,Pause容器就会被启动。然后pod里面的其他容器共用pause的网络栈和存储,端口不能冲突,

pod分为两种。
自主式pod:死亡之后没人管
控制器管理的pod:控制器有RC(老版),RS(不支持滚动更新),deployment(需要RS干活),HPA(cpu限制),statefulset(解决有状态服务),DaemeonSet(每个节点有一个pod)

Pod通信方式。
同一个pod的多个容器,是通过pause容器通信,直接localhost;
各个pod之间通信,通过overlay network(flannel是coreos团队设计的一种);
Pod和service之间通信,通过iptables规则,新版的是lvs模式。
同一组pod通过标签选择绑定一个service。Pod组之间通信可以通过访问service的方式进行。

Flannel网络。
让集群中不同物理节点创建的docker容器具有全集群唯一的虚拟IP地址,然后在这些IP地址之间建立一个overlay network,通过这个覆盖网络可以将数据包原封不动地传递到目标容器内。

例图:
【Kubernetes】第二章,pod介绍_第1张图片
首先在节点上安装flanneld的守护进程,它会开启一个监听端口,进行接收和转发数据包。也会开启一个叫flannel0的网桥,专门搜集docker0的数据报文。Docker0主要是给对应的pod分配ip地址。
如果是同一个节点的不同pod相互访问,走的就是docker0,它们只是docker0下的不同子网而已。
三个web要访问Backend,比如app2跨主机访问backend,它的数据包源地址是10.1.15.2/24,目标是10.1.20.3/24,因为不是同一个网段,所以数据包发到它的网关docker0:10.1.15.1/24。Docker0上会有钩子函数把数据包转到flannel0也就是给flanneld进程进行处理。Flanneld处理的是upd层,也可以说是ip in ip。Etcd中记录的有路由表,最右边那个图,mac层,源ip是192.168.66.11,目的ip是192.168.66.12。udp层,源ip是10.1.15.2,目的ip是10.1.20.3。数据包走到192.168.66.12以后,被新节点的flanneld截获,拆分,再转发到flannel0,经过docker0到达backend。

你可能感兴趣的:(k8s)