Mencadangkan dan memulihkan cluster admin

Dokumen ini menunjukkan cara mencadangkan dan memulihkan penyimpanan etcd untuk admin cluster yang dibuat dengan Google Distributed Cloud (khusus software) untuk VMware. Dokumen ini juga menyediakan skrip yang dapat digunakan untuk secara otomatis mencadangkan{i> etcd store<i} cluster. Anda juga dapat pencadangan dan pemulihan cluster admin menggunakan gkectlalat command line.

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 pencadangan dan pemulihan yang dijelaskan dalam dokumen ini memiliki hal berikut 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 admin

Cadangan cluster admin berisi hal berikut:

  • Snapshot cluster admin dll.
  • Rahasia bidang kontrol Admin, yang diperlukan untuk melakukan otentikasi ke admin dan cluster pengguna.

Selesaikan langkah-langkah berikut sebelum Anda membuat cadangan cluster admin:

  1. Temukan alamat IP eksternal cluster admin, yang digunakan untuk melakukan SSH ke bidang kontrol cluster admin:

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] get nodes -n kube-system -o wide | grep master

    dengan [ADMIN_CLUSTER_KUBECONFIG] adalah kubeconfig cluster admin .

  2. Buat kunci SSH bernama vsphere_tmp dari kunci pribadi cluster admin.

    Anda dapat menemukan kunci pribadi dari Secrets cluster admin:

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] get secrets sshkeys -n kube-system -o yaml

    Pada output perintah, Anda dapat menemukan kunci pribadi di vsphere_tmp kolom tersebut.

    Salin kunci pribadi ke vsphere_tmp:

    echo "[PRIVATE_KEY]" | base64 -d > vsphere_tmp; chmod 600 vsphere_tmp
  3. Pastikan Anda dapat berpindah ke bidang kontrol admin menggunakan kunci pribadi ini:

    ssh -i vsphere_tmp ubuntu@[EXTERNAL_IP]
    
  4. Keluar dari container:

    exit

Mencadangkan penyimpanan etcd cluster admin

Untuk mencadangkan penyimpanan etcd cluster admin:

  1. Dapatkan nama Pod dll.:

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] get pods \
        -n kube-system -l component=etcd,tier=control-plane -ojsonpath='{$.items[*].metadata.name}{"\n"}'
  2. Shell ke dalam container kube-etcd Pod:

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG]  exec -it \
        -n kube-system [ADMIN_ETCD_POD] -- bin/sh

    dengan [ADMIN_ETCD_POD] adalah nama Pod dll.

  3. Dari shell, gunakan etcdctl untuk membuat cadangan bernama snapshot.db di direktori lokal:

    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/snapshot.db
    
  4. Keluar dari container:

    exit
  5. Salin cadangan dari container kube-etcd menggunakan kubectl cp:

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] cp \
    kube-system/[ADMIN_ETCD_POD]:tmp/snapshot.db [RELATIVE_DIRECTORY]
    

    dengan [RELATIVE_DIRECTORY] adalah jalur tempat Anda ingin menyimpan cadangan Anda.

Mencadangkan Secret cluster admin

