不同nat设备后的网络节点如何组成一个k8s集群
我最近碰到不同nat设备后的节点组k8s集群的问题。
我使用的环境是3个不同账号下的aliyun ECS,每个机器都有自己的外网IP,但是只有一个绑定了内网ip的内网网卡,没有外网网卡。我使用kubeadm部署的k8s集群,网络组件使用的canal,网络通信就是flannel。我修改了每台主机上的kubelet启动参数,添加了--node-ip <外网IP>参数,否则k8s系统组件都不能正常运行。之后,创建了deploy,pod可以分布到多个机器上,但是不同机器上的pod之间不能通信。
我用tcpdump抓包发现,在podA中ping podB时,在podA所在的主机上,可以抓到发往podB所在主机的内网IP的包,但是因为主机之间内网不同,所以该包并不能到达podB所在主机。所以我猜测是flanneld向etcd注册信息的时候,注册的是内网ip,但是应该注册外网IP才对。但是不知道怎么才能让flanneld正确注册。
k8s版本为1.12.2,etcd镜像版本为3.2.24,flannel镜像版本为v0.9.1
请问有没有哪位大神可以提供一下思路
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
回复
然后再看看kubectl get node里 对应的nodename对应的host是不是外网地址
回复
@regend : 在pod里ping不通DNS的service,但是可以ping通pod所在node上的coredns的pod
回复
@regend : kubectl get node -o wide看到的EXTERNAL-IP是<none>,worker节点的INTERNAL-IP的值是外网IP,master节点的INTERNAL-IP是<none>。内部IP之所以是外网IP,是因为我给kubelet的启动参数加了--node-ip指定了外网ip
回复
master和node上的防火墙都关了吗,看看有没有pod运行失败的~照理应该是正常的
回复
@regend : 防火墙都关了。我昨天在flannel的文档里看到新版本支持一个flannel.alpha.coreos.com/public-ip-overwrite的注解,用于多个nat设备后的节点之间组网,使用之后,flannel就可以正常通信了。谢谢你的回答了
如果每个账号下有多个ecs,可以用faderation 联邦集群