image.png

Overlay

网络方案介绍之Overlay网络-Flannel(vxlan)
image.png
Flannel 是由CoreOS维护的一个容器跨主机网络方案,由golang语言编写,后端支持多种网络模式。
VxLAN模式:Linux内核3.7+以上版本支持vxlan,使用linux内核中的VxLAN模块封装报文。也是默认模式。
Host-gw模式:即Host Gateway,它是通过在节点上,创建到达目标容器地址的路由直接完成报文转发。但是这种模式要求所有节点必须在同一个二层网络,不太适用于集群跨需要跨子网环境。
UDP模式:使用普通的UDP协议完成对于报文的封装,实现overlay网络的转发。转发性能最差。

Flannel默认网络模式。
每个节点部署一个flanneld作为agent,用于生成vtep设备和从etcd获取和上传subnet信息;
从一个大网段划分子网每个主机对应一个子网;
通过veth-pair网卡连接宿主机和POD;
同子网直接通过CNI0进行数据包转发,不同子网,封装vxlan通过flannel.1这个vtep设备建立的vxlan隧道进行传输。
访问集群外部网络经过iptables做Snat。
image.png
优势
基于VxLAN的Overlay网络虚拟化技术简化网络结构,对底层网络侵入性和依赖性小。
保证整个集群中所有容器能够获得同属一个内网且不重复的IP地址。
学习成本低,应用范围广,用户只需要一些基础知识就可以设置适合大多数用例的环境

缺点
由于利用linux内核的VxLAN模块使用CPU进行数据包的解封装操作,会带来一定的性能损耗。
本身没有网络隔离组件,没有办法进行安全策略控制。使用flanel变种canal可实现隔离,flannel+calico Network policy

Flannel

image.png
🌲K8s Network - 图5

undelay

Calico

网络方案介绍之undelay网络——Calico(BGP)
image.png
Calico是一种开源网络和网络安全解决方案,适用于容器,虚拟机和基于主机的本机工作负载。Calico支持广泛的平台,包括Kubernetes,docker,OpenStack和裸机服务。Calico后端支持两种网络模式。
BGP模式:将节点做为虚拟路由器通过BGP路由协议来实现集群内容器之间的网络访问。
IPIP模式:在原有IP报文中封装一个新的IP报文,新的IP报文中将源地址IP和目的地址IP都修改为对端宿主机IP。

每个节点部署一个calico-node作为agent,从etcd获取和上传subnet信息;
从一个大网段划分子网每个主机对应一个子网;
通过veth-pair网卡连接宿主机和POD;
生成明细路由,同子网直接通过明细路由进行数据包转发
将宿主机做为一个虚拟路由器,整个集群节点默认在一个自治域内,通过BGP路由协议将宿主机上路由条目互相宣告学习,这样整个集群主机都有到对应POD路由信息,不同集群通过生成的BGP路由转发。
访问集群外部网络经过iptables做Snat。
网络策略使用calico-networkpolicy组件生成对应的iptables规则。
image.png

网络方案介绍之undelay网络——Calico(BGP)路由反射
为了防止BGP路由环路,BGP协议规定在一个AS(自治系统)内部,IBGP路由器之间只能传一跳路由信息,所以在一个AS内部,IBGP路由器之间为了学习路由信息需要建立全互联的对等体关系,但是当一个AS规模很大的时候,这种全互联的对等体关系维护会大量消耗网络和CPU资源,所以这种情况下就需要建立路由反射器以减少IBGP路由器之间的对等体关系数量。

image.png

Calico(BGP)网络模型优势:
数据包采用纯三层网络协议转发,没有封装和解封装数据包的过程,传输性能几乎接近于物理网络本身的传输性能。
集群中运行的容器是以独立的IP协议栈进行数据转发,可以通过calico提供的基于iptables的安全管理功能对于集群内的容器进行网络安全防护。
Calico(BGP)网络模型劣势:
需要集群内所有节点在同一个二层网络中,或对应的三层路由转发设备支持并打开BGP路由来学习对应路由条目,对底层网络侵入性较大。
学习成本较高,用户需要具备一定的BGP知识才能完成对一些用例的支持。
若需要硬件设备学习BGP路由,则需要考虑硬件路由器本身性能和最大路由条目数。

