Mencadangkan dan memulihkan cluster pengguna

Dokumen ini menunjukkan cara mencadangkan dan memulihkan penyimpanan etcd untuk cluster pengguna dibuat dengan Google Distributed Cloud (khusus software) untuk VMware. Halaman ini juga menyediakan skrip yang dapat digunakan untuk secara otomatis mencadangkan{i> etcd store<i} cluster.

Anda dapat membuat file cadangan untuk pemulihan dari bencana tak terduga yang mungkin merusak data dll. cluster Anda. Simpan file cadangan di lokasi yang di luar cluster dan tidak bergantung pada operasi cluster.

Batasan

  • Prosedur ini tidak mencadangkan data khusus aplikasi.

  • Prosedur ini tidak mencadangkan PersistentVolumes Anda.

  • Beban kerja yang dijadwalkan setelah Anda membuat cadangan tidak akan dipulihkan dengan cadangan.

  • Anda tidak dapat memulihkan cluster setelah upgrade gagal.

  • Prosedur ini tidak dimaksudkan untuk memulihkan cluster yang telah dihapus.

Untuk informasi selengkapnya tentang batasan, lihat Ketidakcocokan infrastruktur.

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 workload cluster.

Langkah pencadangan yang Anda ikuti bergantung pada apakah Controlplane V2 diaktifkan atau tidak pada cluster pengguna. Ketika Controlplane V2 diaktifkan, bidang kontrol untuk cluster pengguna dijalankan di cluster pengguna itu sendiri. Ketika Pesawat Kontrol V2 tidak diaktifkan, bidang kontrol untuk cluster pengguna berjalan pada satu atau beberapa node di ada di cluster admin, yang disebut sebagai {i>kubeception<i}.

Jalankan perintah berikut untuk menentukan apakah cluster memiliki Controlplane V2 diaktifkan:

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 gugus ini. Jika tidak, ikuti langkah-langkah Kubeception.

Kubeception

  1. Dapatkan 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 kubeconfig cluster admin .
    • USER_CLUSTER_NAME adalah nama cluster pengguna.
  2. Di shell Anda, di direktori /tmp, buat cadangan bernama snapshot.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
    
  3. Di shell, masukkan exit untuk keluar dari shell.

  4. Salin /tmp/snapshot.db dari penampung kube-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

  1. Dapatkan nama Pod dll.:

    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 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 dapat terdapat beberapa pod etcd, misalnya, 3 untuk cluster HA. Untuk pencadangan, semua pod etcd harus berfungsi.

  2. Dapatkan 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 dll. yang diambil dari langkah sebelumnya.
  3. Di shell Anda, 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
    
  4. Di shell, masukkan exit untuk keluar dari shell.

  5. Salin snapshot.db dari container etcd ke direktori beranda workstation:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \
     cp POD_NAME:/tmp/snapshot.db ~/snapshot.db \
     -c etcd -n kube-system
    
  6. 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 dari di mana Anda ingin menyalin rahasia tersebut.

Memulihkan cluster pengguna dari cadangan (non-HA)

Sebelum Anda menggunakan file cadangan untuk memulihkan penyimpanan {i>etcd<i} cluster pengguna Anda, mendiagnosis cluster Anda dan menyelesaikan masalah yang ada. Menggunakan cadangan untuk memulihkan cluster yang bermasalah mungkin membuat ulang atau memperburuk masalah. Hubungi tim dukungan Google Cloud untuk bantuan lebih lanjut dalam memulihkan cluster Anda.

