Como forçar a remoção de nós corrompidos nos clusters do Anthos em bare metal

Quando um nó é corrompido e precisa ser removido de um cluster para reparo ou substituição, é possível forçar a remoção dele do cluster.

Como forçar a remoção dos nós de trabalho

Nos clusters do Anthos em Bare Metal, é possível adicionar uma anotação que marca um nó para a remoção forçada.

Após remover o nó do pool de nós pai, execute o comando a seguir para anotar a máquina com falha correspondente com a anotação baremetal.cluster.gke.io/force-remove. O valor da anotação em si não importa:

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

Os clusters do Anthos em bare metal removem o nó.

Como forçar a remoção de nós no plano de controle

A remoção forçada de um nó de plano de controle é semelhante à execução de um kubeadm reset nos nós do plano de controle e requer outras etapas.

Para forçar a remoção de um nó do plano de controle dos pools de nós, é necessário executar as ações a seguir em relação ao cluster que contém o nó do plano de controle com falha:

  • remover o membro do etcd com falha da execução do nó com falha no cluster do etcd;
  • atualizar o ClusterStatus no kube para remover o apiEndpoint correspondente.

Como remover um membro do etcd com falha

Para remover o nó do plano de controle com falha, primeiro execute o etcdctl nos pods do etcd íntegros restantes. Para obter mais informações gerais sobre essa operação, consulte esta documentação do Kubernetes.

No procedimento a seguir, CLUSTER_KUBECONFIG é o caminho para o arquivo kubeconfig do cluster.

  1. Procure o pod do etcd com o comando a seguir:

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

    O comando retorna a lista de nós a seguir. Neste exemplo, suponha que o nó 10.200.0.8 esteja inacessível e irrecuperável:

    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. Especifique um dos pods do etcd íntegros restantes:

    kubectl --kubeconfig CLUSTER_KUBECONFIG exec -it -n \
    kube-system etcd-357b68f4ecf0 -- /bin/sh
    
  3. Procure os membros existentes para encontrar o ID do membro com falha. O comando retornará uma lista:

    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
    

    Esse comando retorna, por exemplo:

    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. Remova o membro com falha:

    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
    

Como atualizar o ClusterStatus e remover o apiEndpoint com falha

No procedimento a seguir, CLUSTER_KUBECONFIG é o caminho para o arquivo kubeconfig do cluster.

  1. Procure a seção ClusterStatus no mapa de configuração kubeadm-config:

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

    O comando retorna resultados semelhantes aos mostrados abaixo:

    ...
    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. Edite o mapa de configuração para remover a seção que contém o IP com falha. Este exemplo mostra os resultados da remoção do 10.200.0.8 usando o comando kubectl edit:

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

    Após a edição, o mapa de configuração será semelhante a este:

    ...
    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. Ao salva ro mapa de configuração editado, o nó com falha é removido do cluster.