Skip to content

RKE2 新增 master 节点显示 NotReady:镜像导入耗时与无效配置项

问题现象

在已有 RKE2 集群中新增 master(control-plane + etcd)节点 192.168.122.136 时,节点长时间处于 NotReady 状态,rke2-server 服务日志中不断出现 Pod for etcd not synced (pod sandbox not found), retrying 等提示。

从现有 master 节点查看:

bash
kubectl get nodes -o wide

输出:

text
NAME              STATUS     ROLES              VERSION          INTERNAL-IP
192.168.122.136   NotReady   control-plane,etcd v1.35.6+rke2r1   192.168.122.136
192.168.122.69    Ready      control-plane,etcd,worker v1.35.6+rke2r1
192.168.122.78    Ready      control-plane,etcd,worker v1.35.6+rke2r1

环境信息

  • RKE2 版本:v1.35.6+rke2r1
  • 现有 master 节点:192.168.122.78192.168.122.69
  • 新增 master 节点:192.168.122.136(主机名 szc122136
  • 操作系统:Rocky Linux 9.8 (Blue Onyx)
  • 网络 CIDR:
    • cluster-cidr: 10.12.0.0/16
    • service-cidr: 10.13.0.0/16
  • 私有镜像仓库:192.168.122.156:30000registries.yaml 中仅配置了该 endpoint)

排查过程

1. 确认服务状态

bash
systemctl status rke2-server --no-pager -l
systemctl status rke2-agent --no-pager -l

发现:

  • rke2-agent 未启动(符合 server 节点预期)
  • rke2-server 处于 activating (start) 状态,正在拉取镜像

2. 检查配置

bash
cat /etc/rancher/rke2/config.yaml

内容:

yaml
server: https://192.168.122.78:9345
token: xxx
disable-scheduler-node-taints: true
kube-proxy-arg:
  - "proxy-mode=ipvs"
node-name: 192.168.122.136
data-dir: /var/lib/rancher/rke2
cluster-cidr: 10.12.0.0/16
service-cidr: 10.13.0.0/16

启动日志中出现警告:

text
time="..." level=warning msg="Unknown flag --disable-scheduler-node-taints found in config.yaml, skipping\n"

确认该参数在当前 RKE2 v1.35.6 版本中不存在。

3. 检查网络连通性

bash
timeout 5 bash -c '</dev/tcp/192.168.122.78/9345'
timeout 5 bash -c '</dev/tcp/192.168.122.78/6443'
timeout 5 bash -c '</dev/tcp/192.168.122.78/2379'

结果:所有端口均可达。

4. 检查日志关键信息

bash
journalctl -u rke2-server --no-pager -n 100

关键现象:

  1. RKE2 先尝试从 docker.io 拉取 rke2-images-all.linux-amd64.txt 中列出的全部镜像:
text
time="..." level=info msg="Pulling image docker.io/rancher/mirrored-calico-node:v3.32.0"
time="..." level=info msg="Pulling image docker.io/rancher/mirrored-cilium-cilium:v1.19.4"
...
  1. 部分镜像因无法访问 registry-1.docker.io 而失败:
text
time="..." level=error msg="Failed to process image event: failed to import ...: failed to pull and unpack image \"docker.io/rancher/hardened-cni-plugins:v1.9.1-build20260608\": ... dial tcp 103.240.182.55:443: connect: connection refused"
  1. 失败后继续导入本地 tar 包:
text
time="..." level=info msg="Importing images from /var/lib/rancher/rke2/agent/images/rke2-images.linux-amd64.tar.zst"
time="..." level=info msg="Imported images from /var/lib/rancher/rke2/agent/images/rke2-images.linux-amd64.tar.zst in 7m1.457693856s"
  1. 镜像导入完成后,etcd、kube-apiserver、kubelet 等组件才正常启动,节点最终变为 Ready。

