~阿弥陀佛~

人生能有多少天是按照自己的想法去活着

K8S网络通讯模式

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

不同情况下网络通讯方式

 同一个pod内部通讯 同一个pod共享同一个网络命名空间,共享同一个linux协议栈

Pod1pod2

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

l  Pod1pod2在同一台机器,由docker0网桥直接转发请求至pod2,不需要经过flannel

Podservice的网络,目前基于性能考虑,全部为iptables维护和转发(最新版本的可以改为lvs模式)

Pod到外网pod向外网发送请求,查找路由表,转发数据包到宿主机的网卡,宿主网卡完成路由选择后,iptables执行masquerade,把源IP更改为宿主网卡的IP,然后向外网服务器发送请求。(通过snat转换)

外网访问podservice   nodeport方式进行映射)

网络解决方案

Kubernetes+flannel

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

1 webapp1  2 3以及backend分别是四个pod,所有的流量访问到backend上,它去经过自己的网关去处理,把相应的请求分配到相应的服务,因此webapp1  2 backend通讯需要跨主机,webapp3backend不同的pod之间通讯。

【图1释义:

同主机pod之间通讯:

首先,在真是物理机上安装一个flanneld的守护进程,该进程会监听一个端口用于收发数据包,flanneld启动后会开启 一个网桥叫做flanneld0 flanneld0去专门去手机docker0转发的数据包,此处可以理解为一个钩子函数强行获取数据报文,docker0会分配自己的IP到对应的pod上,如果是同一台主机两个不同的pod之间互相访问的话走的是docker0的网桥。

跨主机pod之间通讯(消耗资源比较高):

假设webapp2想要把数据包发送到backend,源地址:10.1.15.2/24   目标地址: 10.1.20.3/24 

10.1.15.2/24发给它的网关docker0docker0里会有对应的钩子函数将数据包抓到flannel0里此处会有很多路由记录从etcd获取到写入当前主机,到flanneld之后会进行一个封装, 封装mac 三层信息source(源):192.168.66.11 Destination(目标): 192.166.66.12 udp数据报文(更快); 新的三层信息: source: 10.1.15.2  Destination 10.1.20.3payload(数据包实体)

然后转发到192.166.66.12 找到对应flanneld的端口,flanneld截获数据报文后进行拆封,之后docker0会进行二次解封最终到达目标pod

 

EtcdFlannel提供说明:

l  存储管理flannel可分配的IP地址段资源(flannel在启动后会向ETCD中去插入可以分配的网段,并且会记录哪个网段分配到哪个机器上,防止网段被再利用导致冲突)

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

Next Post

Previous Post

Leave a Reply

© 2021 ~阿弥陀佛~

ICP备案号: 京ICP备19038630号

版权所有@ 王力翔

耗时 0.193 秒 | 查询 41 次 | 内存 22.35 MB