跳到主要内容

Master 节点替换

本文档介绍在 3 Master 高可用集群中,当某个 Master 节点故障且无法恢复时,如何替换该节点。

建议在维护窗口内执行,并严格按照“先移除旧节点,再加入新节点”的顺序操作。

步骤一:确认替换前条件​

  1. 登录一台健康的 Master 节点,确认当前节点状态:

    kubectl get nodes -o wide
  2. 确认 NineData 服务容器名称和运行状态:

    docker ps --format "table {{.Names}}\t{{.Status}}"
  3. 记录以下信息:

    • 故障 Master 节点的 IP 地址。
    • 任意一台健康 Master 节点的 IP 地址。
    • 新服务器的 IP 地址。
    注意

    本文适用于已经部署为 3 Master 架构的集群。若当前环境只有 1 台 Master 节点,请不要直接按本文执行替换操作。

步骤二:获取新节点加入集群所需的 Token​

  1. 在健康 Master 节点执行:

    docker exec -i ninedata-server cat /var/lib/rancher/k3s/server/token
  2. 保存返回的 Token,后续修改 config.properties 时使用。

    说明

    默认容器名为 ninedata-server。如果现场环境的容器名不同,请替换为实际名称。

步骤三:准备 install_source 目录​

  1. 在健康 Master 节点确认安装目录位置:

    find /root -maxdepth 3 -type d -name install_source
  2. 将安装目录拷贝到新服务器,例如:

    scp -r <install_source目录> root@<新服务器IP>:/root/
  3. 登录新服务器,进入安装目录,例如:

    cd /root/install_source
    说明

    install_source 的实际路径以安装包解压目录为准,例如 /root/niup_ins_xxx/install_source。如果您拷贝后目录名称不同,请以实际目录为准。

步骤四:修改新节点配置​

  1. 在新服务器的 install_source 目录中执行:

    grep -nE 'k3s_token|first_master_ip|hostname' config.properties
  2. 根据实际环境修改 config.properties,重点确认以下参数:

    • k3s_token:填写步骤二获取到的 Token。
    • first_master_ip:填写任意一台健康 Master 节点的 IP 地址。
    • hostname:按需修改为新节点的主机名或 IP 地址。
  3. 如需编辑文件,可执行:

    vi config.properties
    说明

    若 hostname 保持为空,安装脚本会默认使用当前主机的本机 IP。

步骤五:停止故障节点并从集群中删除​

  1. 登录故障 Master 节点,执行:

    docker stop ninedata-server
  2. 回到健康 Master 节点,确认故障节点已变为 NotReady:

    kubectl get nodes
  3. 删除故障节点:

    kubectl delete node <故障节点IP>
    注意

    旧节点必须先从集群中删除,再执行新节点加入操作。否则 etcd 成员数和 quorum 会先膨胀,导致新节点无法正常加入。

步骤六:在新服务器上加入 Master 节点​

  1. 登录新服务器,进入 install_source 目录。

  2. 执行以下命令:

    sh add.sh
  3. 执行过程中请保持终端连接,不要中断安装。

    说明

    如需指定数据目录或主机名,可结合脚本参数执行,例如 sh add.sh --data-dir=/opt/ninedata --hostname=<新节点主机名>。

步骤七:验证替换结果​

  1. 回到健康 Master 节点,执行:

    kubectl get nodes -o wide
  2. 如需继续确认服务状态,可执行:

    kubectl get pods -A
  3. 确认新的 Master 节点已经加入集群,且关键服务恢复为 Running。

常见报错及原因说明​

如果在旧节点尚未删除时直接添加新节点,可能出现如下报错:

Waiting for other members to finish joining etcd cluster: etcdserver: unhealthy cluster

原因如下:

原 3 节点 etcd 集群的 quorum 为 2。当旧节点 A 已故障,但 etcd 仍然保留该成员记录时,集群中实际存活的节点只有 B 和 C。如果此时直接加入新节点 D,集群成员数会变为 4,quorum 也会提升为 3。由于当前实际仅有 B、C 两个健康节点,2 < 3,集群会被判定为不健康,导致新节点加入失败。

因此,必须先执行 kubectl delete node <故障节点 IP> 删除旧节点,再执行加节点操作,使集群先恢复到健康的 2/2 状态,然后再接入新的 Master 节点。