强制移除 Anthos clusters on Bare Metal 中的损坏节点

如果某个节点损坏并且需要从集群中移除以进行修复或更换,您可以强制将该节点从集群中移除。

强制移除工作器节点

在 Anthos clusters on Bare Metal 中,您可以添加注解来标记要强制移除的节点。

从父节点池中移除节点后,运行以下命令,以使用 baremetal.cluster.gke.io/force-remove 注释为相应的故障机器添加注释。注释本身的值无关紧要:

kubectl --kubeconfig ADMIN_KUBECONFIG -n CLUSTER_NAMESPACE \
  annotate machine 10.200.0.8 baremetal.cluster.gke.io/force-remove=true

Anthos clusters on Bare Metal 成功移除了节点。

强制移除控制层面节点

强制移除控制层面节点与在控制平面节点上执行 kubeadm reset 类似,但需要执行额外的步骤。

如需强制从节点池中移除控制层面节点,您需要对包含故障控制层面节点的集群执行以下操作:

  • etcd 集群中移除故障节点上运行的故障 etcd 成员
  • 更新 kube 中的 ClusterStatus 以移除相应的 apiEndpoint

移除故障 etcd 成员

要移除故障控制层点节点,请先在剩余的健康 etcd pod 上运行 etcdctl。如需详细了解此操作,请参阅此 Kubernetes 文档

在以下步骤中,CLUSTER_KUBECONFIG 是集群的 kubeconfig 文件的路径。

  1. 使用以下命令查找 etcd pod:

    kubectl --kubeconfig CLUSTER_KUBECONFIG get \
     pod -n kube-system -l component=etcd -o wide
    

    该命令会返回以下节点列表。对于本示例,假设节点 10.200.0.8 无法访问且不可恢复:

    NAME                READY   STATUS    RESTARTS   AGE     IP           NODE
    etcd-357b68f4ecf0   1/1     Running   0          9m2s    10.200.0.6   357b68f4ecf0
    etcd-7d7c21db88b3   1/1     Running   0          33m     10.200.0.7   7d7c21db88b3
    etcd-b049141e0802   1/1     Running   0          8m22s   10.200.0.8   b049141e0802
    

  2. 对剩余的一个健康 etcd pod 执行 exec:

    kubectl --kubeconfig CLUSTER_KUBECONFIG exec -it -n \
    kube-system etcd-357b68f4ecf0 -- /bin/sh
    
  3. 查询当前成员以找到故障成员的 ID。该命令将返回一个列表:

    etcdctl --endpoints=https://10.200.0.6:2379,https://10.200.0.7:2379 --key=/etc/kubernetes/pki/etcd/peer.key \
    --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt  member list
    

    此命令会返回类似如下的结果:

    23da9c3f2594532a, started, 7d7c21db88b3, https://10.200.0.6:2380, https://10.200.0.6:2379, false
    772c1a54956b7f51, started, 357b68f4ecf0, https://10.200.0.7:2380, https://10.200.0.7:2379, false
    f64f66ad8d3e7960, started, b049141e0802, https://10.200.0.8:2380, https://10.200.0.8:2379, false
    
  4. 移除故障成员:

    etcdctl --endpoints=https://10.200.0.6:2379,https://10.200.0.7:2379 --key=/etc/kubernetes/pki/etcd/peer.key \
    --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt \
     member remove f64f66ad8d3e7960
    

更新 ClusterStatus 并移除故障 apiEndpoint

在以下步骤中,CLUSTER_KUBECONFIG 是集群的 kubeconfig 文件的路径。

  1. kubeadm-config ConfigMap 中查询 ClusterStatus 部分:

    kubectl --kubeconfig CLUSTER_KUBECONFIG describe configmap -n \
    kube-system kubeadm-config
    

    该命令会返回类似于如下所示的结果:

    ...
    ClusterStatus:
    ----
    apiEndpoints:
    7d7c21db88b3:
      advertiseAddress: 10.200.0.6
      bindPort: 6444
    357b68f4ecf0:
      advertiseAddress: 10.200.0.7
      bindPort: 6444
    b049141e0802:
      advertiseAddress: 10.200.0.8
      bindPort: 6444
    apiVersion: kubeadm.k8s.io/v1beta2
    kind: ClusterStatus
    ...
    
  2. 修改 ConfigMap 以移除包含故障 IP 的部分(此示例显示了使用 kubectl edit 命令移除 10.200.0.8 的结果):

    kubectl --kubeconfig CLUSTER_KUBECONFIG edit configmap \
    -n kube-system kubeadm-config
    

    修改后,ConfigMap 类似于以下内容:

    ...
    ClusterStatus: |
      apiEndpoints:
        7d7c21db88b3:
          advertiseAddress: 10.200.0.6
          bindPort: 6444
        357b68f4ecf0:
          advertiseAddress: 10.200.0.7
          bindPort: 6444
      apiVersion: kubeadm.k8s.io/v1beta2
      kind: ClusterStatus
    ...
    
  3. 保存修改后的 ConfigMap 后,故障节点将从集群中移除。