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
Pastikan cluster admin berfungsi dengan benar.
Pastikan dua anggota etcd lainnya di cluster pengguna berfungsi dengan benar. Jika lebih dari satu anggota etcd gagal, lihat Pemulihan dari kerusakan atau kehilangan data etcd.
Mengganti replika etcd yang gagal
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_KUBECONFIGadalah jalur ke file kubeconfig untuk cluster admin.USER_CLUSTER_NAMEadalah nama cluster pengguna yang berisi replika etcd yang gagal.PATH_TO_PDB_FILEadalah jalur tempat Anda ingin menyimpan file PDB etcd, misalnya/tmp/etcpdb.yaml.
Hapus PodDisruptionBudget (PDB) etcd.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME delete pdb kube-etcd-pdb
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-statemenjadiexisting.containers: - name: kube-etcd ... args: - --initial-cluster-state=existing ...Kosongkan node replika etcd yang gagal.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG drain NODE_NAME --ignore-daemonsets --delete-local-data
Dengan
NODE_NAMEadalah nama node replika etcd yang gagal.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_PODadalah nama pod kube-etcd yang berfungsi. Contoh,kube-etcd-0.Dari shell baru ini, jalankan perintah berikut:
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_IDadalah ID anggota hex dari pod replika etcd yang gagal.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_NAMEadalah ID node replika kube-etcd yang gagal. Misalnyakube-etcd-1ataukube-etcd2.
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-etcdOutput 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
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-etcdyang 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.
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_NAMEGanti kode berikut:
NODE_NAME: node tempat Podkube-etcd-0dijalankan.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 dengankube-etcd-certs.
Buat Pod utilitas di cluster admin Anda:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f etcd-utility-MEMBER_NUMBER.yaml
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/*'
Hapus Pod utilitas.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG delete pod -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER
Berhenti memblokir node yang gagal.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG uncordon NODE_NAME
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-statemenjadinew.containers: - name: kube-etcd ... args: - --initial-cluster-state=new ...Pulihkan PDB etcd yang dihapus pada langkah 1.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f /path/to/etcdpdb.yaml