一、背景
同事反馈他这边有一环境出现pod容器内无法请求集群外部主机ipv6地址,但是在pod所在集群所主机上是可以请求到外部主机ipv6地址。
二、问题处理过程
首先主机和主机之间ipv6地址能通讯,说明主机之间网络是没啥问题,哪问题就出在容器层面,怀疑是否有防火墙之类的阻止容器的ipv6地址请求转发,并未发现有任何封堵的情况,随后查看相关路由啥的也没啥问题,相关系统ipv6的转发参数也配置有,抓包也没数据生成。
接下来看了下主机的ip信息,发现有ipvs开启生成的网卡信息,然后查看kube-proxy的配置发现用的模式是iptables,之前用的是ipvs模式,后来更改了,但是主机上遗留的信息没有清除,尝试先把这部分ipvs信息删除,包括ipvs生成的防火墙规则,清除完,进入容器内访问外部主机ipv6地址仍然不通。
只能接着查,尝试用docker跑一个容器起来和k8s的pod进行对比访问,看看是否结果一样,结果是docker运行的容器内访问外部主机ipv6地址是通的,pod内还是之前的结果就是不通,这就缩小了排查范围,基本确定可能是calico导致这种情况。
在calico相关社区也看了下,也有人遇到同样的问题,但是没有解决办法,只能自己在继续看看,容器到外部主机必定做nat转换出去的,抓包的时候都没数据,怀疑数据在出的时候就无法转发出去,到官网查了些配置参数,发现有个NATOutgoing参数,表示将nat的数据转发出去,然后将这个参数配置到calico的ippool配置中,重启calico节点,发现可以进容器内,在访问外部主机ipv6地址就通了。
三、处理结果
更改calico的ippool,添加如下图箭头所指参数:
natOutgoing: true