主题
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.78、192.168.122.69 - 新增 master 节点:
192.168.122.136(主机名szc122136) - 操作系统:Rocky Linux 9.8 (Blue Onyx)
- 网络 CIDR:
cluster-cidr: 10.12.0.0/16service-cidr: 10.13.0.0/16
- 私有镜像仓库:
192.168.122.156:30000(registries.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关键现象:
- 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"
...- 部分镜像因无法访问
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"- 失败后继续导入本地 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"- 镜像导入完成后,etcd、kube-apiserver、kubelet 等组件才正常启动,节点最终变为 Ready。
根因分析
启动耗时是主要原因:该环境为离线/半离线环境,RKE2 首次启动需要导入本地镜像包并尝试从
docker.io补齐缺失镜像。虽然部分镜像拉取失败,但核心镜像已包含在本地rke2-images.linux-amd64.tar.zst(约 768MB)中,导入完成后即可正常启动。整个过程约 7–10 分钟,期间节点显示NotReady。配置项无效:
disable-scheduler-node-taints: true不是 RKE2 v1.35.6 支持的配置项,会导致启动日志中出现Unknown flag警告。当前版本 control-plane 节点默认已无相关 taint,因此该配置既无效也无必要。私有镜像仓库未覆盖 docker.io:
registries.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 widetext
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 cstext
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.136text
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-servertext
active后续建议
- worker 角色:当前节点角色为
control-plane,etcd,没有worker角色。如果需要该节点也运行业务 Pod,请执行:
bash
kubectl label node 192.168.122.136 node-role.kubernetes.io/worker=true- 离线镜像准备:为避免后续新增节点再次长时间等待,建议提前将所有需要的镜像推送到私有镜像仓库
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- 配置审核:新增节点前确认
config.yaml中的参数均为当前 RKE2 版本支持,避免使用已废弃或不存在的 flag。可通过以下命令查看支持的参数:
bash
rke2 server --help | grep -E 'taint|disable'- 耐心等待:在离线/半离线环境中,RKE2 首次启动导入镜像可能需要 5–15 分钟,期间
NotReady属于正常现象,需结合日志判断是否在正常导入镜像,而非直接判定为加入失败。