使用UDEV处理k3s节点路由异常问题

一、出了什么问题

去年弄了一堆轻量应用服务器,搭建了一个k3s(Rancher发布的轻量版kubebernets)。k3s默认的Flannel的CNI,这个网络插件的好处就是简单,坏处就是过于简陋。每当设置网卡重启的时候flannel路由丢失(相关ISSUE),导致节点失联。

网卡为什么要频繁重启呢?因为几个节点处于不同网络彼此通过Wireguard组成的私网。使用netmaker管理wg配置,每当有网络配置更新或者节点手动获取wg配置的时候 wg网卡就会重启,这时候k3s节点就会通信异常。

二、udev立大功

核心问题已经清楚,就是网卡重启后,绑定在这个网卡上的flannel就异常。k3s不同与k8s,flannel不是以daemonset工作负载在各个节点上的。所以最简单的处理方式就是获取到网卡重启事件重启k3s服务就能保证节点恢复正常。

UDEV是一个用户空间下的事件处理工具,我们看下网卡重启会有哪些事件可供我们使用。

monitor
[root@t-02 ~]# udevadm monitor
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent

KERNEL[287364.993718] remove /devices/virtual/net/flannel.1/queues/rx-0 (queues)
KERNEL[287364.993747] remove /devices/virtual/net/flannel.1/queues/tx-0 (queues)
KERNEL[287364.993768] remove /devices/virtual/net/flannel.1 (net)
KERNEL[287364.993782] remove /devices/virtual/net/nm-tx/queues/rx-0 (queues)
KERNEL[287364.993793] remove /devices/virtual/net/nm-tx/queues/tx-0 (queues)
KERNEL[287364.993807] remove /devices/virtual/net/nm-tx (net)
UDEV [287365.132946] remove /devices/virtual/net/flannel.1/queues/tx-0 (queues)
UDEV [287365.133355] remove /devices/virtual/net/flannel.1/queues/rx-0 (queues)
UDEV [287365.134572] remove /devices/virtual/net/flannel.1 (net)
UDEV [287365.134610] remove /devices/virtual/net/nm-tx/queues/rx-0 (queues)
UDEV [287365.134618] remove /devices/virtual/net/nm-tx/queues/tx-0 (queues)
UDEV [287365.134897] remove /devices/virtual/net/nm-tx (net)
KERNEL[287367.465380] add /devices/virtual/net/nm-tx (net)
KERNEL[287367.465411] add /devices/virtual/net/nm-tx/queues/rx-0 (queues)
KERNEL[287367.465425] add /devices/virtual/net/nm-tx/queues/tx-0 (queues)
UDEV [287367.472783] add /devices/virtual/net/nm-tx (net)
UDEV [287367.475116] add /devices/virtual/net/nm-tx/queues/tx-0 (queues)
UDEV [287367.475814] add /devices/virtual/net/nm-tx/queues/rx-0 (queues)
KERNEL[287367.594478] remove /devices/virtual/net/nm-tx/queues/rx-0 (queues)
KERNEL[287367.594509] remove /devices/virtual/net/nm-tx/queues/tx-0 (queues)
KERNEL[287367.594523] remove /devices/virtual/net/nm-tx (net)
UDEV [287367.595394] remove /devices/virtual/net/nm-tx/queues/rx-0 (queues)
UDEV [287367.595765] remove /devices/virtual/net/nm-tx/queues/tx-0 (queues)
UDEV [287367.596042] remove /devices/virtual/net/nm-tx (net)
KERNEL[287367.788918] add /devices/virtual/net/nm-tx (net)
KERNEL[287367.788947] add /devices/virtual/net/nm-tx/queues/rx-0 (queues)
KERNEL[287367.788956] add /devices/virtual/net/nm-tx/queues/tx-0 (queues)
UDEV [287367.796124] add /devices/virtual/net/nm-tx (net)
UDEV [287367.797366] add /devices/virtual/net/nm-tx/queues/rx-0 (queues)
UDEV [287367.798059] add /devices/virtual/net/nm-tx/queues/tx-0 (queues)

从上述行为我们看到,绑定到nm-tx(WG网卡)上的flannel.1 已经被删除,而且没有主动重建。nm-tx网卡重启同时有remove或者add的UDEV事件和KERNEL事件,这里我们只安装一个监听网络KERNEL事件

1、编写重启脚本

auto restart
cat << EOF > /usr/local/bin/k3s-restart.sh
#!/bin/bash
sleep 2 && \
systemctl restart k3s
EOF

2、监听userspace网卡事件

touch /etc/udev/rules.d/99-network.rules ### 文件命名方式为 /etc/udev/rules.d/*.rules

cat << EOF > /etc/udev/rules.d/99-network.rules
"ACTION=="add", SUBSYSTEM=="net",KERNEL=="nm-tx", ENV{NM_UNMANAGED}="1", RUN+="/usr/local/bin/k3s-restart.sh""
EOF

3、加载规则

udevadm control --reload
#Ubuntu下没有udevadm命令可直接重启udev服务
systemctl restart udev

安装完这个事件处理脚本就可以做到网卡变更自动重启k3s服务了。如果想更完美可以处理事件多次触发导致多次重启问题,或者干脆更换CNI为Calico。

三、UDEV?

事实上UDEV有很多事件和处理方式,比如禁止USB使用,U盘挂在监听。。。
具体可参照 https://wiki.archlinux.org/title/udev