【K8s】整体认识K8s之集群的pod之间的通信
先来说说K8s中最流行的两个网络插件Calico和Flannel。他们的目标都是,让K8s的pod不通过NAT直接通信。
NAT(网络地址转换):将内部私有的IP地址转换为对外共有的IP地址
Calico网络插件。
Calico是一个三层虚拟网络方案,三层指的是OSI模型中的网络层,他将每个节点都当作路由器,节点的每个pod当作一个终端,分配一个ip,pod内的容器共享这个ip,该IP来自Calico配置的IP池。每个节点路由器通过BGP学习生成路由规则,从而将不同节点上的pod连接起来。
Flannel网络插件。
采用Overlay网络(隧道网络),他在物理网络之上又构建了一个虚拟网络。Pod的数据包被封装在主机的数据包中进行传输。他会为每个节点分配一个子网段,节点的pod在这个子网段中获取ip地址。数据转发使最常用的是VXLAN(virtual extensible local area network虚拟可扩展局域网)。比如podA(node1)向podB(node2)发送数据时,node1的flanneld进程会将数据包重新封装到一个UDP数据包中,这个新数据包的源地址是node1的ip,目标地址是node2的ip,网络设备只能看到结点间的UDP通信,无需关心podIP,node2收到后。由flanneld解封装,再将原始数据包发送给podB。
集群的pod之间的通信
K8s通过一个扁平的网络模型以及CNI容器网络接口来为pod提供网络服务,每个pod都有一个独一无二的IP,依赖这个ip通信,为实现这个目标,k8s依赖以下下关键机制:
核心网络模型。K8s规定了所有的pod都处于一个扁平的网络空间中,这意味着不需要NAT任何一个pod都可以直接通过IP地址访问另一个pod,不管他们在不在同一个节点。
实现方式。CNI它是一个可插拔的网络接口,k8s本身不直接实现这个网络模型,而是定义了这套标准接口,它将具体的网络实现委托给了第三方的网络插件,比如calico、 flannel当一个pod被创建的时候,它会自动调用已经安装的CNI插件来完成以下工作。
- 首先为pod分配一个IP地址,从一个预定义的IP池中分配一个唯一的IP。
- 然后设置网络连接 1)、同一个节点的pod通信:CNI插件,它会创建一个虚拟的网桥,并将这个节点内的所有的pod都连接到这个网桥上,让它们可以像连接在同一个交换机上一样通信。 2)、跨节点的pod通信,这是最关键的部分,CNI插件通过不同的技术来实现。最常见的两种,第一种覆盖网络overlay network,比如flannel、 weave net,它会在各个节点之间创建一个虚拟的隧道,如VXLAN,它将一个节点上pod发出的数据包封装起来,再通过节点网络传送给目标pod的所在的节点,再解包,并且交给目标pod,就像在物理网络之上建立了一个虚拟的网络高速公路。另一种是是路由,比如Calico,它不会创建隧道,它是直接配置节点的路由表,每个节点都会被告知要去往某个pod,应该把数据包发给哪个节点,这种方式避免了封包和解包的开销,性能更高。