Mengganti replika etcd yang gagal

Dokumen ini menjelaskan cara mengganti replika etcd yang gagal di cluster pengguna ketersediaan tinggi (HA) untuk Google Distributed Cloud.

Petunjuk yang diberikan di sini berlaku untuk cluster pengguna HA yang menggunakan kubeception; yaitu, cluster pengguna yang tidak mengaktifkan Controlplane V2. Jika Anda perlu mengganti replika etcd di cluster pengguna yang mengaktifkan Controlplane V2, hubungi Cloud Customer Care.

Sebelum memulai

Mengganti replika etcd yang gagal

  1. Cadangkan salinan PodDisruptionBudget (PDB) etcd agar Anda dapat memulihkannya nanti.

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

    Dengan:

    • ADMIN_CLUSTER_KUBECONFIG adalah jalur ke file kubeconfig untuk cluster admin.

    • USER_CLUSTER_NAME adalah nama cluster pengguna yang berisi replika etcd yang gagal.

    • PATH_TO_PDB_FILE adalah jalur tempat Anda ingin menyimpan file PDB etcd, misalnya /tmp/etcpdb.yaml.

  2. Hapus PodDisruptionBudget (PDB) etcd.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME delete pdb kube-etcd-pdb
  3. Jalankan perintah berikut untuk membuka StatefulSet kube-etcd di editor teks Anda:

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

    Ubah nilai flag --initial-cluster-state menjadi existing.

    containers:
        - name: kube-etcd
          ...
          args:
            - --initial-cluster-state=existing
          ...
     
  4. Kosongkan node replika etcd yang gagal.

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

    Dengan NODE_NAME adalah nama node replika etcd yang gagal.

  5. Buat shell baru di container salah satu pod kube-etcd yang berfungsi.

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

    Dengan KUBE_ETCD_POD adalah nama pod kube-etcd yang berfungsi. Contoh, kube-etcd-0.

    Dari shell baru ini, jalankan perintah berikut:

    1. Hapus node replika etcd yang gagal dari cluster etcd.

      Pertama, buat daftar semua anggota cluster etcd:

      etcdctl member list -w table

      Output akan menampilkan semua ID anggota. Tentukan ID anggota replika yang gagal.

      Selanjutnya, hapus replika yang gagal:

      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

      Dengan MEMBER_ID adalah ID anggota hex dari pod replika etcd yang gagal.

    2. Tambahkan anggota baru dengan nama dan URL peer yang sama dengan node replika yang gagal.

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

      Dengan MEMBER_NAME adalah ID node replika kube-etcd yang gagal. Misalnya kube-etcd-1 atau kube-etcd2.

  6. Mencantumkan Pod etcd yang mengelola penyimpanan etcd untuk cluster pengguna Anda. Pod ini berjalan di cluster admin:

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

    Output menampilkan Pod etcd dan node tempat Pod berjalan. Node yang ditampilkan dalam output adalah node di cluster admin yang berfungsi sebagai bidang kontrol untuk cluster pengguna Anda:

    NAME              ...   NODE
    kube-etcd-0       ...   node-abc
    kube-etcd-1       ...   node-yyy
    kube-etcd-2       ...   node-zzz
    
  7. Catat nama Pod dan nama node panel kontrol yang akan digunakan dalam manifes Pod yang Anda buat di langkah berikutnya.

    Perhatikan bahwa setiap Pod etcd diberi nama kube-etcd yang ditambahkan dengan angka. Nomor ini disebut nomor anggota untuk Pod. Pod ini mengidentifikasi Pod sebagai anggota tertentu dari cluster etcd yang menyimpan data objek untuk cluster pengguna Anda. Panduan ini menggunakan placeholder MEMBER_NUMBER untuk merujuk ke nomor anggota Pod etcd.

    Perhatikan juga bahwa setiap Pod di cluster etcd Anda berjalan di node-nya sendiri.

  8. Buat manifes Pod yang menjelaskan Pod utilitas yang Anda jalankan untuk sementara guna memulihkan data etcd. Simpan manifes Pod berikut di direktori saat ini dalam file bernama 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
    

    Ganti kode berikut:

    • NODE_NAME: node tempat Pod kube-etcd-0 dijalankan.

    • USER_CLUSTER_NAME: nama cluster pengguna.

    • GKE_ON_PREM_VERSION: versi cluster tempat Anda ingin melakukan pemulihan etcd (misalnya, 1.31.100-gke.136).

    • KUBE_ETCD_SECRET_NAME: nama Secret yang digunakan oleh etcd di cluster pengguna, dimulai dengan kube-etcd-certs.

  9. Buat Pod utilitas di cluster admin Anda:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f etcd-utility-MEMBER_NUMBER.yaml
    
  10. Bersihkan direktori data etcd dari dalam Pod utilitas.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER -- /bin/bash -c 'rm -rf /var/lib/etcd/*'
  11. Hapus Pod utilitas.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG delete pod -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER
  12. Berhenti memblokir node yang gagal.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG uncordon NODE_NAME
  13. Buka StatefulSet kube-etcd di editor teks Anda.

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

    Ubah nilai flag --initial-cluster-state menjadi new.

    containers:
        - name: kube-etcd
          ...
          args:
            - --initial-cluster-state=new
          ...
     
  14. Pulihkan PDB etcd yang dihapus pada langkah 1.

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