k8s系列--网络通讯方式

Kubernetes的网络模型假定了所有 Pod都在一个可以直接连通的扁平的网络空间中,这在GCE(Google Compute Engine)里面是现成的网络模型,Kubernetes假定这个网络已经存在。而在私有云里搭建Kubernetes集群,就不能假定这个网络已经存在了。我们需要自己实现这个网络假设,将不同节点上的Docker容器之间的互相访问先打通,然后运行Kubernetes

同一个Pod内的多个容器之间:lo
各Pod之间的通讯:Overlay Network
Pod 与 Service之间的通讯:各节点的Iptables规则

Flannel 是 Core0S团队针对Kubernetes 设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker 容器都具有全集群唯一的虚拟IP地址。而且它还能在这些IP地址之间建立一个覆盖网络(Overlay Network),通过这个覆盖网络,将数据包原封不动地传递到目标容器内

image
每台服务器安装一个flanneld的守护进程,这个进程会监听一个端口,这个端口就是用于数据服务的端口,flannel进程启动以后会开启一个网桥flannel0,专门收集docker0转发出来的数据报文,docker0会分配同网段ip到对应的容器。

跨主机数据交互,会先把数据转发到flanneld,在flanneld进行数据封装,通过udp转发,后拆封再转交给另一台机器的flanneld

ETCD 之Flannel提供说明:
〉存储管理Flannel可分配的IP地址段资源

监控ETCD 中每个Pod的实际地址,并在内存中建立维护Pod节点路由表

同一个Pod内部通讯:同一个Pod共享同一个网络命名空间,共享同一个Linux协议栈Pod1至 Pod2

Pod1与Pod2不在同一台主机,Pod的地址是与docker0在同一个网段的,但docker0网段与宿主机网卡是两个完全不同的IP网段,并且不同Node之间的通信只能通过宿主机的物理网卡进行。将Pod的IP和所在Node的IP关联起来,通过这个关联让Pod可以互相访问

Pod1与Pod2在同一台机器,由Docker0网桥直接转发请求至Pod2,不需要经过Flannel演示Pod至 Service的网络:目前基于性能考虑,全部为iptables维护和转发Pod到外网:Pod向外网发送请求,查找路由表,转发数据包到宿主机的网卡,宿主网卡完成路由选择后,iptables执行Masquerade,把源IP更改为宿主网卡的IP,然后向外网服务器发送请求外网访问
Pod:Service

Service跟pod访问可以通过LVS或者IPTABLES转换完成

posted @ 2025-09-22 20:51  再练习两年半  阅读(9)  评论(0)    收藏  举报