根因分析

  1. 启动耗时是主要原因:该环境为离线/半离线环境,RKE2 首次启动需要导入本地镜像包并尝试从 docker.io 补齐缺失镜像。虽然部分镜像拉取失败,但核心镜像已包含在本地 rke2-images.linux-amd64.tar.zst(约 768MB)中,导入完成后即可正常启动。整个过程约 7–10 分钟,期间节点显示 NotReady

  2. 配置项无效disable-scheduler-node-taints: true 不是 RKE2 v1.35.6 支持的配置项,会导致启动日志中出现 Unknown flag 警告。当前版本 control-plane 节点默认已无相关 taint,因此该配置既无效也无必要。

  3. 私有镜像仓库未覆盖 docker.ioregistries.yaml 中仅配置了 192.168.122.156:30000 这个 endpoint,没有将 docker.io 的拉取请求重定向到私有仓库,因此 RKE2 会直接访问 registry-1.docker.io 并超时/拒绝。

处理步骤

步骤 1:清理无效配置

在新增节点 192.168.122.136 上执行:

bash
sed -i '/disable-scheduler-node-taints/d' /etc/rancher/rke2/config.yaml

清理后的 /etc/rancher/rke2/config.yaml

yaml
server: https://192.168.122.78:9345
token: xxx
kube-proxy-arg:
  - "proxy-mode=ipvs"
node-name: 192.168.122.136
data-dir: /var/lib/rancher/rke2
cluster-cidr: 10.12.0.0/16
service-cidr: 10.13.0.0/16

步骤 2:重启 rke2-server

bash
systemctl restart rke2-server

步骤 3:等待镜像导入完成

观察日志:

bash
journalctl -u rke2-server -f

等待出现类似以下日志,表示镜像导入完成、kubelet 已启动:

text
time="..." level=info msg="Imported images from /var/lib/rancher/rke2/agent/images/rke2-images.linux-amd64.tar.zst in ..."
time="..." level=info msg="Running kubelet ..."
time="..." level=info msg="Tunnel authorizer set Kubelet Port 0.0.0.0:10250"

验证结果

节点状态

bash
kubectl get nodes -o wide
text
NAME              STATUS   ROLES              VERSION          INTERNAL-IP
192.168.122.136   Ready    control-plane,etcd v1.35.6+rke2r1   192.168.122.136
192.168.122.69    Ready    control-plane,etcd,worker v1.35.6+rke2r1
192.168.122.78    Ready    control-plane,etcd,worker v1.35.6+rke2r1

组件状态

bash
kubectl get cs
text
NAME                 STATUS    MESSAGE   ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok
etcd-0               Healthy   ok

节点 Pod 状态

bash
kubectl get pods -A --field-selector spec.nodeName=192.168.122.136
text
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   cloud-controller-manager-192.168.122.136   1/1     Running   0          25m
kube-system   etcd-192.168.122.136                       1/1     Running   0          27m
kube-system   kube-apiserver-192.168.122.136             1/1     Running   0          27m
kube-system   kube-controller-manager-192.168.122.136    1/1     Running   0          25m
kube-system   kube-proxy-192.168.122.136                 1/1     Running   0          2m27s
kube-system   kube-scheduler-192.168.122.136             1/1     Running   0          25m
kube-system   rke2-canal-f5xp4                           2/2     Running   0          27m
kube-system   rke2-ingress-nginx-controller-4h5rv        1/1     Running   0          25m

服务状态

bash
systemctl is-active rke2-server
text
active

后续建议

  1. worker 角色:当前节点角色为 control-plane,etcd,没有 worker 角色。如果需要该节点也运行业务 Pod,请执行:
bash
kubectl label node 192.168.122.136 node-role.kubernetes.io/worker=true
  1. 离线镜像准备:为避免后续新增节点再次长时间等待,建议提前将所有需要的镜像推送到私有镜像仓库 192.168.122.156:30000,并在 registries.yaml 中配置 docker.io 的 mirror:
yaml
mirrors:
  "docker.io":
    endpoint:
      - "http://192.168.122.156:30000"
configs:
  "192.168.122.156:30000":
    tls:
      insecure_skip_verify: true
  1. 配置审核:新增节点前确认 config.yaml 中的参数均为当前 RKE2 版本支持,避免使用已废弃或不存在的 flag。可通过以下命令查看支持的参数:
bash
rke2 server --help | grep -E 'taint|disable'
  1. 耐心等待:在离线/半离线环境中,RKE2 首次启动导入镜像可能需要 5–15 分钟,期间 NotReady 属于正常现象,需结合日志判断是否在正常导入镜像,而非直接判定为加入失败。