Dokumen ini menunjukkan cara mencadangkan dan memulihkan penyimpanan etcd untuk cluster pengguna. Halaman ini juga menyediakan skrip yang dapat Anda gunakan untuk mencadangkan penyimpanan etcd cluster secara otomatis.
Anda dapat membuat file cadangan untuk pemulihan dari bencana tak terduga yang dapat merusak data etcd cluster Anda. Simpan file cadangan di lokasi yang berada di luar cluster dan tidak bergantung pada operasi cluster.
Batasan
Prosedur ini tidak mencadangkan data spesifik per aplikasi.
Prosedur ini tidak mencadangkan PersistentVolumes Anda.
Beban kerja yang dijadwalkan setelah Anda membuat cadangan tidak dipulihkan dengan cadangan tersebut.
Anda tidak dapat memulihkan cluster setelah upgrade gagal.
Prosedur ini tidak dimaksudkan untuk memulihkan cluster yang dihapus.
Mencadangkan cluster pengguna
Cadangan cluster pengguna adalah snapshot dari penyimpanan etcd cluster pengguna. Penyimpanan etcd berisi semua objek Kubernetes dan objek kustom yang diperlukan untuk mengelola status cluster. Snapshot berisi data yang diperlukan untuk membuat ulang komponen dan beban kerja cluster.
Langkah-langkah pencadangan yang Anda ikuti bergantung pada apakah Controlplane V2 diaktifkan di cluster pengguna. Jika Controlplane V2 diaktifkan, bidang kontrol untuk cluster pengguna akan berjalan di cluster pengguna itu sendiri. Jika Controlplane V2 tidak diaktifkan, bidang kontrol untuk cluster pengguna akan berjalan pada satu atau beberapa node di cluster admin, yang disebut sebagai kubeception.
Jalankan perintah berikut untuk menentukan apakah cluster telah mengaktifkan Controlplane V2:
kubectl get onpremuserclusters --kubeconfig USER_CLUSTER_KUBECONFIG \ -n kube-system -o jsonpath='{.items[0].spec.enableControlplaneV2}' && echo
Jika output-nya adalah true
, ikuti langkah-langkah Controlplane V2 untuk mencadangkan
cluster. Jika tidak, ikuti langkah-langkah Kubeception. Langkah-langkah pencadangan
tetap sama, kecuali untuk lokasi kunci, sertifikat, dan
nama Pod dll.
Kubeception
Masukkan shell ke dalam container
kube-etcd
:kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it \ kube-etcd-0 -c kube-etcd -n USER_CLUSTER_NAME \ -- /bin/sh
dengan:
- ADMIN_CLUSTER_KUBECONFIG adalah file kubeconfig cluster admin.
- USER_CLUSTER_NAME adalah nama cluster pengguna.
Di shell Anda, di direktori
/tmp
, buat cadangan dengan namasnapshot.db
: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 \ snapshot save /tmp/snapshot.db
Di shell, masukkan
exit
untuk keluar dari shell.Salin
/tmp/snapshot.db
dari penampungkube-etcd
ke direktori saat ini:kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG cp \ USER_CLUSTER_NAME/kube-etcd-0:/tmp/snapshot.db \ --container kube-etcd snapshot.db
Pesawat Kontrol V2
Dapatkan nama Pod etcd:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get pods \ -n kube-system -l component=etcd,tier=control-plane -ojsonpath='{$.items[*].metadata.name}{"\n"}'
dengan:
- USER_CLUSTER_KUBECONFIG adalah file kubeconfig cluster pengguna.
Contoh:
NAME READY STATUS RESTARTS AGE etcd-uc1-cp1 1/1 Running 0 38m etcd-uc1-cp2 1/1 Running 0 37m etcd-uc1-cp3 1/1 Running 0 38m
Perlu diperhatikan bahwa bisa ada beberapa pod
etcd
, misalnya, 3 untuk cluster HA. Untuk pencadangan, semua podetcd
dapat berfungsi.Masukkan shell ke dalam container
etcd
:kubectl --kubeconfig USER_CLUSTER_KUBECONFIG exec -it \ POD_NAME -c etcd -n kube-system -- /bin/sh
dengan:
- POD_NAME adalah nama pod etcd yang diambil dari langkah sebelumnya.
Di shell, buat file cadangan bernama
snapshot.db
:ETCDCTL_API=3 etcdctl \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ snapshot save /tmp/snapshot.db
Di shell, masukkan
exit
untuk keluar dari shell.Salin
snapshot.db
dari penampungetcd
ke direktori beranda workstation:kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \ cp POD_NAME:/tmp/snapshot.db ~/snapshot.db \ -c etcd -n kube-system
Salin rahasia dari direktori PKI:
ssh -i NODE_NAME.key ubuntu@NODE_EXTERNAL_IP sudo chmod -R 0644 /etc/kubernetes/pki/* sudo chmod 0755 /etc/kubernetes/pki/etcd exit scp -ri NODE_NAME.key ubuntu@NODE_EXTERNAL_IP:/etc/kubernetes/pki ~/pki_NODE_NAME
dengan:
- NODE_NAME adalah file yang berisi kunci ssh untuk node bidang kontrol
- NODE_EXTERNAL_IP adalah alamat IP node bidang kontrol pengguna tempat Anda ingin menyalin secret.
Memulihkan cluster pengguna dari cadangan (non-HA)
Sebelum menggunakan file cadangan untuk memulihkan penyimpanan etcd cluster pengguna, diagnosis cluster Anda dan selesaikan masalah yang ada. Menggunakan cadangan untuk memulihkan cluster yang bermasalah dapat membuat ulang atau memperburuk masalah. Hubungi tim dukungan GKE di VMware untuk mendapatkan bantuan lebih lanjut terkait pemulihan cluster Anda.
Petunjuk berikut menjelaskan cara menggunakan file cadangan untuk memulihkan cluster pengguna jika data etcd cluster rusak dan Pod etcd cluster pengguna mengalami errorlooping.
Kubeception
Anda dapat memulihkan data etcd dengan men-deploy Pod utilitas yang menimpa data yang rusak dengan cadangan. Server API cluster admin harus berjalan dan penjadwal cluster admin harus dapat menjadwalkan Pod baru.
Temukan nama Secret yang digunakan oleh etcd di cluster pengguna:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME \ get secrets | grep kube-etcd-certs
Salin manifes Pod berikut ke file bernama
etcd-utility.yaml
. Ganti kode berikut:NODE_NAME
: node tempat Podkube-etcd-0
dijalankan.ADMIN_CLUSTER_KUBECONFIG
: file kubeconfig cluster admin.USER_CLUSTER_NAME
: nama cluster pengguna.GKE_ON_PREM_VERSION
: versi cluster tempat Anda ingin melakukan pemulihan etcd (misalnya, 1.5.0-gke.0).KUBE_ETCD_SECRET_NAME
: nama Secret yang digunakan oleh etcd di cluster pengguna, dimulai dengankube-etcd-certs
.
apiVersion: v1 kind: Pod metadata: name: etcd-utility-0 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-0 - name: etcd-certs secret: defaultMode: 420 secretName: KUBE_ETCD_SECRET_NAME
Deploy Pod utilitas:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \ create -f etcd-utility.yaml --namespace USER_CLUSTER_NAME
Salin
snapshot.db
dari direktori saat ini ke direktori utama Pod utilitas:kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG cp snapshot.db \ USER_CLUSTER_NAME/etcd-utility-0:snapshot.db --container etcd-utility
Masukkan shell ke dalam container
etcd-utility
:kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec it \ etcd-utility-0 --container etcd-utility --namespace USER_CLUSTER_NAME \ -- bin/sh
Di shell Anda, di direktori root, jalankan perintah berikut untuk membuat folder baru yang berisi cadangan:
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 \ snapshot restore snapshot.db
Di shell Anda, hapus data etcd yang lama:
rm -r var/lib/etcd/*
Di shell, salin data etcd yang dipulihkan ke lokasi permanennya:
cp -r default.etcd/* var/lib/etcd/
Di shell, masukkan
exit
untuk keluar dari shell.Hapus Pod etcd yang mengalami error:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \ delete pod kube-etcd-0 --namespace USER_CLUSTER_NAME
Pastikan Pod etcd tidak lagi error.
Hapus Pod utilitas:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \ delete pod etcd-utility-0 --namespace USER_CLUSTER_NAME
Hapus
etcd-utility.yaml
dari direktori saat ini:rm etcd-utility.yaml
Pesawat Kontrol V2
Anda dapat memulihkan data etcd
satu per satu dengan men-deploy penampung etcd sementara yang menimpa data yang rusak dengan cadangan.
Masukkan shell ke node bidang kontrol pengguna:
ssh -i NODE_NAME.key ubuntu@NODE_EXTERNAL_IP
Di shell, hentikan server Kubernetes API dan server etcd:
sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /etc/kubernetes/manifests/etcd.yaml ~
Di shell, masukkan
exit
untuk keluar dari shell.Jalankan
scp
untuk menyalin file cadangansnapshot.db
& secret ke node bidang kontrol pengguna:scp -i NODE_NAME.key ~/snapshot.db ubuntu@NODE_EXTERNAL_IP:/tmp/
chmod a+rw pki/ scp -ri NODE_NAME.key ~/pki_NODE_NAME ubuntu@NODE_EXTERNAL_IP:/etc/kubernetes/pki
Di shell, gunakan
snapshot.db
untuk memulihkan data etcd:sudo docker run --rm -t \ -v /opt/data/var/lib:/var/lib \ -v /etc/kubernetes/pki/etcd:/etc/kubernetes/pki/etcd \ -v /tmp:/tmp \ --env ETCDCTL_API=3 \ gcr.io/gke-on-prem-release/etcd-util:GKE_ON_PREM_VERSION etcdctl \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ --data-dir=/opt/data/var/lib/etcd \ --name=NODE_NAME \ --initial-advertise-peer-urls=https://NODE_IP_ADDRESS:2380 \ --initial-cluster=NODE_NAME=https://NODE_IP_ADDRESS:2380 \ snapshot restore /tmp/snapshot.db
dengan:
GKE_ON_PREM_VERSION
adalah versi GKE Enterprise yang digunakan sebagai tag imageNODE_NAME
adalah nama node tempat pemulihan dilakukanNODE_IP_ADDRESS
adalah IP dari node yang disebutkan
Tambahkan tanda
- --initial-cluster-state=new
di file manifes etcd pada bagian perintah container.Contoh:
containers: - command: - etcd ... - --initial-cluster-state=new ...
Di shell, mulai server kube-apiserver dan etcd:
sudo mv etcd.yaml kube-apiserver.yaml /etc/kubernetes/manifests/
Di shell, masukkan
exit
untuk keluar dari shell.
Memulihkan cluster pengguna dari cadangan (HA)
Kubeception
Bagian ini menunjukkan cara memulihkan data etcd untuk cluster pengguna dengan ketersediaan tinggi (HA).
Untuk cluster pengguna dengan ketersediaan tinggi (HA), ada tiga node di cluster admin yang berfungsi sebagai bidang kontrol untuk cluster pengguna. Setiap node tersebut menjalankan Pod etcd yang mempertahankan data etcd pada volume penyimpanan.
Jika dua Pod etcd responsif, dan data pada volume penyimpanan terkait tetap utuh, Anda tidak perlu menggunakan file cadangan. Itu karena Anda masih memiliki kuorum etcd.
Dalam kasus yang jarang terjadi, saat dua volume penyimpanan etcd mengalami kerusakan data, Anda harus menggunakan file cadangan untuk memulihkan data etcd.
Untuk melakukan langkah-langkah di bagian ini, Anda harus sudah membuat file snapshot.db
seperti yang dijelaskan dalam Mencadangkan cluster pengguna.
Mencantumkan Pod dan node etcd
Cantumkan Pod etcd yang mengelola penyimpanan etcd untuk cluster pengguna Anda. Pod berikut ini berjalan di cluster admin:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get pods --namespace USER_CLUSTER_NAME \ --output wide | grep kube-etcd
Output-nya menunjukkan Pod etcd dan node tempat Pod berjalan. Node yang ditampilkan di output adalah node di cluster admin yang berfungsi sebagai bidang kontrol untuk cluster pengguna Anda:
NAME ... NODE kube-etcd-0 ... xxx kube-etcd-1 ... yyy kube-etcd-2 ... zzz
Catat nama Pod dan nama node bidang kontrol untuk digunakan nanti.
Perhatikan bahwa setiap Pod etcd diberi nama
kube-etcd
yang ditambahkan dengan angka. Angka ini disebut nomor anggota untuk Pod. Hal 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 pada nomor anggota Pod etcd.Perhatikan juga bahwa setiap Pod di cluster etcd berjalan pada node-nya sendiri.
Bersiap men-deploy Pod utilitas
Simpan manifes untuk PodDisruptionBudget (PDB) untuk server Kubernetes API cluster pengguna. Kemudian hapus PDB.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG get pdb --namespace USER_CLUSTER_NAME \ kube-apiserver-pdb --output yaml > kube-apiserver-pdb.yaml kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG delete pdb --namespace USER_CLUSTER_NAME \ kube-apiserver-pdb
Hentikan server Kubernetes API dan Deployment pemeliharaan etcd. Tindakan ini memastikan bahwa tidak ada komponen yang akan menggunakan etcd selama pemulihan:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG --namespace USER_CLUSTER_NAME \ scale --replicas 0 statefulset kube-apiserver kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG --namespace USER_CLUSTER_NAME \ scale --replicas 0 deployment gke-master-etcd-maintenance
Ingat kembali nama image container untuk Pod etcd Anda.
Men-deploy Pod utilitas
Ingat kembali nama Pod etcd dan nama node tempat Pod berjalan.
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
Manifes sebelumnya menjelaskan Pod utilitas yang Anda jalankan sementara untuk memulihkan data etcd.
Buat Pod utilitas di cluster admin Anda:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f etcd-utility-MEMBER_NUMBER.yaml
Salin file cadangan Anda,
snapshot.db
, ke direktori utama Pod utilitas:kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG cp snapshot.db \ USER_CLUSTER_NAME/etcd-utility-MEMBER_NUMBER:snapshot.db
Masukkan shell ke dalam container
etcd-utility
di Pod utilitas:kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG exec -it --namespace USER_CLUSTER_NAME \ etcd-utility-MEMBER_NUMBER --container etcd-utility -- bin/sh
Di shell Anda, pada direktori root, gunakan
snapshot.db
untuk memulihkan data 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 \ --name=kube-etcd-MEMBER_NUMBER \ --initial-cluster=kube-etcd-0=https://kube-etcd-0.kube-etcd:2380,kube-etcd-1=https://kube-etcd-1.kube-etcd:2380,kube-etcd-2=https://kube-etcd-2.kube-etcd:2380 \ --initial-cluster-token=etcd-cluster-1 \ --initial-advertise-peer-urls=https://kube-etcd-MEMBER_NUMBER.kube-etcd:2380 \ snapshot restore snapshot.db
Perintah sebelumnya menyimpan data etcd dalam direktori
/kube-etcd-MEMBER_NUMBER.etcd
.Di shell Anda, hapus data etcd yang lama:
rm -r var/lib/etcd/*
Di shell, salin data etcd yang dipulihkan ke lokasi permanennya:
cp -r kube-etcd-MEMBER_NUMBER.etcd/* var/lib/etcd/
Di shell, hapus direktori etcd sementara dan file cadangan:
rm -R kube-etcd-MEMBER_NUMBER.etcd/ rm snapshot.db
Di shell, masukkan
exit
untuk keluar dari shell.Hapus Pod utilitas:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG delete pod \ --namespace USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER
Memulai ulang komponen
Setelah men-deploy dan menghapus Pod utilitas, Anda perlu memulai ulang beberapa komponen cluster.
Mulai ulang Pod di StatefulSet
kube-etcd
:kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG rollout restart statefulset \ --namespace USER_CLUSTER_NAME kube-etcd
Mulai server Kubernetes API untuk cluster pengguna Anda:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG scale statefulset --replicas 3 \ --namespace USER_CLUSTER_NAME kube-apiserver
Mulai Deployment pemeliharaan etcd untuk cluster pengguna Anda:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG scale deployment --replicas 1 \ --namespace=USER_CLUSTER_NAME gke-master-etcd-maintenance
Pulihkan PDB untuk server Kubernetes API:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG apply -f kube-apiserver-pdb.yaml
Pesawat Kontrol V2
Bagian ini menunjukkan cara memulihkan data etcd untuk cluster pengguna dengan ketersediaan tinggi (HA).
Untuk cluster pengguna dengan ketersediaan tinggi (HA), ada tiga node di cluster pengguna yang berfungsi sebagai bidang kontrol untuk cluster pengguna. Setiap node tersebut menjalankan Pod etcd yang mempertahankan data etcd pada volume penyimpanan.
Jika dua Pod etcd responsif, dan data pada volume penyimpanan terkait tetap utuh, Anda tidak perlu menggunakan file cadangan. Itu karena Anda masih memiliki kuorum etcd.
Dalam kasus yang jarang terjadi, saat dua volume penyimpanan etcd mengalami kerusakan data, Anda harus menggunakan file cadangan untuk memulihkan data etcd.
Untuk melakukan langkah-langkah di bagian ini, Anda harus sudah membuat file snapshot.db
seperti yang dijelaskan dalam Mencadangkan cluster pengguna.
Mencantumkan Pod dan node etcd
Cantumkan Pod etcd dan node-nya masing-masing:
kubectl get pod --kubeconfig USER_CLUSTER_KUBECONFIG \ -n kube-system -l component=etcd,tier=control-plane -o wide
Output-nya menunjukkan Pod etcd dan node tempat Pod berjalan. Node yang ditampilkan di output adalah node di cluster admin yang berfungsi sebagai bidang kontrol untuk cluster pengguna Anda:
NAME ... NODE etcd-xxx ... xxx etcd-yyy ... yyy etcd-zzz ... zzz
Catat nama Pod dan nama node bidang kontrol untuk digunakan nanti.
Perhatikan bahwa setiap Pod etcd diberi nama
etcd-xxx
yang ditambahkan dengan nama node. Hal ini karena di Controlplane V2, pod etcd berjalan sebagai pod statis.
Bersiap untuk memulihkan
Jalankan
scp
untuk menyalin file cadangansnapshot.db
ke semua node bidang kontrol pengguna:scp ~/snapshot.db -i NODE_NAME.key ubuntu@NODE_EXTERNAL_IP:/tmp/
Salin secret ke node bidang kontrol pengguna masing-masing:
chmod a+rw pki/ scp -r ~/pki -i NODE_NAME.key ubuntu@NODE_EXTERNAL_IP:/etc/kubernetes/
Masukkan shell ke node bidang kontrol pengguna:
ssh -i NODE_NAME.key ubuntu@NODE_EXTERNAL_IP
Melakukan pemulihan
Ingat kembali nama Pod etcd dan nama node tempat Pod berjalan.
Di shell, hentikan server Kubernetes API dan server etcd pada semua node bidang kontrol pengguna:
sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /etc/kubernetes/manifests/etcd.yaml ~
Di shell ini, gunakan
snapshot.db
untuk memulihkan data etcd pada semua node bidang kontrol pengguna:sudo docker run --rm -t \ -v /opt/data/var/lib:/var/lib \ -v /etc/kubernetes/pki/etcd:/etc/kubernetes/pki/etcd \ -v /tmp:/tmp \ --env ETCDCTL_API=3 \ gcr.io/gke-on-prem-release/etcd-util:GKE_ON_PREM_VERSION etcdctl \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ --data-dir=/opt/data/var/lib/etcd \ --name=NODE_NAME \ --initial-advertise-peer-urls=https://NODE_IP_ADDRESS:2380 \ --initial-cluster=NODE1=https://NODE1_IP:2380,NODE2=https://NODE2_IP:2380,NODE3=https://NODE3_IP:2380 \ snapshot restore /tmp/snapshot.db
dengan:
GKE_ON_PREM_VERSION
adalah versi GKE Enterprise yang digunakan sebagai tag imageNODE_NAME
adalah nama node tempat pemulihan dilakukanNODE_IP_ADDRESS
adalah IP dari node yang disebutkan- Isi
NODE1
,NODE2
,NODE3
danIP
dari node masing-masing untuk flag--initial-cluster
. Anda juga bisa mendapatkannya dari manifes etcd.
Tambahkan tanda
- --initial-cluster-state=existing
di file manifes etcd pada bagian perintah container.Contoh:
containers: - command: - etcd ... - --initial-cluster-state=existing ...
Memulai ulang komponen
Di shell, mulai server
kube-apiserver
danetcd
ke semua node bidang kontrol pengguna:sudo mv ~/etcd.yaml ~/kube-apiserver.yaml /etc/kubernetes/manifests/
Di shell, masukkan
exit
untuk keluar dari shell.Pastikan
kube-apiserver
danetcd
berjalan di semua node bidang kontrol pengguna:kubectl get pod --kubeconfig USER_CLUSTER_KUBECONFIG \ -n kube-system -l tier=control-plane
Pencadangan cluster otomatis
Anda dapat menggunakan skrip yang diberikan di sini sebagai contoh tentang cara mencadangkan cluster secara otomatis. Perhatikan bahwa skrip berikut tidak didukung, dan hanya boleh digunakan sebagai referensi untuk menulis skrip yang lebih baik, lebih kuat, dan lengkap. Sebelum Anda menjalankan skrip, isi nilai untuk lima variabel di awal skrip:
Kubeception
- Tetapkan
BACKUP_DIR
ke jalur tempat Anda ingin menyimpan cadangan cluster pengguna dan admin. Jalur ini tidak boleh ada. - Tetapkan
ADMIN_CLUSTER_KUBECONFIG
ke jalur file kubeconfig cluster admin - Tetapkan
USER_CLUSTER_NAMESPACE
ke nama cluster pengguna Anda. Nama cluster pengguna Anda adalah namespace di cluster admin. - Tetapkan
EXTERNAL_IP
ke VIP yang Anda pesan untuk layanan bidang kontrol admin. - Tetapkan
SSH_PRIVATE_KEY
ke jalur kunci SSH Anda. - Jika Anda menggunakan jaringan pribadi, setel
JUMP_IP
ke alamat IP server lompatan jaringan Anda.
#!/usr/bin/env bash # Automates manual steps for taking backups of user and admin clusters. # Fill in the variables below before running the script. BACKUP_DIR="" # path to store user and admin cluster backups ADMIN_CLUSTER_KUBECONFIG="" # path to admin cluster kubeconfig USER_CLUSTER_NAMESPACE="" # user cluster namespace EXTERNAL_IP="" # admin control plane node external ip - follow steps in documentation SSH_PRIVATE_KEY="" # path to vsphere_tmp ssh private key - follow steps in documentation JUMP_IP="" # network jump server IP - leave empty string if not using private network. mkdir -p $BACKUP_DIR mkdir $BACKUP_DIR/pki # USER CLUSTER BACKUP # Snapshot user cluster etcd kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} exec -it -n ${USER_CLUSTER_NAMESPACE} kube-etcd-0 -c kube-etcd -- /bin/sh -ec "export 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 snapshot save ${USER_CLUSTER_NAMESPACE}_snapshot.db" kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} cp ${USER_CLUSTER_NAMESPACE}/kube-etcd-0:${USER_CLUSTER_NAMESPACE}_snapshot.db $BACKUP_DIR/user-cluster_${USER_CLUSTER_NAMESPACE}_snapshot.db # ADMIN CLUSTER BACKUP # Set up ssh options SSH_OPTS=(-oStrictHostKeyChecking=no -i ${SSH_PRIVATE_KEY}) if [ "${JUMP_IP}" != "" ]; then SSH_OPTS+=(-oProxyCommand="ssh -oStrictHostKeyChecking=no -i ${SSH_PRIVATE_KEY} -W %h:%p ubuntu@${JUMP_IP}") fi # Copy admin certs ssh "${SSH_OPTS[@]}" ubuntu@${EXTERNAL_IP} 'sudo chmod -R +rw /etc/kubernetes/pki/*' scp -r "${SSH_OPTS[@]}" ubuntu@${EXTERNAL_IP}:/etc/kubernetes/pki/* ${BACKUP_DIR}/pki/ # Snapshot admin cluster etcd admin_etcd=$(kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} get pods -n kube-system -l component=etcd,tier=control-plane -ojsonpath='{$.items[*].metadata.name}{"\n"}') kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} exec -it -n kube-system ${admin_etcd} -- /bin/sh -ec "export ETCDCTL_API=3; etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client.key snapshot save admin_snapshot.db" kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} cp -n kube-system ${admin_etcd}:admin_snapshot.db $BACKUP_DIR/admin-cluster_snapshot.db
Pesawat Kontrol V2
- Tetapkan
BACKUP_DIR
ke jalur tempat Anda ingin menyimpan cadangan cluster pengguna dan admin. Jalur ini tidak boleh ada. - Tetapkan
ADMIN_CLUSTER_KUBECONFIG
ke jalur file kubeconfig cluster admin - Tetapkan
USER_CLUSTER_KUBECONFIG
ke jalur kubeconfig cluster pengguna Anda. - Tetapkan
EXTERNAL_IP
ke VIP yang Anda pesan untuk layanan bidang kontrol admin. - Tetapkan
SSH_PRIVATE_KEY
ke jalur kunci SSH Anda. - Jika Anda menggunakan jaringan pribadi, setel
JUMP_IP
ke alamat IP server lompatan jaringan Anda.
#!/usr/bin/env bash # Automates manual steps for taking backups of user and admin clusters. # Fill in the variables below before running the script. BACKUP_DIR="" # path to store user and admin cluster backups ADMIN_CLUSTER_KUBECONFIG="" # path to admin cluster kubeconfig USER_CLUSTER_KUBECONFIG="" # path to user cluster kubeconfig EXTERNAL_IP="" # admin control plane node external ip - follow steps in documentation SSH_PRIVATE_KEY="" # path to ssh private key - follow steps in documentation JUMP_IP="" # network jump server IP - leave empty string if not using private network mkdir -p $BACKUP_DIR mkdir $BACKUP_DIR/pki # USER CLUSTER BACKUP user_etcd=$(kubectl --kubeconfig=${USER_CLUSTER_KUBECONFIG} get pods -n kube-system -l component=etcd,tier=control-plane -ojsonpath='{$.items[0].metadata.name}{"\n"}') kubectl --kubeconfig=${USER_CLUSTER_KUBECONFIG} exec -it -n kube-system ${user_etcd} -c etcd -- /bin/sh -ec "export ETCDCTL_API=3; etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key snapshot save /tmp/${user_etcd}_snapshot.db" kubectl --kubeconfig=${USER_CLUSTER_KUBECONFIG} cp kube-system/${user_etcd}:/tmp/${user_etcd}_snapshot.db $BACKUP_DIR/${user_etcd}_snapshot.db # ADMIN CLUSTER BACKUP # Set up ssh options SSH_OPTS=(-oStrictHostKeyChecking=no -i ${SSH_PRIVATE_KEY}) if [ "${JUMP_IP}" != "" ]; then SSH_OPTS+=(-oProxyCommand="ssh -oStrictHostKeyChecking=no -i ${SSH_PRIVATE_KEY} -W %h:%p ubuntu@${JUMP_IP}") fi # Copy admin certs ssh "${SSH_OPTS[@]}" ubuntu@${EXTERNAL_IP} 'sudo chmod -R +rw /etc/kubernetes/pki/*' scp -r "${SSH_OPTS[@]}" ubuntu@${EXTERNAL_IP}:/etc/kubernetes/pki/* ${BACKUP_DIR}/pki/ # Snapshot admin cluster etcd admin_etcd=$(kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} get pods -n kube-system -l component=etcd,tier=control-plane -ojsonpath='{$.items[*].metadata.name}{"\n"}') kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} exec -it -n kube-system ${admin_etcd} -- /bin/sh -ec "export ETCDCTL_API=3; etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client.key snapshot save /tmp/${admin_etcd}_snapshot.db" kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} cp -n kube-system ${admin_etcd}:/tmp/${admin_etcd}_snapshot.db $BACKUP_DIR/${admin_etcd}_snapshot.db
Memverifikasi pemulihan
Untuk memverifikasi bahwa cluster Anda berhasil dipulihkan, jalankan gkectl mendiagnosis cluster.
Langkah selanjutnya
- Mencadangkan dan memulihkan cluster admin
- Pelajari cara mendiagnosis masalah cluster
- Pelajari augur, alat open source untuk memulihkan objek tertentu dari pencadangan etcd.