Untuk mencadangkan Secret bidang kontrol admin:

  1. Gunakan SSH untuk terhubung ke node bidang kontrol admin:

    ssh -i vsphere_tmp ubuntu@EXTERNAL_IP
    

    Ganti EXTERNAL_IP dengan bidang kontrol admin alamat IP eksternal, yang telah Anda catat sebelumnya.

  2. Opsional, tetapi sangat direkomendasikan: Buat direktori cadangan lokal.

    Anda perlu mengubah Secret cadangan izin untuk menyalinnya dari {i>node<i}.

    mkdir backup
  3. Salin Secret secara lokal ke direktori cadangan lokal:

    sudo cp -r /etc/kubernetes/pki/* backup/
  4. Ubah izin Secret cadangan:

    sudo chmod -R a+rX backup/
  5. Keluar dari node bidang kontrol admin:

    exit
  6. Jalankan scp untuk menyalin folder cadangan dari node bidang kontrol admin:

    sudo scp -r -i vsphere_tmp  ubuntu@EXTERNAL_IP:backup/ RELATIVE_DIRECTORY
    

    Ganti RELATIVE_DIRECTORY dengan jalur yang Anda lalui ingin menyimpan cadangan Anda.

Memulihkan cluster admin

Prosedur berikut membuat ulang cluster admin yang dicadangkan dan semua pengguna bidang kontrol yang dikelolanya ketika {i>snapshot <i}etcd-nya dibuat.

  1. Jalankan scp untuk menyalin snapshot.db ke bidang kontrol admin:

    sudo scp -i vsphere_tmp snapshot.db ubuntu@[EXTERNAL_IP]:

    dengan [EXTERNAL_IP] adalah IP eksternal bidang kontrol admin yang Anda kumpulkan sebelumnya.

  2. Masuk ke bidang kontrol admin:

    sudo ssh -i vsphere_tmp ubuntu@[EXTERNAL_IP]
    
  3. Salin snapshot.db/ ke /mnt:

    sudo cp snapshot.db /mnt/
  4. Buat direktori sementara, seperti backup:

    mkdir backup
  5. Keluar dari bidang kontrol admin:

    exit
  6. Salin sertifikat ke backup/:

    sudo scp -r -i vsphere_tmp [BACKUP_CERT_FILE] ubuntu@[EXTERNAL_IP]:backup/
  7. Masuk ke node bidang kontrol admin:

    ssh -i vsphere_tmp ubuntu@[EXTERNAL_IP]
    

    dengan [EXTERNAL_IP] adalah IP eksternal bidang kontrol admin yang Anda kumpulkan sebelumnya.

  8. Hentikan kube-etcd dan kube-apiserver.

    sudo mv /etc/kubernetes/manifests/etcd.yaml /tmp/etcd.yaml
    sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/kube-apiserver.yaml
  9. Salin Secret cadangan ke /etc/kubernetes/pki/:

    sudo cp -r backup/* /etc/kubernetes/pki/
  10. Jalankan etcdctl restore dengan Docker:

    sudo docker run --rm \
    -v '/mnt:/backup' \
    -v '/var/lib/etcd:/var/lib/etcd' --env ETCDCTL_API=3 'gcr.io/gke-on-prem-release/etcd-util:GKE_ON_PREM_VERSION' /bin/sh -c "etcdctl snapshot restore '/backup/snapshot.db'; rm -r /var/lib/etcd/*; mv /default.etcd/member/ /var/lib/etcd/"
  11. Mulai ulang kube-etcd dan kube-apiserver.

    sudo mv /tmp/etcd.yaml /etc/kubernetes/manifests/etcd.yaml
    sudo mv /tmp/kube-apiserver.yaml /etc/kubernetes/manifests/kube-apiserver.yaml
  12. Verifikasi bahwa kube-etcd dan kube-apiserver telah dimulai.

    sudo crictl ps -a
  13. Salin /etc/kubernetes/admin.conf ke folder .kube agar dapat diakses dari workstation admin:

    mkdir -p [HOME]/.kube
    sudo cp -i /etc/kubernetes/admin.conf [HOME]/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
  14. Keluar dari bidang kontrol admin:

    exit
  15. Salin file kubeconfig yang baru dibuat dari node admin:

    sudo scp -i vsphere_tmp ubuntu@[EXTERNAL_IP]:[HOME]/.kube/config kubeconfig
    sudo chown $(id -u):$(id -g) kubeconfig

    dengan:

    • [EXTERNAL_IP] adalah alamat IP eksternal bidang kontrol admin.
    • [HOME] adalah direktori utama pada node admin.

    Sekarang Anda dapat menggunakan file kubeconfig baru ini untuk mengakses cluster yang dipulihkan.

Memecahkan masalah pemulihan cluster admin

Jika mengalami masalah saat memulihkan cluster admin, Anda harus menghubungi Dukungan Google untuk menyelesaikan masalah tersebut dengan cluster admin.

Sementara itu, Anda dapat memeriksa hal berikut untuk memecahkan masalah lebih lanjut.

  1. Menemukan ID penampung etcd

    sudo crictl ps -a | grep [ADMIN_ETCD_POD]

    dengan [ADMIN_ETCD_POD] adalah nama Pod dll.

  2. Memeriksa log dari container dll

    sudo crictl logs [ETCD_CONTAINER_ID]

    dengan [ETCD_CONTAINER_ID] adalah ID container etcd.

  3. Cari pesan log izin akses yang ditolak berikut, seperti:

    etcdserver: create snapshot directory error:mkdir /var/lib/etcd/member/snap: permission denied

  4. Jika ditemukan pesan izin yang ditolak, perbarui kepemilikan {i> /opt/data/var/lib/etcd/<i}

    sudo chown -R 2001:2001 /opt/data/var/lib/etcd/

  5. Verifikasi bahwa kube-etcd dan kube-apiserver telah dimulai.

    sudo crictl ps

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 pembaruan Anda menjalankan skrip, isi nilai untuk lima variabel di awal naskah:

  • 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 /tmp/${USER_CLUSTER_NAMESPACE}_snapshot.db"
kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} cp ${USER_CLUSTER_NAMESPACE}/kube-etcd-0:tmp/${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 a+rX /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_snapshot.db"
kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} cp -n kube-system ${admin_etcd}:tmp/admin_snapshot.db $BACKUP_DIR/admin-cluster_snapshot.db

Langkah selanjutnya