zhangguanzhang's Blog

阿里云上使用flannel host-gw跨节点pod不通的解决

字数统计: 628阅读时长: 2 min
2020/06/23

挺多人问的,写下解决办法

前言

首先主机得在同一个专有vpc下,跨vpc或者经典vpc就扯淡了。还有flannel别把网络信息存储在etcd里,目前flannel只支持v2的etcd api。但是现在k8s都是使用v3 etcd存储了。如果v2和v3共存会导致无法恢复etcd的备份

所以网上那些etcdctl set flannel的cidr的文章别看了,都没做过备份恢复实验就到处发k8s搭建教程。flannel v3的话看我过往文章

环境信息

先来说下host-gw的包走向,假设两台机器

IP pod cidr
10.0.6.166 10.200.1.0/24
10.0.6.167 10.200.2.0/24

pod1 10.200.1.2 ping node2上的10.200.2.2,出去的包源目IP是10.200.1.210.200.2.2,但是包的mac是宿主机和目的主机的mac地址。也就是走二层转发直接到目的的宿主机上,同时这也是host-gw无法跨三层的原因。另外openstack默认会检查出去的包的源ip和源mac是否对的上网卡,收包也一样。这会导致host-gw无法使用,见ip和mac解绑

帮人排查不通,源主机上抓包发现包发出去了,目的主机上抓包发现没收到包。可以断定阿里的vpc实际上有一些类似过滤的行为,理解为包从宿主机出去还没发到目的宿主机的路上经过了一个东西(ovs,SDN)。实际上阿里云vpc下host-gw跨节点不通就是包经过这个东西被路由到外面去了,然后因为是包的源目IP是私网ip会被SDN丢掉。我们得在专有vpc上配置路由让包不出公网而是到目标ecs上

解决

几台主机写几条,为了把包发送到指定的宿主机上

登录阿里云控制台,专有vpc –> 路由表 –> 自定义
例如上面我举例的环境则是两条:

  • 10.200.1.0/24 下一跳类型是ecs实例,资源组全部,ECS实例选择10.200.1.0/24所在ECS
  • 10.200.2.0/24 下一跳类型是ecs实例,资源组全部,ECS实例选择10.200.2.0/24所在ECS

注意事项

阿里的vpc内部有些cidr是预留的不给客户使用。可用的cidr有:

1
2
3
A类地址:10.0.0.0~10.255.255.255
B类地址:172.16.0.0 ~172.31.255.255
C类地址:192.168.0.0~192.168.255.255
CATALOG
  1. 1. 前言
  2. 2. 环境信息
  3. 3. 解决
  4. 4. 注意事项