kubernetes网络通信原理

发布于:2022-10-21 ⋅ 阅读:(340) ⋅ 点赞:(0)

Kuberners的网络模型假定了所有Pod都在一个可以直接连通的扁平的网络空间中,这在GCE(Google Compute Engine) 里面是现成的网络模型,Kubernets假定这个网络已经存在。

而在私有云里搭建Kubernets集群,就不能假定这个网络已经存在了。我们需要自己实现这个网络假设,将不通节点上的Docker容器之间的互相访问先打通,然后运行kubernetes

一、Kubernetes网络模型

在Kubernetes网络中存在两种IP(Pod IP和Service Cluster IP),Pod IP 地址是实际存在于某个网卡(可以是虚拟设备)上的,Service Cluster IP它是一个虚拟IP,是由kube-proxy使用Iptables规则重新定向到其本地端口,再均衡到后端Pod的。下面讲讲Kubernetes Pod网络设计模型:

1、基本原则:

每个Pod都拥有一个独立的IP地址(IPper Pod),而且假定所有的pod都在一个可以直接连通的、扁平的网络空间中。

2、设计原因:

用户不需要额外考虑如何建立Pod之间的连接,也不需要考虑将容器端口映射到主机端口等问题。

3、网络要求:

所有的容器都可以在不用NAT的方式下同别的容器通讯;所有节点都可在不用NAT的方式下同所有容器通讯;容器的地址和别人看到的地址是同一个地址。

二、Kubernetes网络基础

访问场景:

1、同一个Pod内的多个容器之间的访问

同一个Pod的容器共享同一个网络命名空间,它们之间的访问可以用localhost地址 + 容器端口就可以访问

2、同一Node中Pod间通信:

同一Node中Pod的默认路由都是docker0的地址,由于它们关联在同一个docker0网桥上,地址网段相同,所有它们之间应当是能直接通信的。

 3、不同Node中Pod间通信:

 

  4、Pod与Service之间的通信:

       各节点的iptables规则

三、Flannel插件

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

原理解析:

基础:

flanneld作为守护进程运行在Node节点之上,监听端口用于接受和转发数据包,并开启一个Flannel0的网桥用于收集Docker0网桥转发的数据报文

1、webapp2发送数据报文,源地址为10.1.15.2,目标地址为10.1.20.2,因为目标地址与源地址不是同一个网段,于是请求报文发往Docker0网桥

2、Docker0网桥的数据转发会被Flannel0网桥实时收集(钩子函数实现),Flannel0网桥从etcd中获取路由表信息,判断数据包被发送往哪台目的机器。

3、Flannel0网桥是由Flanneld守护进程开启,所以数据报文被传到Flanneld进行UDP协议封装、如Mac/目的地址/实体等


网站公告

今日签到

点亮在社区的每一天
去签到