跨节点通讯,需要通过NAT,即需要做源地址转换。
k8s网络通信:
1) 容器间通信:同一个pod内的多个容器间的通信,通过lo即可实现;
2) pod之间的通信,pod ip <---> pod ip,pod和pod之间要不经过任何转换即可通信;
3) pod和service通信:pod ip <----> cluster ip(即service ip)<---->pod ip,他们通过iptables或ipvs实现通信,另外大家要注意ipvs取代不了iptables,因为ipvs只能做负载均衡,而做不了nat转换;
4) Service与集群外部客户端的通信
看到mode是空的,我们把它改为ipvs就可以了。
k8s要靠CNI接口接入其他插件来实现网络通讯。目前比较流行的插件有flannet,callco,canel,kube-router。
这些插件使用的解决方案都如下:
1)虚拟网桥,虚拟网卡,多个容器共用一个虚拟网卡进行通信;
2)多路复用:MacVLAN,多个容器共用一个物理网卡进行通信;
3)硬件交换:SR-LOV,一个物理网卡可以虚拟出多个接口,这个性能最好。
CNI插件存放位置
flanel只支持网络通讯,但是不支持网络策略。
callco网络通讯和网络策略都支持。
canel:flanel+callco合起来的功能。
我们可以部署flanel提供网络通讯,再部署一个callco只提供网络策略。而不用canel。
mtu:是指一种通信协议的某一层上面所能通过的最大数据包大小。
通过ifconfig命令,我们可以看到flannel.1的地址是10.244.0.0,子网掩码是255.255.255.255,mtu是1450,mtu要留出一部分做封装叠加,额外开销使用。
cni0只有在pod运行时才会出现。
两个节点上的pod可以借助flannel隧道进行通信。默认使用的VxLAN协议,因为它有额外开销,所以性能有点低。
flannel第二种协议叫host-gw(host gateway),即Node节点把自己的网络接口当做pod的网关使用,从而使不同节点上的node进行通信,这个性能比VxLAN高,因为它没有额外开销。不过他有个缺点,
就是各node节点必须在同一个网段中
。
另外,如果两 个pod所在节点在同一个网段中 ,可以让VxLAN也支持host-gw的功能, 即直接通过物理网卡的网关路由转发,而不用隧道flannel叠加,从而提高了VxLAN的性能,这种flannel的功能叫directrouting。
看到flannel是以pod的daemonset控制器形式运行的(其实flannel还可以以守护进程的方式运行)。
flannel的配置参数:
1、network
:flannel使用的CIDR格式的网络地址,用于为pod配置网络功能。
1)10.244.0.0/16--->
master: 10.244.0.0https://blog.itpub.net/28916011/viewspace-2215295/24
node01: 10.244.1.0/24
....
node255: 10.244.255.0/24
可以支持255个节点
2)10.0.0.0/8
10.0.0.0/24
...
10.255.255.0/24
可以支持6万多个节点
2、SubnetLen
:把network切分为子网供各节点使用时,使用多长的掩码进行切分,默认为24位;
3、SubnetMin
:指明子网中的地址段最小多少可以分给子网使用,比如可以限制10.244.10.0/24,这样0~9就不让用;
4、SubnetMax
:表示最多使用多少个,比如10.244.100.0/24
5、Backend:
Vxlan,host-gw,udp(最慢)
flannel
支持多种后端
Vxlan
1.valan
2.Dirextrouting
host-gw:Host Gateway #不推荐,只能在二层网络中,不支持跨网络,如果有成千上万的Pod,容易产生广播风暴
UDP:性能差
在其他节点上抓包,发现根本就在ens192上抓不到包。
可以看到veth这些接口都是桥接到cni0上的。
brctl show表示查看已有网桥。
可以看到,在node节点,可以在cni0端口上抓到容器里面的Ping时的包。
其实,上面ping时的数据流是先从cni0进来,然后从flannel.1出去,最后借助物理网卡ens32发出去。所以,我们在flannel.1上也能抓到包:
同样,在ens192物理网卡上也能抓到包:
下面我们把flannel的通信模式改成directrouting的方式
[root@master flannel]# kubectl get configmap kube-flannel-cfg -o json -n kube-system
看到有Directrouting,说明生效了。
重启整个k8s,然后再看:
继续登录到一个pod中进行ping测试:
通过抓包可以看到,现在在pod中进行互ping,是从物理网卡ens192进出的,这就是directrouting,这种性能比默认vxlan高。