修改calico网络模式
默认情况下,calico所有的数据包都会进行ipip封装.通过路由表可以快速判断出网络模式:
[root@master daemonset]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.88.8.254 0.0.0.0 UG 100 0 0 ens192
10.88.8.0 0.0.0.0 255.255.252.0 U 100 0 0 ens192
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.189.64 10.88.10.183 255.255.255.192 UG 0 0 0 tunl0
192.168.219.64 0.0.0.0 255.255.255.192 U 0 0 0 *
192.168.219.65 0.0.0.0 255.255.255.255 UH 0 0 0 calibdecb5b5ff2
192.168.235.128 10.88.10.182 255.255.255.192 UG 0 0 0 tunl0
去往别的主机的包都要经过tunl0
设备发出,而tunl0
设备就是进行IPIP封装的.
kubectl edit ippools.crd.projectcalico.org default-ipv4-ippool
spec:
allowedUses:
- Workload
- Tunnel
blockSize: 26
cidr: 192.168.0.0/16
# 默认为Always ,所有都会封装.修改为CrossSubnet可以让跨网段的通信才会封装.Never则为从不封装数据包.
ipipMode: CrossSubnet
natOutgoing: true
nodeSelector: all()
vxlanMode: Never
修改完成后保存自动更新,接下来你在查看路由表就发生了变化:
[root@master daemonset]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.88.8.254 0.0.0.0 UG 100 0 0 ens192
10.88.8.0 0.0.0.0 255.255.252.0 U 100 0 0 ens192
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.189.64 10.88.10.183 255.255.255.192 UG 0 0 0 ens192
192.168.219.64 0.0.0.0 255.255.255.192 U 0 0 0 *
192.168.219.65 0.0.0.0 255.255.255.255 UH 0 0 0 calibdecb5b5ff2
192.168.235.128 10.88.10.182 255.255.255.192 UG 0 0 0 ens192
关闭使用IPIP模式或者跨网段通信时使用IPIP,去往对端主机的包不再通过
tunl0
设备,而是直接从主机网卡发出.
calico通过虚拟设备直接将pod对接到主机上面.当流量来到主机后直接匹配对应的规则,利用对端主机IP作为下一跳地址,然后发往对端主机.对端主机同样将pod直接对接到了主机上,所以直接匹配规则通过对应的虚拟设备发出即可.
calico支持两种跨网段通信封装: IPIP和VXLAN.VXLAN开销更高因为数据标头更大,但是除非是在网络密集型的场景下,否则通常不会感觉到差异.VXLAN的实现不使用BGP,而calico使用节点之间的BGP.
而VXLAN的设置同样是上面那个配置,字段为vxlanMode: Never
默认关闭不使用.
其他问题
尽量不要将使用flannel网络的集群更改为calico.因为有时flannel并不会清理干净自己的"作为".如路由表路由,网卡设备没有删除,所以尽量在部署的时候就选用好网络而不要初始化集群等更改.
flannel的host-gw网络模式和calico的同一子网内通信性能差不多.
参考文章:
《深入剖析Kubernetes》-张磊