原文链接:k8s中网络如何通讯 – 编程屋

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

以上只是部分内容,为了维护方便,本文已迁移到新地址:k8s中网络如何通讯 – 编程屋

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