1 前言
Kubernetes的网络模型假定了所有的pod都在一个可以直接连通的扁平的网络空间中,这在GCE(Google Compute Engine)里面是现成的网络模型,Kubernetes假设这定这个网络已经存在。但是在私有云里搭建Kubernetes集群,就不能够假定这个网络已经存在了。我们需要自己去实现这个网络假设,将不同节点的Docker容器之间的访问互相打通,然后运行Kubernetes。
2 解决方案
2.1 Flannel
Flannel团队是CoreOs团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟ip地址,而且它还能在这个ip地址之间建立一个覆盖网络(Overlay Network),通过这个覆盖网络,将这个数据包原封不动的传递到目标容器内。
假设现在有2台机器,4个pod(包含3个后端的pod(Web app1、Web app2、Web app3),1个前端的pod(Backend))
那么从这张图中就可以看出几个问题了,
一个是在同一个主机中的通讯
一个是在不同主机间的通讯
同一个Pod内部通讯:同一个Pod共享同一个网络命名空间,共享一个Linux协议栈
Pod1至Pod2在同一台主机:由Docker0网桥转发请求至Pod2,不需要经过Flannel
Pod1至Pod2不在同一个主机:Pod的地址是与Docker0在同一个网段的,但docker0网段与宿主机网卡是两个完全不同的IP网段,并且不同之间Node的通信只能通过宿主机的物理网卡进行。将Pod的ip和所在Node的ip关联起来,通过这个关联让Pod互相访问。
Pod至Service网络:基于性能考虑,全部为iptables维护和转发
Pod至外网:Pod向外网发送请求,查找路由表,转发数据包到宿主机的网卡,宿主网卡完成路由选择后ipatables执行Masquerade,把原ip更改为宿主网卡的ip,然后向外网服务器发送请求。
外网访问Pod:Service