Ce document explique comment remplacer une instance répliquée etcd défaillante dans un cluster d'utilisateur haute disponibilité pour Google Distributed Cloud.
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
Assurez-vous que le cluster d'administrateur fonctionne correctement.
Assurez-vous que les deux autres membres etcd du cluster d'utilisateur fonctionnent correctement. Si plusieurs membres etcd ont échoué, consultez la section Récupération après corruption ou perte de données d'etcd.
Remplacer une instance dupliquée etcd défaillante
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_KUBECONFIGcorrespond au chemin d'accès au fichier kubeconfig pour le cluster d'administrateur.USER_CLUSTER_NAMEest le nom du cluster d'utilisateur contenant l'instance dupliquée etcd défaillante.PATH_TO_PDB_FILEest le chemin d'accès où vous souhaitez enregistrer le fichier PDB etcd, par exemple/tmp/etcpdb.yaml.
Supprimez l'etcd PodDisruptionBudget (PDB).
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME delete pdb kube-etcd-pdb
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-stateparexisting.containers: - name: kube-etcd ... args: - --initial-cluster-state=existing ...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
Où
NODE_NAMEest le nom du nœud de l'instance dupliquée etcd défaillante.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
Où
KUBE_ETCD_PODest le nom du pod kube-etcd opérationnel. Exemple :kube-etcd-0Dans cette nouvelle interface système, exécutez les commandes suivantes :
Supprimez le nœud de l'instance dupliquée etcd défaillant du cluster etcd.
Commencez par lister 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 défaillante :
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
Où
MEMBER_IDest l'ID de membre hexadécimal du pod d'instance répliquée etcd défaillante.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
Où
MEMBER_NAMEest l'identifiant du nœud de l'instance dupliquée kube-etcd défaillant. Par exemple,kube-etcd-1oukube-etcd2.
Répertoriez les pods etcd qui gèrent le magasin etcd pour votre cluster d'utilisateur. Ces pods s'exécutent dans le cluster d'administrateur :
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get pods --namespace USER_CLUSTER_NAME \ --output wide | grep kube-etcdLe résultat affiche les pods etcd et les nœuds sur lesquels ils s'exécutent. Les nœuds affichés dans le résultat sont des nœuds du cluster d'administrateur servant de plans de contrôle pour votre cluster d'utilisateur :
NAME ... NODE kube-etcd-0 ... node-abc kube-etcd-1 ... node-yyy kube-etcd-2 ... node-zzz
Notez les noms des pods et des nœuds du plan de contrôle à utiliser dans le fichier manifeste du pod que vous créerez à l'étape suivante.
Notez que chaque pod etcd est nommé
kube-etcdet est accompagné d'un numéro. Ce numéro est appelé numéro de membre du pod. Il identifie le pod comme étant un membre particulier du cluster etcd qui contient les données d'objet de votre cluster d'utilisateur. Ce guide utilise l'espace réservé MEMBER_NUMBER pour faire référence au numéro de membre du pod etcd.Notez également que chaque pod de votre cluster etcd s'exécute sur son propre nœud.
Créez un fichier manifeste de pod qui décrit un pod utilitaire que vous exécutez temporairement pour restaurer les données etcd. Enregistrez le fichier manifeste de pod suivant dans le répertoire actuel dans un fichier nommé
etcd-utility-MEMBER_NUMBER.yaml:apiVersion: v1 kind: Pod metadata: name: etcd-utility-MEMBER_NUMBER namespace: USER_CLUSTER_NAME spec: containers: - command: ["/bin/sh"] args: ["-ec", "while :; do echo '.'; sleep 5 ; done"] image: gcr.io/gke-on-prem-release/etcd-util:GKE_ON_PREM_VERSION name: etcd-utility volumeMounts: - mountPath: /var/lib/etcd name: data - mountPath: /etcd.local.config/certificates name: etcd-certs nodeSelector: kubernetes.googleapis.com/cluster-name: USER_CLUSTER_NAME kubernetes.io/hostname: NODE_NAME tolerations: - effect: NoExecute key: node.kubernetes.io/not-ready operator: Exists tolerationSeconds: 300 - effect: NoExecute key: node.kubernetes.io/unreachable operator: Exists tolerationSeconds: 300 - effect: NoSchedule key: node.kubernetes.io/unschedulable operator: Exists volumes: - name: data persistentVolumeClaim: claimName: data-kube-etcd-MEMBER_NUMBER - name: etcd-certs secret: defaultMode: 420 secretName: KUBE_ETCD_SECRET_NAMERemplacez les éléments suivants :
NODE_NAME: nœud sur lequel le podkube-etcd-0est exécuté.USER_CLUSTER_NAME: nom du cluster d'utilisateur.GKE_ON_PREM_VERSION: version du cluster dans lequel vous souhaitez effectuer la restauration etcd (par exemple, 1.31.100-gke.136).KUBE_ETCD_SECRET_NAME: nom du secret utilisé par etcd dans le cluster d'utilisateur, commençant parkube-etcd-certs.
Créez le pod utilitaire dans votre cluster d'administrateur :
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f etcd-utility-MEMBER_NUMBER.yaml
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/*'
Supprimez le pod utilitaire.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG delete pod -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER
Dissociez le nœud défaillant.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG uncordon NODE_NAME
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-stateparnew.containers: - name: kube-etcd ... args: - --initial-cluster-state=new ...Restaurez le PDB d'etcd qui a été supprimé à l'étape 1.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f /path/to/etcdpdb.yaml