最近公司在构建新的K8s环境。选择了calico当做网络插件。集群运行起来以后,看上去各个组件都正常,但是问题来了。在某些应用中,容器不能跨节点访问其他容器,ping却没有任何问题。集群本身也不报错。

问题自然落到了calico最组件上,因为容器间的通讯全靠calico上。经过排查因为节点上有2个interface,一个mtu是1500,一个是9000.所以calico自己选着了MTU9000的那个。所以就造成了一些问题。

解决方式

kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=cidr=***** 输入需要选择的interface

到此为止。容器间的访问问题成功搞定。。

问题no.2 紧随而至。

因为我们用了external_ip,所以设置了一个lvs服务器。问题来了。通过vip访问k8s内部服务。是访问不通的。同样问题一些通,一些不通,像dashboard之类的没任何问题。但是https服务是访问不了。

最后问题也落到了mtu上面。lvs的mtu是1500, 但是calico的tunnel是1475的mtu,导致了掉包。但是设置1500是不行的,因为父interface是1500,25比特的开销要给head封装。真是干了。解决方法,只有把流量倒去mtu 9000的interface上然后强制设置calico1500 mtu

kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=cidr= *mtu 9000的interface

kubectl patch configmap/calico-config -n kube-system –type merge -p ‘{“data”:{“veth_mtu”: “1500”}}’

LVS终于成功的把流量导入了K8s,一次掉头发的部署终于可以交付了。

 

最后修改日期: 2021年6月25日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理