Petunjuk berikut menjelaskan cara menggunakan file cadangan untuk memulihkan pengguna cluster jika data etcd cluster rusak dan Pod dll. dari 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.

  1. 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
    
  2. Salin manifes Pod berikut ke file bernama etcd-utility.yaml. Ganti hal berikut:

    • NODE_NAME: node tempat Pod kube-etcd-0 berada sedang berjalan.

    • ADMIN_CLUSTER_KUBECONFIG: cluster admin {i>kubeconfig<i}.

    • USER_CLUSTER_NAME: nama cluster pengguna.

    • GKE_ON_PREM_VERSION: versi cluster di mana Anda ingin melakukan pemulihan etcd (misalnya, 1.5.0-gke.0).

    • KUBE_ETCD_SECRET_NAME: nama Secret digunakan oleh dll. di cluster pengguna, dimulai dengan kube-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
    
  3. Deploy Pod utilitas:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
      create -f etcd-utility.yaml --namespace USER_CLUSTER_NAME
    
  4. Salin snapshot.db dari direktori saat ini ke direktori utama file Pod utilitas:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG cp snapshot.db \
      USER_CLUSTER_NAME/etcd-utility-0:snapshot.db --container etcd-utility
    
  5. Dapatkan 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
    
  6. Di shell Anda, dalam direktori {i>root<i}, 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
    
  7. Di shell Anda, hapus data etcd yang lama:

    rm -r var/lib/etcd/*
    
  8. Di shell Anda, salin data etcd yang dipulihkan ke lokasi permanennya:

    cp -r default.etcd/* var/lib/etcd/
    
  9. Di shell, masukkan exit untuk keluar dari shell.

  10. Hapus Pod dll yang mengalami error:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
      delete pod kube-etcd-0 --namespace USER_CLUSTER_NAME
    
  11. Memverifikasi bahwa Pod dll. tidak lagi error.

  12. Hapus Pod utilitas:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
      delete pod etcd-utility-0 --namespace USER_CLUSTER_NAME
  13. 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 container etcd sementara yang menimpa data yang rusak dengan cadangan.

  1. Masukkan shell ke node bidang kontrol pengguna:

    ssh -i NODE_NAME.key ubuntu@NODE_EXTERNAL_IP
    
  2. Di shell, hentikan server Kubernetes API dan server etcd:

    sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /etc/kubernetes/manifests/etcd.yaml ~
    
  3. Di shell, masukkan exit untuk keluar dari shell.

  4. Jalankan scp untuk menyalin file cadangan snapshot.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
    
  5. 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 image
    • NODE_NAME adalah nama node tempat pemulihan dilakukan
    • NODE_IP_ADDRESS adalah IP dari node yang dimaksud
  6. Tambahkan flag - --initial-cluster-state=new dalam file manifes etcd pada perintah container.

    Contoh:

    containers:
          - command:
            - etcd
            ...
            - --initial-cluster-state=new
            ...

  7. Di shell, mulai server kube-apiserver dan etcd:

    sudo mv ~/etcd.yaml ~/kube-apiserver.yaml /etc/kubernetes/manifests/
    
  8. 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 HA, ada tiga node di cluster admin yang berfungsi sebagai bidang kontrol untuk cluster pengguna. Masing-masing {i>node<i} tersebut menjalankan Pod {i>etcd<i} yang mempertahankan data dll. pada volume penyimpanan.

Jika dua Pod dll. yang sehat, dan data pada penyimpanan terkait volume masih utuh, maka tidak perlu menggunakan file cadangan. Hal itu karena Anda masih memiliki kuorum dll.

Dalam kasus yang jarang terjadi, jika dua volume penyimpanan {i>etcd<i} merusak data, Anda akan perlu menggunakan file cadangan untuk memulihkan data {i>etcd<i}.

Untuk melakukan langkah-langkah di bagian ini, Anda harus sudah membuat snapshot.db seperti yang dijelaskan dalam Mencadangkan cluster pengguna.

Membuat daftar Pod dan node Anda

  1. Buat daftar Pod etcd yang mengelola penyimpanan etcd untuk cluster pengguna Anda. Ini Pod berjalan di cluster admin:

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

    Output menunjukkan Pod dll. dan node tempat Pod dijalankan. Node yang ditampilkan pada 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
    
  2. Catat nama Pod dan nama node bidang kontrol untuk nanti.

    Perhatikan bahwa setiap Pod dll diberi nama kube-etcd dan ditambahkan dengan angka. Nomor ini disebut nomor anggota untuk Pod. Model ini mengidentifikasi Pod yang merupakan anggota tertentu dari cluster etcd yang menyimpan objek untuk cluster pengguna Anda. Panduan ini menggunakan {i>placeholder<i} MEMBER_NUMBER untuk merujuk ke nomor anggota Pod dll.

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

Bersiap untuk men-deploy Pod utilitas

  1. Simpan manifes untuk PodDisruptionBudget (PDB) untuk cluster pengguna Kubernetes API. 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
    
  2. Hentikan server Kubernetes API dan Deployment pemeliharaan etcd. Hal ini memastikan bahwa tidak ada komponen yang akan menggunakan {i>etcd<i} 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
    
  3. Ingat kembali nama image container untuk Pod dll. Anda.

Men-deploy Pod utilitas

  1. Panggil kembali name of the etcd Pod dan nama node tempat Pod berjalan.

  2. 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 dll.

  1. Buat Pod utilitas di cluster admin Anda:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f etcd-utility-MEMBER_NUMBER.yaml
    
  2. 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
    
  3. 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
    
  4. Di shell Anda, pada direktori root, gunakan snapshot.db untuk memulihkan dlld data:

    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 {i>etcd<i} di Direktori /kube-etcd-MEMBER_NUMBER.etcd.

  5. Di shell Anda, hapus data etcd yang lama:

    rm -r var/lib/etcd/*
    
  6. Di shell Anda, salin data etcd yang dipulihkan ke lokasi permanennya:

    cp -r kube-etcd-MEMBER_NUMBER.etcd/* var/lib/etcd/
    
  7. Di shell Anda, hapus direktori etcd sementara dan file cadangan:

    rm -R kube-etcd-MEMBER_NUMBER.etcd/
    rm snapshot.db
    
  8. Di shell, masukkan exit untuk keluar dari shell.

  9. 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 harus memulai ulang beberapa komponen cluster.

  1. Mulai ulang Pod di StatefulSet kube-etcd:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG rollout restart statefulset \
    --namespace USER_CLUSTER_NAME kube-etcd
    
  2. Mulai server Kubernetes API untuk cluster pengguna Anda:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG scale statefulset --replicas 3 \
    --namespace USER_CLUSTER_NAME kube-apiserver
    
  3. Mulai Deployment pemeliharaan etcd untuk cluster pengguna:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG scale deployment --replicas 1 \
    --namespace=USER_CLUSTER_NAME  gke-master-etcd-maintenance
    
  4. 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 ketersediaan tinggi (HA) cluster pengguna.

Untuk cluster pengguna HA, ada tiga node di cluster pengguna yang berfungsi sebagai bidang kontrol untuk cluster pengguna. Masing-masing {i>node<i} tersebut menjalankan Pod {i>etcd<i} yang mempertahankan data dll. pada volume penyimpanan.

Jika dua Pod dll. yang sehat, dan data pada penyimpanan terkait volume masih utuh, maka tidak perlu menggunakan file cadangan. Hal itu karena Anda masih memiliki kuorum dll.

Dalam kasus yang jarang terjadi, jika dua volume penyimpanan {i>etcd<i} merusak data, Anda akan perlu menggunakan file cadangan untuk memulihkan data {i>etcd<i}.

Untuk melakukan langkah-langkah di bagian ini, Anda harus sudah membuat snapshot.db seperti yang dijelaskan dalam Mencadangkan cluster pengguna.

Membuat daftar Pod dan node Anda

  1. Buat daftar Pod dll. beserta node-nya masing-masing:

    kubectl get pod --kubeconfig USER_CLUSTER_KUBECONFIG \
     -n kube-system -l component=etcd,tier=control-plane -o wide
    

    Output menunjukkan Pod dll. dan node tempat Pod dijalankan. Node yang ditampilkan pada 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
    
  2. Catat nama Pod dan nama node bidang kontrol untuk nanti.

    Perhatikan bahwa setiap Pod dll diberi nama etcd-xxx dan ditambahkan dengan nama node. Hal ini dikarenakan dalam Controlplane V2, pod etcd berjalan sebagai pod statis.

Bersiap untuk memulihkan

  1. Jalankan scp untuk menyalin file cadangan snapshot.db ke semua node bidang kontrol pengguna:

    scp -i NODE_NAME.key ~/snapshot.db ubuntu@NODE_EXTERNAL_IP:/tmp/
    
  2. Salin rahasia ke masing-masing node bidang kontrol pengguna:

    chmod a+rw ~/pki_*
    scp -ri NODE_NAME.key ~/pki_NODE_NAME/* ubuntu@NODE_EXTERNAL_IP:/opt/data/etc/kubernetes/pki/
    
  3. Masukkan shell ke node bidang kontrol pengguna:

    ssh -i NODE_NAME.key ubuntu@NODE_EXTERNAL_IP
    

Melakukan pemulihan

  1. Panggil kembali name of the etcd Pod dan nama node tempat Pod berjalan.

  2. Di shell, hentikan server Kubernetes API dan server etcd di semua node bidang kontrol pengguna:

    sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /etc/kubernetes/manifests/etcd.yaml ~
    
  3. Di shell, gunakan snapshot.db untuk memulihkan data etcd di 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 image
    • NODE_NAME adalah nama node tempat pemulihan dilakukan
    • NODE_IP_ADDRESS adalah IP dari node yang dimaksud
    • Isi NODE1, NODE2, NODE3 dan IP dari node masing-masing untuk flag --initial-cluster. Anda juga bisa mendapatkannya dari manifes dll.
  4. Tambahkan flag - --initial-cluster-state=existing dalam file manifes etcd pada perintah container.

    Contoh:

    containers:
          - command:
            - etcd
            ...
            - --initial-cluster-state=existing
            ...

Memulai ulang komponen

  1. Di shell, mulai server kube-apiserver dan etcd di semua node bidang kontrol pengguna:

    sudo mv ~/etcd.yaml ~/kube-apiserver.yaml /etc/kubernetes/manifests/
    
  2. Di shell, masukkan exit untuk keluar dari shell.

  3. Pastikan kube-apiserver dan etcd 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

  • Setel BACKUP_DIR ke jalur tempat Anda ingin menyimpan admin dan pengguna pencadangan cluster. Jalur ini tidak boleh ada.
  • Tetapkan ADMIN_CLUSTER_KUBECONFIG ke jalur kubeconfig cluster admin file
  • 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 bidang kontrol admin layanan.
  • Tetapkan SSH_PRIVATE_KEY ke jalur kunci SSH.
  • Jika Anda menggunakan jaringan pribadi, setel JUMP_IP ke jump jaringan Anda menggunakan alamat IP server 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

  • Setel BACKUP_DIR ke jalur tempat Anda ingin menyimpan admin dan pengguna pencadangan cluster. Jalur ini tidak boleh ada.
  • Tetapkan ADMIN_CLUSTER_KUBECONFIG ke jalur kubeconfig cluster admin file
  • Tetapkan USER_CLUSTER_KUBECONFIG ke jalur kubeconfig cluster pengguna Anda.
  • Tetapkan EXTERNAL_IP ke VIP yang Anda pesan untuk bidang kontrol admin layanan.
  • Tetapkan SSH_PRIVATE_KEY ke jalur kunci SSH.
  • Jika Anda menggunakan jaringan pribadi, setel JUMP_IP ke jump jaringan Anda menggunakan alamat IP server 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