挺多人问的,写下解决办法
前言
首先主机得在同一个专有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.2
和 10.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
所在ECS10.200.2.0/24
下一跳类型是ecs实例,资源组全部,ECS实例选择10.200.2.0/24
所在ECS
注意事项
阿里的vpc内部有些cidr是预留的不给客户使用。可用的cidr有:
1 | A类地址:10.0.0.0~10.255.255.255 |