Remplacer une instance dupliquée etcd défaillante

Ce document explique comment remplacer une instance répliquée etcd défaillante dans un cluster d'utilisateur haute disponibilité pour GKE sur VMware.

Les instructions fournies ici s'appliquent à un cluster d'utilisateur à haute disponibilité qui utilise kubeception, c'est-à-dire un cluster d'utilisateur pour lequel Controlplane V2 n'est pas activé. Si vous devez remplacer une instance répliquée etcd dans un cluster d'utilisateur sur lequel Controlplane V2 est activé, contactez Cloud Customer Care.

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_PDB_FILE

    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.

    • PATH_TO_PDB_FILE est le chemin d'accès où vous souhaitez enregistrer le fichier PDB etcd, par exemple /tmp/etcpdb.yaml.

  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.

      Commencez par répertorier tous les membres du cluster etcd:

      etcdctl member list -w table

      Le résultat affiche tous les ID de membre. Déterminez l'ID de membre de l'instance répliquée défaillante.

      Supprimez ensuite l'instance répliquée ayant échoué:

      export ETCDCTL_CACERT=/etcd.local.config/certificates/etcdCA.crt
      export ETCDCTL_CERT=/etcd.local.config/certificates/etcd.crt
      export ETCDCTL_CERT=/etcd.local.config/certificates/etcd.crt
      export ETCDCTL_KEY=/etcd.local.config/certificates/etcd.key
      export ETCDCTL_ENDPOINTS=https://127.0.0.1:2379
      etcdctl member remove MEMBER_ID

      MEMBER_ID est l'ID de membre hexadécimal du pod d'instance répliquée etcd ayant échoué.

    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 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 -- /bin/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 existing.

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

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