极运维|修复K8S节点双网卡不可连外网

这两天发现内网K8S服务器集群无法访问外网,开发做久了就有想解决点别的什么问题的冲动。解决过程记录下来供参考(文末有彩蛋)。

1. 发现问题:K8S拉取镜像失败

极海测试服务器集群是一个K8S(Kubernetes)环境,由5台虚拟机组成。每台服务器设置了双网卡,一个网卡使用桥接模式,连接宿主机所在的公司内网,网关192.168.31.1;另一个网卡使用NAT模式,用于K8S中各服务器之间相互通信,网关10.0.1.1。发现在持续集成测试中,K8S节点服务器无法从镜像仓库pull镜像。网络不通,百度一下,发现几个节点服务器无法ping通外网。

2. 分析问题:网卡未被有效识别

无法访问外网,说明192.168.31.1网段的网卡没有正常运行,或者没有路由到这个网卡上。运行正常的网卡会在/etc/sysconfig/network-scripts目录有对应的配置文件。所以先进入该目录查看配置文件。发现只有ifcfg-enp0s3一块网卡的配置,说明有一块网卡未被有效识别。

通过nmcli命令看下网络是否正常创建。发现有两个网络,一个名为enp0s3,一个名为“有线连接 1”。正常来说这块名为“有线连接 1”的网络名称应该为enp0s8,和设备名称一致。

3. 解决问题:修复网卡,外网连通

初步判断是因为网络名称因为未知原因变成了“有线连接 1”,导致网络无法被有效创建。解决的办法先更改网络名称为enp0s8。更改名称后,再次查看网络列表,已经正常显示为enp0s8。

重启网络服务,再次查看网卡配置文件,发现名为ifcfg-enp0s8的文件被自动创建。

发现依然无法访问外网,原因在于网络请求被路由到enp0s3网卡,也就是K8S集群内部使用的网关上了。

用ip route list命令查看路由列表,发现两个网络都被当做了缺省路由,而K8S内部路由是第一缺省路由。也就是说本该访问外网的请求被路由到了内部网络。

查看两块网卡的配置文件发现,全部配置成了缺省路由,把K8S内部网卡的缺省路由配置改成no就可以了(注意DEFROUTE默认为yes,必须明确设置为no才行)。

重启网络服务,再次查看路由列表,发现缺省路由已经是可以连通外网的路由了。

再次测试连接外网,已连通,问题解决。

4. 总结问题:问题的根源及解决办法

问题的具体现象是虚拟机无法访问外网,根源在于由于未知原因导致可连接外网的网络名称变化导致网络未被有效创建。网络名称更改为正确的enp0s8后,依然无法访问外网,原因在于默认路由被设置成了内部网络enp0s3,更改enp0s8为默认路由即可。

总结起来风轻云淡,解决的过程一波三折,整个工作耗时1天。在极海没有专门的运维工程师,开发工程师遇山开山遇水搭桥,前端开发/后端开发/数据库/容器化/K8S/DevOps...,练就成了斜杠工程师。目前极海正在招聘开发(斜杠)工程师,如果你也想“被虐”,联系我们(hr@geohey.com)。

崔福东

继续阅读此作者的更多文章