Skip to content

替换工作集群的首个控制节点

本文将以一个高可用三控制节点的工作集群为例。 当工作集群的首个控制节点故障或异常时,如何替换或重新接入首个控制节点。

本文的高可用集群有 3 个 Master 节点:

  • node1 (172.30.41.161)
  • node2 (172.30.41.162)
  • node3 (172.30.41.163)

假设 node1 宕机,接下来介绍如何将宕机后恢复的 node1 重新接入工作集群。

准备工作

在执行替换操作之前,先获取集群资源基本信息,修改相关配置时会用到。

Note

以下获取集群资源信息的命令均在管理集群中执行。

  1. 获取集群名称

    执行如下命令,找到集群对应的 clusters.kubean.io 资源:

    # 比如 clusters.kubean.io 的资源名称为 cluster-mini-1
    # 则获取集群的名称
    CLUSTER_NAME=$(kubectl get clusters.kubean.io cluster-mini-1 -o=jsonpath="{.metadata.name}{'\n'}")
    
  2. 获取集群的主机清单 configmap

    kubectl get clusters.kubean.io cluster-mini-1 -o=jsonpath="{.spec.hostsConfRef}{'\n'}"
    {"name":"mini-1-hosts-conf","namespace":"kubean-system"}
    
  3. 获取集群的配置参数 configmap

    kubectl get clusters.kubean.io cluster-mini-1 -o=jsonpath="{.spec.varsConfRef}{'\n'}"
    {"name":"mini-1-vars-conf","namespace":"kubean-system"}
    

操作步骤

  1. 调整控制平面节点顺序

    重置 node1 节点使其恢复到安装集群之前的状态(或使用新的节点),保持 node1 节点的网络连通性。

    调整主机清单中 node1 节点在 kube_control_plane 、kube_node、etcd 中的顺序 (node1/node2/node3 -> node2/node3/node1):

    function change_control_plane_order() {
      cat << EOF | kubectl apply -f -
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: mini-1-hosts-conf
      namespace: kubean-system
    data:
      hosts.yml: |
        all:
          hosts:
            node1:
              ip: "172.30.41.161"
              access_ip: "172.30.41.161"
              ansible_host: "172.30.41.161"
              ansible_connection: ssh
              ansible_user: root
              ansible_password: dangerous
            node2:
              ip: "172.30.41.162"
              access_ip: "172.30.41.162"
              ansible_host: "172.30.41.162"
              ansible_connection: ssh
              ansible_user: root
              ansible_password: dangerous
            node3:
              ip: "172.30.41.163"
              access_ip: "172.30.41.163"
              ansible_host: "172.30.41.163"
              ansible_connection: ssh
              ansible_user: root
              ansible_password: dangerous
          children:
            kube_control_plane:
              hosts:
                node2:
                node3:
                node1:
            kube_node:
              hosts:
                node2:
                node3:
                node1:
            etcd:
              hosts:
                node2:
                node3:
                node1:
            k8s_cluster:
              children:
                kube_control_plane:
                kube_node:
            calico_rr:
              hosts: {}
    EOF
    }
    
    change_control_plane_order
    
  2. 移除异常状态的首个 master 节点

    调整主机清单的节点顺序后,移除 K8s 控制平面异常状态的 node1。

    Note

    如果 node1 离线或故障,则 extraArgs 须添加以下配置项,node1 在线时不需要添加。

    reset_nodes=false # 跳过重置节点操作
    allow_ungraceful_removal=true # 允许非优雅的移除操作
    
    # 镜像 spray-job 这里可以采用加速器地址
    
    SPRAY_IMG_ADDR="ghcr.m.daocloud.io/kubean-io/spray-job"
    SPRAY_RLS_2_22_TAG="2.22-336b323"
    KUBE_VERSION="v1.24.14"
    CLUSTER_NAME="cluster-mini-1"
    REMOVE_NODE_NAME="node1"
    
    cat << EOF | kubectl apply -f -
    ---
    apiVersion: kubean.io/v1alpha1
    kind: ClusterOperation
    metadata:
      name: cluster-mini-1-remove-node-ops
    spec:
      cluster: ${CLUSTER_NAME}
      image: ${SPRAY_IMG_ADDR}:${SPRAY_RLS_2_22_TAG}
      actionType: playbook
      action: remove-node.yml
      extraArgs: -e node=${REMOVE_NODE_NAME} -e reset_nodes=false -e allow_ungraceful_removal=true -e kube_version=${KUBE_VERSION}
      postHook:
        - actionType: playbook
          action: cluster-info.yml
    EOF
    
  3. 手动修改集群配置,编辑更新 cluster-info

    # 编辑 cluster-info
    kubectl -n kube-public edit cm cluster-info
    
    # 1. 若 ca.crt 证书更新,则需要更新 certificate-authority-data 字段的内容
    # 查看 ca 证书的 base64 编码:
    cat /etc/kubernetes/ssl/ca.crt | base64 | tr -d '\n'
    
    # 2. 需改 server 字段的 IP 地址为新 first master IP, 本文档场景将使用 node2 的 IP 地址 172.30.41.162
    
  4. 手动修改集群配置,编辑更新 kubeadm-config

    # 编辑 kubeadm-config
    kubectl -n kube-system edit cm kubeadm-config
    
    # 修改 controlPlaneEndpoint 为新 first master IP, 本文档场景将使用 node2 的 IP 地址 172.30.41.162
    
  5. 重新扩容 master 节点并更新集群

    Note

    • 使用 --limit 限制更新操作仅作用于 etcd 和 kube_control_plane 节点组。
    • 如果是离线环境,spec.preHook 需要添加 enable-repo.yml,并且 extraArgs 参数填写相关 OS 的正确 repo_list。
    • 扩容完成后,node2 变更为首个 master
    cat << EOF | kubectl apply -f -
    ---
    apiVersion: kubean.io/v1alpha1
    kind: ClusterOperation
    metadata:
      name: cluster-mini-1-update-cluster-ops
    spec:
      cluster: ${CLUSTER_NAME}
      image: ${SPRAY_IMG_ADDR}:${SPRAY_RLS_2_22_TAG}
      actionType: playbook
      action: cluster.yml
      extraArgs: --limit=etcd,kube_control_plane -e kube_version=${KUBE_VERSION}
      preHook:
        - actionType: playbook
          action: enable-repo.yml  # 离线环境下需要添加此 yaml,并且设置正确的 repo-list(安装操作系统软件包),以下参数值仅供参考
          extraArgs: |
            -e "{repo_list: ['http://172.30.41.0:9000/kubean/centos/\$releasever/os/\$basearch','http://172.30.41.0:9000/kubean/centos-iso/\$releasever/os/\$basearch']}"
      postHook:
        - actionType: playbook
          action: cluster-info.yml
    EOF
    

至此,完成了首个 Master 节点的替换。