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
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/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.
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-state
parexisting
.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_NAME
est 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_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 :
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
Où
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 leID
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 commandemember remove
accepte un membre hexadécimalID
, tandis quemember list
renvoie une décimale. Vous pouvez utiliserprintf
pour effectuer la conversion. Dans cet exemple, la valeurkube-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 commandemember remove
.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
Où
MEMBER_NAME
est l'identifiant du nœud de l'instance dupliquée kube-etcd défaillant. Par exemple,kube-etcd-1
oukube-etcd2
.
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.
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/*'
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-state
parnew
.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