Sostituzione di una replica etcd non riuscita

Questo documento descrive come sostituire una replica etcd non riuscita in un cluster utente ad alta affidabilità (HA) per Google Distributed Cloud.

Le istruzioni riportate qui si applicano a un cluster utente HA che utilizza kubeception; ovvero un cluster utente in cui non è Controlplane V2 attivato. Se devi sostituire una replica etcd in un cluster utente in cui è abilitato Controlplane V2, contatta l'assistenza clienti Google Cloud.

Prima di iniziare

  • Assicurati che il cluster di amministrazione funzioni correttamente.

  • Assicurati che gli altri due membri di etcd nel cluster utente funzionino correttamente. Se si è verificato un errore per più di un membro di etcd, vedi Recupero da danneggiamento o perdita di dati etcd.

Sostituzione di una replica etcd non riuscita

  1. Esegui il backup di una copia del PodDisruptionBudget (PDB) di etcd in modo da poterlo ripristinare in un secondo momento.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME get pdb kube-etcd-pdb -o yaml > PATH_TO_PDB_FILE

    Dove:

    • ADMIN_CLUSTER_KUBECONFIG è il percorso del file kubeconfig per il cluster di amministrazione.

    • USER_CLUSTER_NAME è il nome del cluster utente che contiene la replica etcd non riuscita.

    • PATH_TO_PDB_FILE è il percorso in cui vuoi salvare il file PDB etcd, ad esempio /tmp/etcpdb.yaml.

  2. Elimina il PodDisruptionBudget (PDB) di etcd.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME delete pdb kube-etcd-pdb
  3. Esegui questo comando per aprire StatefulSet di kube-etcd nell'editor di testo:

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

    Modifica il valore del flag --initial-cluster-state in existing.

    containers:
        - name: kube-etcd
          ...
          args:
            - --initial-cluster-state=existing
          ...
     
  4. Esegui il drain del nodo della replica etcd non riuscita.

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

    Dove NODE_NAME è il nome del nodo della replica etcd non riuscita.

  5. Crea una nuova shell nel container di uno dei pod kube-etcd funzionanti.

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

    dove KUBE_ETCD_POD è il nome del pod kube-etcd funzionante. Ad esempio, kube-etcd-0.

    Da questa nuova shell, esegui i seguenti comandi:

    1. Rimuovi il nodo della replica etcd non riuscita dal cluster etcd.

      Innanzitutto, elenca tutti i membri del cluster etcd:

      etcdctl member list -w table

      L'output mostra tutti gli ID membro. Determina l'ID membro della replica non riuscita.

      Poi rimuovi la replica non riuscita:

      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

      Dove MEMBER_ID è l'ID membro esadecimale del pod della replica etcd non riuscita.

    2. Aggiungi un nuovo membro con lo stesso nome e lo stesso URL peer del nodo di replica non riuscito.

      etcdctl member add MEMBER_NAME --peer-urls=https://MEMBER_NAME.kube-etcd:2380

      Dove MEMBER_NAME è l'identificatore del nodo di replica kube-etcd non riuscito. Ad esempio, kube-etcd-1 o kube-etcd2.

  6. Elenca i pod etcd che gestiscono l'archivio etcd per il cluster utente. Questi pod vengono eseguiti nel cluster di amministrazione:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get pods --namespace USER_CLUSTER_NAME \
        --output wide | grep kube-etcd
    

    L'output mostra i pod etcd e i nodi in cui vengono eseguiti. I nodi mostrati nell'output sono nodi nel cluster di amministrazione che fungono da control plane per il cluster utente:

    NAME              ...   NODE
    kube-etcd-0       ...   node-abc
    kube-etcd-1       ...   node-yyy
    kube-etcd-2       ...   node-zzz
    
  7. Prendi nota dei nomi dei pod e dei nodi del control plane da utilizzare nel manifest del pod che crei nel passaggio successivo.

    Nota che ogni pod etcd è denominato kube-etcd seguito da un numero. Questo numero è chiamato numero membro del pod. Identifica il pod come un particolare membro del cluster etcd che contiene i dati degli oggetti per il cluster utente. Questa guida utilizza il segnaposto MEMBER_NUMBER per fare riferimento al numero del membro del pod etcd.

    Tieni presente anche che ogni pod nel cluster etcd viene eseguito sul proprio nodo.

  8. Crea un manifest del pod che descriva un pod di utilità da eseguire temporaneamente per ripristinare i dati etcd. Salva il seguente manifest del pod nella directory corrente in un file denominato 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_NAME
    

    Sostituisci quanto segue:

    • NODE_NAME: il nodo su cui è in esecuzione il pod kube-etcd-0.

    • USER_CLUSTER_NAME: il nome del cluster utente.

    • GKE_ON_PREM_VERSION: la versione del cluster in cui vuoi eseguire il ripristino di etcd (ad esempio, 1.31.100-gke.136).

    • KUBE_ETCD_SECRET_NAME: il nome del secret utilizzato da etcd nel cluster utente, a partire da kube-etcd-certs.

  9. Crea il pod di utilità nel cluster di amministrazione:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f etcd-utility-MEMBER_NUMBER.yaml
    
  10. Pulisci la directory dei dati etcd dall'interno del pod dell'utilità.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER -- /bin/bash -c 'rm -rf /var/lib/etcd/*'
  11. Elimina il pod dell'utilità.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG delete pod -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER
  12. Rimuovi il contrassegno dal nodo non riuscito.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG uncordon NODE_NAME
  13. Apri lo StatefulSet kube-etcd nell'editor di testo.

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

    Modifica il valore del flag --initial-cluster-state in new.

    containers:
        - name: kube-etcd
          ...
          args:
            - --initial-cluster-state=new
          ...
     
  14. Ripristina il PDB etcd eliminato nel passaggio 1.

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