k3s flannel vxlan更换端口
今天客户虚拟机迁移之后,重启虚拟机,发现k3s中部署的pod一直无法正常启动。从日志看,很多pod都有DNS解析失败的错误。 经过排查发现pod之间网络无法互通,怀疑是flannel组件有问题导致
背景
今天客户虚拟机迁移之后,重启虚拟机,发现k3s中部署的pod一直无法正常启动。从日志看,很多pod都有DNS解析失败的错误。 虚拟机能够和部署在本机上的pod可以ping通,但是和其他机器上的就无法通信。
使用AI排查了一系列可能情况,从虚拟机层面看配置都很正常。包括:
- flannel接口和网段
- 路由表
- iptables规则
- 防火墙规则
结合本次出现问题的改动点,最有可能出问题的还是基础网络的改动。经过和客户沟通,确认他们虚拟机网络(深信服)使用的端口相同, 可能存在冲突。同时,他们无法修改深信服的端口,修改可能导致现有业务网络出现闪断。因此,我们决定更换flannel的vxlan端口,以避免冲突。 同时也准备将flannel的后端改成host-gw,作为plan B(虽然最后没有实施)。
解决方案
k3s的flannel是内置的,而不是使用pod来进行部署的,因此需要修改k3s的启动命令,定制flannel的配置文件才行。 针对k3s flannel vxlan端口的更改,正好有一个github issue,可以参考https://github.com/k3s-io/k3s/issues/3028。根据这个issue,不能直接通过给k3s的启动命令添加参数来修改flannel的配置,需要定制flannel的配置文件。
停止服务
修改配置之前,首先需要停止k3s服务,先停止所有的agent节点,再停止master节点。
sudo systemctl stop k3s-agent.service
sudo systemctl stop k3s.service
修改配置文件
参照issue,flannel的默认配置文件在/var/lib/rancher/k3s/agent/etc/flannel/net-conf.json,但是其中没有端口定义。参照flannel的官方文档,需要添加Port字段,指定vxlan端口。修改后的配置文件如下:
{
"Network": "10.42.0.0/16",
"Backend": {
"Type": "vxlan",
"Port": 8479
}
}
这里的8479就是修改后的vxlan端口,需要根据实际情况进行调整。
将修改后的文件保存到/var/lib/rancher/k3s/agent/etc/flannel/net-conf-port.json之后,修改k3s的systemd服务。
针对master节点,修改/etc/systemd/system/k3s.service文件,在ExecStart命令中最后增加--flannel-conf=/var/lib/rancher/k3s/agent/etc/flannel/net-conf-port.json。
针对agent节点,修改/etc/systemd/system/k3s-agent.service文件,在ExecStart命令最后增加--flannel-conf=/var/lib/rancher/k3s/agent/etc/flannel/net-conf-port.json。
重启服务
修改完成之后,需要让systemd重新加载配置文件,并重启k3s服务。
sudo systemctl daemon-reload
sudo systemctl start k3s.service
sudo systemctl start k3s-agent.service
验证
所有服务都启动之后,需要做以下验证:
- 在master节点执行
netstat -anp | grep 8479,查看是否监听了8479端口。 - 使用
kubectl get nodes命令查看节点状态,确保所有节点都处于Ready状态。 - 使用
kubectl get pods -A命令查看pod状态,找一个不是当前节点的pod,ping这个pod的IP,确保可以ping通。
经过以上步骤,部署在客户环境的服务终于正常了。