Remplacer une instance dupliquée etcd défaillante

Cette page explique comment remplacer une instance dupliquée etcd défaillante dans un cluster utilisateur haute disponibilité pour Anthos clusters on VMware (GKE On-Prem).

Avant de commencer

Remplacer une instance dupliquée etcd défaillante

  1. Sauvegardez une copie de l'etcd PodDisruptionBudget (PDB) pour pouvoir le restaurer ultérieurement.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME get pdb kube-etcd-pdb -o yaml > /path/to/etcdpdb.yaml

    Où :

    • ADMIN_CLUSTER_KUBECONFIG correspond au chemin d'accès au fichier kubeconfig pour le cluster d'administrateur.

    • USER_CLUSTER_NAME est le nom du cluster d'utilisateur contenant l'instance dupliquée etcd défaillante.

  2. Supprimez l'etcd PodDisruptionBudget (PDB).

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME delete pdb kube-etcd-pdb
  3. Exécutez la commande suivante pour ouvrir l'objet StatefulSet de kube-etcd dans votre éditeur de texte :

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME edit statefulset kube-etcd

    Remplacez la valeur de l'option --initial-cluster-state par existing.

    containers:
        - name: kube-etcd
          ...
          args:
            - --initial-cluster-state=existing
          ...
     
  4. Videz le nœud de l'instance dupliquée etcd défaillante.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG drain NODE_NAME --ignore-daemonsets --delete-local-data

    NODE_NAME est le nom du nœud de l'instance dupliquée etcd défaillante.

  5. Créez une interface système dans le conteneur de l'un des pods kube-etcd fonctionnels.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it \
       KUBE_ETCD_POD --container kube-etcd --namespace USER_CLUSTER_NAME \
       -- bin/sh

    KUBE_ETCD_POD est le nom du pod kube-etcd opérationnel. Par exemple, kube-etcd-0.

    Dans cette nouvelle interface système, exécutez les commandes suivantes :

    1. Supprimez le nœud de l'instance dupliquée etcd défaillant du cluster etcd.

      ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etcd.local.config/certificates/etcdCA.crt --cert=/etcd.local.config/certificates/etcd.crt --key=/etcd.local.config/certificates/etcd.key --endpoints=https://127.0.0.1:2379 member remove MEMBER_ID

      MEMBER_ID correspond à l'ID du nœud de l'instance dupliquée etcd ayant échoué. Pour obtenir l'ID, exécutez la commande suivante :

      ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etcd.local.config/certificates/etcdCA.crt --cert=/etcd.local.config/certificates/etcd.crt --key=/etcd.local.config/certificates/etcd.key member list -w fields

      La commande précédente affiche tous les membres du cluster etcd. Le résultat ressemble à ce qui suit :

      sh-5.0# ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etcd.local.config/certificates/etcd.key member list -w fields
      
      "ClusterID" : 6963206042588294154
      "MemberID" : 4645269864592341793
      "Revision" : 0
      "RaftTerm" : 15
      "ID" : 2279696924967222455
      "Name" : "kube-etcd-2"
      "PeerURL" : "https://kube-etcd-2.kube-etcd:2380"
      "ClientURL" : "https://kube-etcd-2.kube-etcd:2379"
      "IsLearner" : false
      
      "ID" : 3728561467092418843
      "Name" : "kube-etcd-1"
      "PeerURL" : "https://kube-etcd-1.kube-etcd:2380"
      "ClientURL" : "https://kube-etcd-1.kube-etcd:2379"
      "IsLearner" : false
      
      "ID" : 4645269864592341793
      "Name" : "kube-etcd-0"
      "PeerURL" : "https://kube-etcd-0.kube-etcd:2380"
      "ClientURL" : "https://kube-etcd-0.kube-etcd:2379"
      "IsLearner" : false
      
      sh-5.0#
      

      L'élément MemberID dans le résultat précédent est l'ID du membre du pod kube-etcd opérationnel. Obtenez ensuite le ID du nœud d'instance dupliquée etcd qui a échoué. Dans l'exemple précédentkube-etcd-0 comporte unID de4645269864592341793, kube-etcd-1 comporte unID de3728561467092418843 etkube-etcd-2 comporte unID de2279696924967222455.

      Après avoir obtenu le ID de membre, convertissez-le de décimal en hexadécimal, car la commande member remove accepte un membre hexadécimal ID, tandis que member list renvoie une décimale. Vous pouvez utiliser printf pour effectuer la conversion. Dans cet exemple, la valeur kube-etcd-2 sera la suivante :

      printf '%x\n' 2279696924967222455
      

      Le résultat de la commande précédente est le MEMBER_ID que vous devez utiliser pour la commande member remove.

    2. Ajoutez un nouveau membre portant le même nom et la même URL de pairs que le nœud d'instance dupliquée défaillant.

      ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etcd.local.config/certificates/etcdCA.crt --cert=/etcd.local.config/certificates/etcd.crt --key=/etcd.local.config/certificates/etcd.key member add MEMBER_NAME --peer-urls=https://MEMBER_NAME.kube-etcd:2380

      MEMBER_NAME est l'identifiant du nœud de l'instance dupliquée kube-etcd défaillant. Par exemple, kube-etcd-1 ou kube-etcd2.

  6. Suivez les étapes 1 à 3 de la section Déployer les pods utilitaires pour créer un pod utilitaire dans le cluster d'administrateur. Ce pod permet d'accéder au PersistentVolume (PV) du membre etcd défaillant dans le cluster d'utilisateur.

  7. Nettoyez le répertoire de données etcd depuis le pod utilitaire.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER -- bash -c 'rm -rf /var/lib/etcd/*'
  8. Supprimez le pod utilitaire.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG delete pod -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER
  9. Dissociez le nœud défaillant.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG uncordon NODE_NAME
  10. Ouvrez l'objet StatefulSet de kube-etcd dans votre éditeur de texte.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME edit statefulset kube-etcd

    Remplacez la valeur de l'option --initial-cluster-state par new.

    containers:
        - name: kube-etcd
          ...
          args:
            - --initial-cluster-state=new
          ...
     
  11. Restaurez le PDB d'etcd qui a été supprimé à l'étape 1.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f /path/to/etcdpdb.yaml