https://blog.csdn.net/qq_41999455/article/details/104246356
网络通讯模式
Kubernetes 的网络模型假定了所有Pod 都在一个可以直接连通的扁平的网络空间中,这在GCE(Google Compute Engine)里面是现成的网络模型,Kubernetes 假定这个网络已经存在。而在私有云里搭建Kubernetes 集群,就不能假定这个网络已经存在了。我们需要自己实现这个网络假设,将不同节点上的Docker 容器之间的互相访问先打通,然后运行Kubernetes
网络通讯模式的方式
同一个Pod 内的多个容器之间:localhost
各Pod 之间的通讯:Overlay Network
Pod 与Service 之间的通讯:各节点的Iptables 规则
同一个Pod 内的多个容器之间
同一个Pod的容器共享同一个网络命名空间,它们之间使用Puse的一个网络协议栈,可以理解为它们之间的访问可以通过localhost地址和容器端口实现;
各Pod 之间的通讯
同一Node不同Pod间是通过Docker网桥来进行数据包分配传输的,它们关联在同一个Docker0网桥上,地址网段相同,IP1、IP2、IP3属于同一个网段,所以它们之间能通信;
Pod 与Service 之间的通讯
目前基于性能考虑,全部为iptables维护和转发,这个是老式的。更新高级的是LVS,性能更高。
在这里补充一下关于外网的网络通信:
- Pod到外网:Pod向外网发送请求,查找路由表,转发数据包到宿主机的网卡,宿主网卡完成路由选择后,IPtables执行Masquerade,把源IP修改为宿主网卡的IP,然后向外网服务器发送请求;
- 外网访问Pod:通过service来访问,一般使用NodePort;
Flannel网络介绍
Flannel 是CoreOS 团队针对Kubernetes 设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker 容器都具有全集群唯一的虚拟IP地址。而且它还能在这些IP 地址之间建立一个覆盖网络(Overlay Network),通过这个覆盖网络,将数据包原封不动地传递到目标容器内
它的主要思路是:预先留出一个网段,每个主机使用其中一部分,然后每个容器被分配不同的ip;让所有的容器认为大家在同一个直连的网络,底层通过UDP/VxLAN等进行报文的封装和转发。
Flannel工作原理
- flannel默认使用8285端口作为UDP封装报文的端口,VxLan使用8472端口。
如果此时需要Node1节点的app1发送数据包到达Node2节点的Backend,那就需要通过一下步骤来使得两者构建通信:
- app1将自身IP地址、目标IP及其所发数据发送至Docker0的网桥;
- Docker0获取到发送的数据包,由于目标IP的网段与当前Docker0的网段不是同一个,所以它会通过钩子函数抓取数据信息继续发送至Flannel0的网桥;
- Flannel0网桥这时候会通过Flanneld中的路由表信息来确定具体的转发路径,此时会进行一个数据的二次封装,然后通过对应的外部节点IP(192.168.0.100/24)发送到目标外部IP(192.168.0.200/24);
- 发送到Node2节点之后会对数据包进行解析获取具体目标Pod的IP(10.1.20.3/24),然后发送到Backend从而完成整个Pod通信;
ETCD 之 Flannel 提供说明
存储管理Flannel 可分配的IP 地址段资源 (防止IP冲突)
监控ETCD 中每个 Pod 的实际地址,并在内存中建立维护 Pod 节点路由表