Skip to content

Rancher 新建托管集群节点注册失败:STRICT_VERIFY 中止 / 私有仓库 HTTP 误用 HTTPS / 节点缺 iptables

问题现象

在 Rancher(v2.14.3)中新建 RKE2 托管集群,按 UI 生成的注册命令在新节点执行 system-agent-install.sh 失败;逐个修复后 provisioning 过程又连续暴露两个问题,共 3 个故障点:

text
# 故障 1:system-agent 安装直接退出
[FATAL] Aborting system-agent installation due to requested strict CA verification
with no CA checksum provided

# 故障 2:RKE2 安装器镜像拉取失败
Pulling image 192.168.122.156:30000/rancher/system-agent-installer-rke2:v1.35.6-rke2r1
error: Get "https://192.168.122.156:30000/v2/": http: server gave HTTP response to HTTPS client

# 故障 3:traefik Pod 反复 FailedCreatePodSandBox
plugin type="portmap" failed (add): failed to open iptables:
exec: "iptables": executable file not found in $PATH

环境信息

  • Rancher v2.14.3(RKE2 v1.35.6 集群 + ingress-nginx,证书为 cert-manager 自签 CA)
  • 下游集群:Rancher provisioning 新建 RKE2(calico,traefik ingress)
  • 私有镜像仓库:192.168.122.156:30000HTTP
  • 节点 OS:Rocky Linux 9.8 精简模板

根因与修复

故障 1:STRICT_VERIFY 中止安装

Rancher agent-tls-mode 默认为 strict,生成的注册脚本内嵌 export STRICT_VERIFY='true',未传 --ca-checksum 即退出。两种证书场景的正确解法:

  • 公共 CA 签发证书/cacerts 返回空(无内部 CA 可下发),应改用 system-store 模式:

    bash
    kubectl patch settings.management.cattle.io agent-tls-mode \
      --type merge -p '{"value":"system-store"}'
    # 注册脚本中剔除严格校验
    curl -fL https://<rancher>/system-agent-install.sh \
      | sed "s/^export STRICT_VERIFY='true'/export STRICT_VERIFY='false'/" | sudo sh -s - ...
  • 自签/私有 CA 证书(privateCA=true/cacerts 下发根 CA,注册时计算校验和:

    bash
    CACHECKSUM=$(curl -sk https://<rancher>/cacerts | sha256sum | awk '{print $1}')
    curl -fL https://<rancher>/system-agent-install.sh | sudo sh -s - \
      --server https://<rancher> --ca-checksum "$CACHECKSUM" --token <TOKEN> \
      --etcd --controlplane --worker

注意:agent-tls-mode 从 system-store 改回 strict 会被 webhook 拒绝 (AgentTlsStrictCheck condition ... isn't 'True'),需等下游 agent 全部按新 CA 回连成功。

故障 2:私有 HTTP 仓库被当作 HTTPS 访问

镜像地址被 Rancher 全局 system-default-registry 改写为私有仓库,但集群未声明该仓库为 HTTP,agent 默认走 HTTPS 必然失败。为集群补充 registry mirror(HTTP endpoint):

bash
kubectl patch clusters.provisioning.cattle.io -n fleet-default <集群> --type merge -p '{
  "spec":{"rkeConfig":{"registries":{"mirrors":{
    "192.168.122.156:30000":{"endpoint":["http://192.168.122.156:30000"]}
  }}}}
}'

约 1 分钟后 machine plan 下发,节点 /etc/rancher/agent/registries.yaml 自动更新,rke2-server 即可启动。

故障 3:节点缺少 iptables 二进制

精简 OS 模板未安装 iptables(连 iptables.service 单元都不存在),而 traefik 的 hostPort 依赖宿主机 iptables(CNI portmap 插件):

bash
dnf install -y iptables-nft ipset

教训:新节点入网前必须先执行初始化脚本(安装 iptables/ipvsadm、清理防火墙默认 REJECT 规则、内核模块与 sysctl),可规避此类问题。

排障路径

  1. 节点:journalctl -u rancher-system-agent(安装与 plan 应用日志)
  2. Rancher 侧:kubectl get machines.cluster.x-k8s.io -n fleet-defaultkubectl get rkecontrolplanes.rke.cattle.io -n fleet-default、machine-plan secret 的 failed-checksum 注解
  3. 下游集群:kubectl get pods -A(用节点本地 kubeconfig)

验证

  • machine plan failed-checksum 为空、节点 Ready、全部 Pod Running/Completed;
  • Rancher 管理对象 Connected / Ready / AgentDeployed;
  • 后续节点用修正后的注册命令一次成功。

经验教训

  1. Rancher 证书方案决定注册命令形态:公共 CA → agent-tls-mode=system-store;自签 CA → privateCA=true + --ca-checksum
  2. 私有 HTTP 镜像仓库必须在集群 Registries 中显式配置 http:// endpoint。
  3. 节点必须先跑初始化脚本再入网,精简模板缺少的不仅是 iptables 服务,还可能是 iptables 二进制本身。