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

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

在 Anthos clusters on Bare Metal 1.6.0 中强制移除节点

在 Anthos on Bare Metal 1.6.0 版中,从节点的父节点池中移除节点会导致以下操作:

  • 排空节点
  • 从 Kubernetes 集群中移除节点
  • 将机器重置为安装 Anthos on Bare Metal 之前的状态

但是,如果无法访问节点,则节点排空不会完成。控制器会反复尝试排空节点,并且始终没有进展。

作为临时解决方法,您可以应用以下更改来绕过排空和重置步骤。

注意:此操作要求您谨慎更新 Kubernetes 自定义资源中的特定实现字段。除非您确定节点无法恢复,否则请勿继续。

将损坏的节点从节点池中物理移除并在管理员集群中应用更改后,执行以下步骤。

  1. 在管理员集群中查询集群 API 机器自定义资源,其中 ADMIN_KUBECONFIGkubeconfig 文件的路径,CLUSTER_NAMESPACE 是受影响的集群命名空间:

    kubectl --kubeconfig ADMIN_KUBECONFIG \
    -n CLUSTER_NAMESPACE get ma 10.200.0.8
    

    该命令会返回类似于以下内容的结果:

    NAME         PROVIDERID               PHASE
    10.200.0.8   baremetal://10.200.0.8   Deleting

    在此示例中,10.200.0.8 是卡在删除阶段的节点的 IP 地址。

  2. 修改机器自定义资源并添加 machine.cluster.x-k8s.io/exclude-node-draining 注释。请注意,注释值本身并不重要,因为只要键存在,排空就会被跳过:

    kubectl --kubeconfig ADMIN_KUBECONFIG -n CLUSTER_NAMESPACE \
    annotate ma 10.200.0.8 machine.cluster.x-k8s.io/exclude-node-draining=true
    
  3. 在管理员集群中查询 Bare Metal 机器自定义资源:

    kubectl --kubeconfig ADMIN_KUBECONFIG -n CLUSTER_NAMESPACE \
    get baremetalmachine 10.200.0.8
    

    该命令会返回类似于以下内容的结果:

    NAME         CLUSTER    READY   INSTANCEID               MACHINE
    10.200.0.8   cluster1   true    baremetal://10.200.0.8   10.200.0.8
  4. 移除终结器以跳过重置步骤并取消阻止节点移除:

    kubectl --kubeconfig ADMIN_KUBECONFIG -n CLUSTER_NAMESPACE \
    patch baremetalmachine 10.200.0.8 --type json -p='[{"op": "remove", "path": "/metadata/finalizers"}]'
    

    几秒钟后,节点将从集群中移除。

在 Anthos clusters on Bare Metal 1.6.1 中强制移除节点

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

从父节点池中移除节点后,运行以下命令,以使用 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 后,故障节点将从集群中移除。