Canal是一种将Calico和Flannel网络部署在一起的统一的联合网络解决方案,在Canal网络体系中,由Flannel提供网络解决方案,由Calico提供网络策略支持(例如:对POD之间进行网络流量隔离等),因为Canal底层是flannel,所以Canal一样支持flannel的多种网络模式。
image.png
复习Docker 网络图片来自极客时间:深入剖析Kubernetes
image.png

image.png

image.png

image.png

image.png

image.png

image.png

K8S背后的网络原理

K8s的网络依赖于Docker, 而Docker的网络依赖Linux的网络虚拟化。所以了解K8s的网络应首先了解Docker网络和Linux网络虚拟化。

Linux网络虚拟化

内容 解决问题 方案
网络命名空间 为了支持不同的网络协议栈实例,Linux采用网络空间技术将其隔离在不同的空间,不同网络空间无法直接通信,这样就可以在同一个宿主机上创造不同的网络空间。 实现网络命名空间,需要将进程、套接字、设备放到同一空间下,进行隔离。隔离后的进程模型可理解如下。不同网络空间无法看到对方;但可以将设备在网络空间移动。
屏幕快照 2020-03-08 下午10.15.23.png
Veth设备对 不能网络空间不能访问,在网络空间内也不能访问外部。为了实现不同网络空间的通信,需要Veth设备对。 Veth设备对就像一根网线,两个头分别在不同对网络空间内,从而联通这两个网络空间。
屏幕快照 2020-03-08 下午10.22.58.png
网桥 为了联通不同的网络,Linux提供了网桥技术。 网桥是一个虚拟的网络设备,可认为是一个二层和三层的设备。网桥通过连接不同的网口,并记住不同网口的MAC地址,在MAC地址有效期内将流量转发到对应的端口,实现不同网络的互联。
屏幕快照 2020-03-08 下午10.34.43.png
iptables&netFilter 为了实现不同网络协议栈的数据包修改,Linux提供了iptables和netfilter来对数据包进行修改、过滤和转发。 netfilter工作在内核态,负责维护规则表
iptables可看成是netfilter的客户端,工作在用户态,实现数据修改操作。iptables主要包括4个表和5条链,来实现对数据对修改。
屏幕快照 2020-03-08 下午10.40.22.png
挂载点
屏幕快照 2020-03-08 下午10.40.42.png
路由 当IP层的数据进行转发时,Linux根据路由表对其进行转发。 Linux路由转发规则可依据4步口诀
1: 如果是目的ip,转发到目的ip,否则下一步
2: 如果是目的网络,转发到目的网络对应的网卡,否则下一步
3: 如果没有匹配转发到默认网卡,由该网卡转出,否则下一步
4: 如果都没有,丢弃
屏幕快照 2020-03-08 下午10.46.48.png
屏幕快照 2020-03-08 下午10.47.23.png

Docker网络实现

Docker网络有4种模式:host模式、container模式、none模式和bridge模式。k8s使用的是bridge模式,这里主要介绍bridge模式。

内容 实现方案
docker网桥 Docker在启动时,创建docker网桥,默认为docker0。并创建一个Veth设备对,其中一端挂到网桥上,一端映射到容器内部eth0设备,并分配ip地址。
一般情况ip1、ip2、ip3在不同的网络范围。这样同一个宿主机上的容器可以访问,不同宿主机的容器之间要访问只能在宿主机上开辟端口。
屏幕快照 2020-03-08 下午10.59.59.png

Kubernetes网络

内容 方案
POD内容器到容器的访问 同一个POD内的容器在一个网络空间下,所以可直接通过localhost访问。
屏幕快照 2020-03-08 下午11.05.47.png
同一node上的不同pod互访 同一node的不同pod都连接来docker0网桥,所以可通过docker0网桥直接访问。
屏幕快照 2020-03-08 下午11.08.41.png
不同node的不同pod互访 由于docker0网桥和node ip在不同的网络,而不同node之间的访问必须通过node的ip地址;另外k8s的pod在一个平坦的网络,所有pod可以之间互访,pod的ip地址被保存在etcd中。因此实现不同node的访问需要满足以下两条。
1: pod地址不冲突
2: 将pod ip 与 node ip 关联
屏幕快照 2020-03-08 下午11.16.08.png
通过kube-proxy访问 屏幕快照 2020-03-08 下午11.22.24.png

参考

简书:k8s网络之calico学习
https://www.jianshu.com/p/106eb0a09765

https://mp.weixin.qq.com/s/X43vIG3hE635DiPozvhsGA