k3s flannel vxlan更换端口

··babydragon

今天客户虚拟机迁移之后,重启虚拟机,发现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通。

经过以上步骤,部署在客户环境的服务终于正常了。