flannel 工作原理
[root@k8s3 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.4.7.2        0.0.0.0         UG    100    0        0 ens33
10.4.7.0        0.0.0.0         255.255.255.0   U     100    0        0 ens33
172.7.21.0      0.0.0.0         255.255.255.0   U     0      0        0 docker0
172.7.22.0      10.4.7.22       255.255.255.0   UG    0      0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0

1.flannel的host-gw模型  (host-gw模型就是在宿主机添加静态路由)

宿主机必须在同一个网关下才能使用host-gw模型 (效率最高,占用资源最少)

 

2.flannel的vxlan模型(在两台宿主机虚拟出两个flannel虚拟网卡,并且会打通fannel网络隧道,请求会先到fannel网络隧道进行封装然后在去转发)

flannel的vxlan模型效率较低

flannel vxlan 模型实验
操作etcd 增加flannel vxlan

需要删除之前的host-gw模型
./etcdctl get /coreos.com/network/config
./etcdctl rm /coreos.com/network/config
cd /opt/etcd
./etcdctl set /coreos.com/network/config '{"Network": "172.7.0.0/16", "Backend": {"Type": "vxlan"}}'
重启flanneld:
# supervisorctl restart flanneld-7-21
可以发现多了一块网卡,这块网卡就是vxlan用于隧道通信的虚拟网卡:

3.配置vxlan跟host-gw混合模型:

./etcdctl set /coreos.com/network/config  '{"Network": "172.7.0.0/16", "Backend": {"Type": "vxlan","Directrouting": true}}'  #在同一个网关下走host-gw模式,如果在不同网段则走vxlan

 

4.flannel SNAT 规则优化

k8s 容器内部必须看到的是pod真实ip而不是宿主机ip,不要去做SNAT转化
查看
[root@k8s4 ~]# iptables-save |grep -i postrouting
-A POSTROUTING -s 172.7.22.0/24 ! -o docker0 -j MASQUERADE
来源地址172.7.22.0/24 伪装宿主机访问,但是没有目标地址
这里需要修改iptables优化SNAT规则,否则在访问时,其他节点记录的是node节点的ip 10.4.7.21,而不是pod集群内部的172.7.21.x,红色部分按需修改

安装iptables 21/22上
yum install iptables-services -y
systemctl start iptables
systemctl enable iptables
优化规则
先删除规则   iptables -t nat -D  POSTROUTING -s 172.7.21.0/24 ! -o docker0 -j MASQUERADE
在插入规则        iptables -t nat -I  POSTROUTING -s 172.7.21.0/24 ! -d 172.7.0.0/16 ! -o docker0 -j MASQUERADE   #不是从原地址172.7.21.0 不是docker0网络和172.7.0.0/16 大地址出来的才去做MASQUERADE转换
保存规则    iptables-save > /etc/sysconfig/iptables

删除reject
[root@k8s4 ~]# iptables-save |grep -i reject
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
[root@k8s4 ~]# iptables -t filter -D INPUT -j REJECT --reject-with icmp-host-prohibited
[root@k8s4 ~]# iptables -t filter -D FORWARD -j REJECT --reject-with icmp-host-prohibited
[root@k8s4 ~]# iptables-save > /etc/sysconfig/iptables
 

Logo

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

更多推荐