本文永久链接: https://www.xtplayer.cn/rke2/rancher-rke2-init-node-not-found/

在 rke2 原生架构中,会先运行第一个 server 节点,这个节点被称为初始节点或者 init node,然后其他节点再根据配置的 server url 向第一个节点进行注册。对于 rancher ui 上创建的自定义 rke2 集群也一样,第一个添加的自定义节点默认会被设置为初始节点(init node),其他节点添加后会自动向第一个节点进行注册。

当需要替换初始节点(init node),正常情况下删除初始节点(init node)后,rancher 会自动随机寻找一个其他正常的 master 节点作为初始节点(init node)。但是这里有个前提条件,就是需要有其他状态为 Active 的正常节点。

如果当前集群只有初始节点(init node),添加了一个新的 master 节点准备替换初始节点(init node)。如果没有等新加的 master 节点状态变为 Active 就执行了删除旧初始节点(init node)的操作,那么就很可能出现如下图的报错。报错出现后集群状态将会卡住,无法更新集群状态,也无法删除之前的初始节点(init node)。

手动修复操作

  1. 在集群管理中,任意选择一个将作为新初始节点(init node)的 master 主机,记录下主机名称,一般以 custom 为名称前缀。

  2. 在 local 集群中执行以下命令获取 machine-id。

    new_init_node_name=custom-de22ecaxxxxxx

    kubectl -n fleet-default \
    get machines.cluster.x-k8s.io ${new_init_node_name} \
    -o jsonpath="{range}{.metadata.labels.rke\.cattle\.io/machine-id}{'\n'}{end}"
  3. 定义 rke2 集群名称,以及上一步骤中获得的 machine-id,然后执行后面的命令。

    machine_id=xxxxx
    cluster_name=xxxx

    kubectl -n fleet-default label \
    clusters.provisioning.cattle.io ${cluster_name} \
    rke.cattle.io/init-node-machine-id=${machine_id} \
    --overwrite
  4. 如果以上步骤执行完之后集群状态还是没有变化,那么再尝试下面的操作。

    cluster_name=rke2-xxx
    new_init_node_name=custom-de22ecaxxxx
    new_init_node_ip=192.168.x.x

    node_list=$( kubectl -n fleet-default get machines.cluster.x-k8s.io -o json|jq -r ".items[]|select(.spec.clusterName == \"$cluster_name\") |.metadata.name" )

    for node in ${node_list};
    do
    if [ "$node" == "$new_init_node_name" ]; then
    kubectl -n fleet-default annotate secrets ${node}-machine-plan rke.cattle.io/joined-to='' --overwrite
    else
    kubectl -n fleet-default annotate secrets ${node}-machine-plan rke.cattle.io/joined-to="https://${new_init_node_ip}:9345" --overwrite
    fi
    done