添加非Hetzner提供商节点至Rancher集群时卡在「Waiting for agent to check in and apply initial plan」阶段
我最近碰到一个挺棘手的问题,先跟大家说下我的集群环境:
- 我在Hetzner的5台服务器里,用其中一台部署了Rancher Server
- 剩下的4台里,1台作为control plane+etcd节点,另外3台是worker节点,组成了运行Kubernetes v1.27.11+k3s1的正常集群
但当我尝试添加非Hetzner提供商的worker节点时,一直卡在「Waiting for agent to check in and apply initial plan」阶段,完全没进展。
已做的排查步骤
- 我从待添加节点用telnet和dig测试了Rancher域名的连通性,没发现明显的网络问题
- 用的添加命令是Rancher提供的标准命令:
curl -fL https://rancher.mydomain.org/system-agent-install.sh | sudo sh -s - --server https://rancher.mydomain.org --label 'cattle.io/os=linux' --token ******* --worker - 查看待添加节点的
k3s-agent日志(sudo journalctl -u k3s-agent --no-pager),发现核心错误:time="2024-03-16T12:12:48Z" level=error msg="failed to get CA certs: Get \"https://127.0.0.1:6444/cacerts\": read tcp 127.0.0.1:45838->127.0.0.1:6444: read: connection reset by peer"
对比Hetzner成功节点的日志
同样的添加命令,Hetzner节点能正常加入,日志里虽然有CA证书信任的警告,但能继续完成初始化:
time="2024-03-15T14:57:54Z" level=warning msg="Cluster CA certificate is not trusted by the host CA bundle, but the token does not include a CA hash. Use the full token from the server's node-token file to enable Cluster CA validation."
之后就能正常加载内核模块、启动containerd等流程,完全没问题。
可能的解决方向
结合日志和环境差异,我整理了几个可能的排查点:
检查IPv6连通性问题:从失败日志能看到,k3s agent自动把control plane的IPv6地址
[2a01:4f8:c012:3140::1]:6443加入了本地负载均衡,但非Hetzner节点可能IPv6配置有问题(比如无法路由到该地址)。可以试试:- 在添加命令里指定control plane的IPv4地址,比如
--server https://<control-plane-ipv4>:6443,绕开IPv6解析 - 临时禁用待添加节点的IPv6,再重新运行添加命令
- 在添加命令里指定control plane的IPv4地址,比如
使用完整的带CA Hash的Node Token:Hetzner节点的日志提示token缺少CA Hash,虽然能继续,但非Hetzner节点可能因为这个导致证书验证失败。去Rancher所在的服务器(或者control plane节点)拿完整的token:
cat /var/lib/rancher/k3s/server/node-token把这个完整的token替换掉命令里的
*******,再重新执行添加命令。排查本地负载均衡转发问题:失败日志里的连接重置是发生在本地的127.0.0.1:6444(k3s-agent-load-balancer),说明这个本地负载转发到control plane的IPv6地址失败。可以手动测试:
- 从待添加节点直接访问control plane的IPv4地址的6443端口:
curl -k https://<control-plane-ipv4>:6443/cacerts(加-k忽略证书验证),看能不能获取到证书内容 - 如果能获取到,说明本地负载均衡的IPv6转发有问题,直接用IPv4地址指定server即可
- 从待添加节点直接访问control plane的IPv4地址的6443端口:
检查防火墙/安全组差异:Hetzner的服务器可能默认开放了K8s需要的端口,而非Hetzner节点的防火墙/安全组可能没开。确保待添加节点开放以下端口:
- 6443/tcp(Kubernetes API Server)
- 8472/udp(Flannel VXLAN 通信)
- 10250/tcp(Kubelet API)
- 30000-32767/tcp(NodePort 服务端口)
检查系统环境配置:对比Hetzner节点,检查非Hetzner节点的以下配置:
- 内核模块是否加载:
lsmod | grep -E 'overlay|br_netfilter',如果没加载,手动执行:modprobe overlay modprobe br_netfilter - IP转发是否开启:
sysctl net.ipv4.conf.all.forwarding和sysctl net.ipv6.conf.all.forwarding,确保值为1,否则执行:sysctl -w net.ipv4.conf.all.forwarding=1 sysctl -w net.ipv6.conf.all.forwarding=1 - 检查SELinux/AppArmor是否开启,可能需要临时禁用测试:
setenforce 0(SELinux)或者systemctl stop apparmor(AppArmor)
- 内核模块是否加载:
备注:内容来源于stack exchange,提问作者humanbeing

