https://www.roksblog.de/kubernetes-backup-with-velero/
Begitu Anda telah menyiapkan kluster Kubernetes dan menyebarkan beberapa kontainer, muncul pertanyaan tentang cara membuat cadangan. Alat yang sangat berguna dan nyaman untuk ini adalah Velero . Alat ini dapat dengan mudah diinstal melalui HELM dan Anda dapat membuat cadangan dan memulihkan dengan dua perintah tunggal. Penting untuk dicatat bahwa Velero membuat snapshot dari PV (volume persisten) secara default dan tidak semua kelas penyimpanan mendukung ini. Misalnya kelas penyimpanan nfs-subdir-external-provisioner atau K3S local-path tidak mendukung snapshot. Saya akan menggunakan K3s dan kelas penyimpanan local-path dalam tutorial saya. Untuk ini Velero menawarkan kemungkinan untuk membuat cadangan PV melalui RESTIC dan Kopia. Untuk informasi lebih lanjut baca di sini:
Anda hanya perlu mengaktifkannya selama pengaturan. Namun, akan dibahas lebih lanjut nanti. Anda dapat menjadwalkan pencadangan, mengatur periode penyimpanan, dan banyak lagi. Semua pencadangan disimpan dalam bucket S3. Jadi, Anda dapat menyewa penyimpanan cloud atau menjalankan server MinIO kecil secara lokal.
Harap perhatikan bahwa saya menjalankan ini di jaringan lokal saya, tetapi Anda tentu saja dapat menjalankannya di VPS atau instans Cloud Anda. Namun, pastikan untuk menggunakan HTTPS dengan sertifikat tepercaya dan beberapa kata sandi yang sangat kuat serta mekanisme tambahan untuk memastikan keamanan dan integritas cadangan Anda! Mari kita mulai dengan pengaturan penyimpanan S3.
Pengaturan dan pemasangan penyimpanan S3 Backup
Selama penyimpanan Anda kompatibel dengan S3, Anda dapat menautkannya ke Velero. Kami memiliki berbagai opsi di sini. Salah satu yang terkecil dan paling sederhana adalah menjalankan MinIO pada beberapa VM. Saya tidak akan merekomendasikan ini untuk produksi, tetapi tergantung pada ukuran kontainer Anda, mungkin tidak masalah. Dalam kasus saya, saya menjalankan server TrueNAS Scale kecil. Anda dapat melihat cara saya menginstalnya di posting Blog ini . Di sini, kita dapat dengan mudah mengaktifkan penyimpanan S3. Omong-omong, ini juga akan memulai server MinIO. Untuk mengaturnya, saya hanya mengikuti panduan resmi TrueNAS Scale S3 . Untuk ini, tentu saja kita memerlukan kumpulan data. Jadi, kita masuk ke TrueNAS Scale dan pertama-tama membuat kumpulan data baru yang bersih. Untuk ini, kita masuk ke Penyimpanan, pilih 3 titik di sebelah zpool kita, dan klik "Tambahkan Kumpulan Data":
Saya menyebutnya "minio" dan menerima semua pengaturan default. Setelah kita memiliki kumpulan data, kita perlu mengaktifkan layanan S3. Untuk ini, kita masuk ke Pengaturan Sistem -> Layanan. Di sini kita pilih ikon pena di sisi kanan di samping S3:
Di sini kita perlu memilih dataset yang baru saja kita buat, mengonfirmasi pesan peringatan, serta memasukkan kunci akses dan kunci rahasia. Catat keduanya karena kita akan membutuhkannya nanti untuk masuk ke konsol MinIO dan juga untuk mengonfigurasi Velero. Untuk mengaktifkan HTTPS, yang sangat saya rekomendasikan, pilih sertifikat default dari menu tarik-turun, pilih sertifikat valid yang Anda impor sebelumnya, dan masukkan IP server TrueNAS Anda di kolom URI. Untuk tutorial ini, kita tidak akan menggunakan HTTPS. Terakhir, kita klik simpan dan aktifkan layanan S3. Sebaiknya centang kotak "Mulai Secara Otomatis".
Sekarang kita buat bucket yang disebut "velero". Untuk ini, kita masuk ke Konsol MinIO di server TrueNAS kita. MinIO berjalan pada port 9000 / 9001. Dalam kasus saya, port tersebut adalah:
http://192.168.2.2:9000
Kami masuk menggunakan akses dan kunci rahasia yang baru saja kami konfigurasikan di TrueNAS WebUI.
Di Konsol MinIO kita klik Bucket dan Buat Bucket
Mari kita lihat apakah kita dapat terhubung ke bucket S3. Untuk ini kita akan menggunakan awscli
sudo yum -y install awscli
Untuk mengkonfigurasi awscli kita jalankan
aws configure --profile=truenas
Wizard sekarang akan meminta akses dan kunci rahasia. Kami menerima default untuk Region dll. dengan hanya menekan ENTER
[vagrant@rocky8-k3s ~]$ aws configure --profile=truenas
AWS Access Key ID [None]: B9A6AC13381DAC41BAD
AWS Secret Access Key [None]: 42D75A75B3
Default region name [None]:
Default output format [None]:
Sekarang kita dapat membuat daftar isi bucket S3 dengan menjalankan
aws --profile=truenas --endpoint=http://192.168.2.2:9000 s3 ls s3://velero
Jangan kaget. Kosong. :)
Prasyarat untuk Velero
Berikutnya kita perlu membuat file kredensial S3 .credentials-velero dengan konten berikut:
cat > .credentials-velero << EOF
[default]
aws_access_key_id = B9A6AC13381DAC41BAD
aws_secret_access_key = <your secret key>
EOF
Velero akan menggunakan ini untuk mengautentikasi terhadap bucket S3. Untuk berinteraksi dengan Velero, kita perlu mengunduh biner Velero. Biner ini tersedia untuk berbagai platform dalam bentuk file tar.
Rilis terbaru dapat ditemukan di sini: https://github.com/vmware-tanzu/velero/releases/latest
Pada saat penulisan ini adalah v1.95.
wget https://github.com/vmware-tanzu/velero/releases/download/v1.95/velero-v1.95-linux-amd64.tar.gz
Ekstrak dan pindahkan biner "velero" ke folder /usr/local/bin
tar xvzf velero-v1.9.5-linux-amd64.tar.gz
sudo mv velero-v1.9.5-linux-amd64/velero /usr/local/bin/
Velero mengharapkan berkas kubeconfig dengan hak istimewa ClusterAdmin. Jadi, sebaiknya lakukan ini pada mesin yang sudah terinstal dan terkonfigurasi kubectl. Jika belum, silakan instal dan konfigurasikan kubectl. Cara yang sangat mudah dan praktis adalah menggunakan Arkade . Dalam kasus K3S, kita perlu mengatur jalur ke berkas kubeconfig.
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
Instal Velero
Sekarang kita siap untuk menginstal Velero. Untuk ini kita tambahkan repo Velero HELM dan instal grafiknya:
helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts
helm repo update
helm install velero vmware-tanzu/velero \
--namespace velero \
--create-namespace \
--set-file credentials.secretContents.cloud=./.credentials-velero \
--set configuration.provider=aws \
--set configuration.backupStorageLocation.name=default \
--set configuration.backupStorageLocation.bucket=velero \
--set configuration.backupStorageLocation.config.region=None \
--set configuration.backupStorageLocation.config.s3ForcePathStyle=true \
--set configuration.backupStorageLocation.config.s3Url=http://192.168.2.2:9000 \
--set configuration.defaultVolumesToFsBackup=true \
--set snapshotsEnabled=false \
--set deployNodeAgent=true \
--set initContainers[0].name=velero-plugin-for-aws \
--set initContainers[0].image=velero/velero-plugin-for-aws:latest \
--set initContainers[0].imagePullPolicy=IfNotPresent \
--set initContainers[0].volumeMounts[0].mountPath=/target \
--set initContainers[0].volumeMounts[0].name=plugins
Sekarang pantau penyebaran pod
[vagrant@rocky8-k3s ~]$ kubectl get pods -n velero
NAME READY STATUS RESTARTS AGE
node-agent-tvssj 1/1 Running 0 50s
velero-576fb78ffb-747p9 1/1 Running 0 50s
Jika karena alasan apa pun pod tidak memulai atau bekerja seperti yang diharapkan, periksa log
kubectl logs deployment/velero -n velero
Jika semuanya sudah aktif dan berjalan, verifikasi versi klien dan server Anda cocok
[vagrant@rocky8-k3s ~]$ velero version
Client:
Version: v1.9.5
Git commit: 2b5281f38aad2527f95b55644b20fb169a6702a7
Server:
Version: v1.10.0
# WARNING: the client version does not match the server version. Please update client
Dalam kasus saya, versi klien tidak cocok. Untuk beberapa alasan, tautan terbaru Github tidak mengarah ke rilis terbaru. Jadi, saya segera menginstal versi v1.10.0
wget https://github.com/vmware-tanzu/velero/releases/download/v1.10.0/velero-v1.10.0-linux-amd64.tar.gz
tar xvzf velero-v1.10.0-linux-amd64.tar.gz
sudo mv velero-v1.10.0-linux-amd64/velero /usr/local/bin/
Dan sekarang semuanya baik-baik saja
[vagrant@rocky8-k3s ~]$ velero version
Client:
Version: v1.10.0
Git commit: 367f563072659f0bcd809bc33507fd75cd722344
Server:
Version: v1.10.0
Untuk melihat konfigurasi Velero kita cukup menggunakan HELM
helm get values -n velero velero
Untuk melihat apa yang sebenarnya telah diterapkan, kita dapat menjalankannya
kubectl get all -n velero
Contoh
[vagrant@rocky8-k3s ~]$ kubectl get all -n velero
NAME READY STATUS RESTARTS AGE
pod/node-agent-tvssj 1/1 Running 0 12m
pod/velero-576fb78ffb-747p9 1/1 Running 0 12m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/velero ClusterIP 10.43.179.220 <none> 8085/TCP 12m
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/node-agent 1 1 1 1 1 <none> 12m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/velero 1/1 1 1 12m
NAME DESIRED CURRENT READY AGE
replicaset.apps/velero-576fb78ffb 1 1 1 12m
Sekarang dengan Velero yang terinstal sepenuhnya, kita dapat mulai menjalankan pekerjaan pencadangan pertama kita
Jalankan pekerjaan pencadangan
Kita dapat menjalankan pekerjaan cadangan untuk mencadangkan semua namespace
velero backup create all --wait
atau untuk mencadangkan namespace individual
velero backup create ghost --include-namespaces ghost --wait
dengan menekan "CTRL-C" atau menghilangkan "--wait", pekerjaan akan berjalan di latar belakang.
[vagrant@rocky8-k3s ~]$ velero backup create ghost --include-namespaces ghost --wait
Backup request "ghost" submitted successfully.
Waiting for backup to complete. You may safely press ctrl-c to stop waiting - your backup will continue in the background.
..
Backup completed with status: Completed. You may check for more information using the commands `velero backup describe ghost` and `velero backup logs ghost`.
[vagrant@rocky8-k3s ~]$ velero backup create all --wait
Backup request "all" submitted successfully.
Waiting for backup to complete. You may safely press ctrl-c to stop waiting - your backup will continue in the background.
........
Backup completed with status: Completed. You may check for more information using the commands `velero backup describe all` and `velero backup logs all`.
Setelah pekerjaan selesai, kita dapat menjalankan perintah tambahan untuk mendapatkan rincian lebih lanjut.
velero backup describe all
Untuk mendapatkan rincian lebih lanjut
velero backup describe all --details
Ini bisa sangat membantu jika suatu pekerjaan gagal atau muncul peringatan. Dalam kasus saya, kedua pekerjaan berhasil.
Pastikan untuk memeriksa output untuk baris seperti:
v1/PersistentVolume:
- pvc-7d4d2a56-e6b2-4fb4-a373-8116de67cae3
- pvc-95eb084e-6ddf-43d5-a22b-4ade78e0fd88
- pvc-c9e5facc-d414-4264-9d9c-7834a9446323
v1/PersistentVolumeClaim:
- ghost/data-roksblog-mysql-0
- ghost/roksblog-ghost
- plausible/data-plausible-analytics-postgresql-0
Ini memberi tahu kita bahwa volume dan klaim persisten telah berhasil dicadangkan.
Untuk mencantumkan semua cadangan yang dijalankan
velero backup get
Contoh
[vagrant@rocky8-k3s ~]$ velero backup get
NAME STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR
all Completed 0 0 2022-12-27 22:17:56 +0000 UTC 29d default <none>
ghost Completed 0 0 2022-12-27 22:17:44 +0000 UTC 29d default <none>
Secara default, kebijakan penyimpanan selama 30 hari diterapkan pada setiap cadangan. Ini berarti bahwa setelah 30 hari, cadangan akan dihapus secara otomatis! Anda dapat menyesuaikannya dengan menambahkan parameter "-ttl" ke perintah cadangan. Berikut ini akan menyimpan cadangan selama satu minggu:
velero backup create ghost-ttl7d --include-namespaces ghost --wait --ttl 168h0m0s
Jika sekarang kita membuat daftar isi bucket S3 kita, kita akan melihat ini:
[vagrant@rocky8-k3s ~]$ aws --profile=truenas --endpoint=http://192.168.2.2:9000 s3 ls s3://velero
PRE backups/
Dan di konsol MinIO
Sekarang setelah kita berhasil membuat cadangan, mari hancurkan penyebaran Ghost kita dan pulihkan.
Mengembalikan cadangan
Pertama kita uninstall chart Ghost HELM kita
[vagrant@rocky8-k3s ~]$ helm list -n ghost
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /etc/rancher/k3s/k3s.yaml
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /etc/rancher/k3s/k3s.yaml
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
roksblog ghost 8 2022-12-27 09:57:45.120724689 +0000 UTC deployed ghost-19.1.52 5.26.3
[vagrant@rocky8-k3s ~]$ helm uninstall roksblog -n ghost
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /etc/rancher/k3s/k3s.yaml
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /etc/rancher/k3s/k3s.yaml
release "roksblog" uninstalled
Kami juga akan menghapus namespace
[vagrant@rocky8-k3s ~]$ kubectl delete ns ghost
namespace "ghost" deleted
Sekarang kita mulai pemulihannya
velero restore create --from-backup ghost
Untuk memeriksa status pemulihan, kami menjalankan
velero restore describe ghost-20221227223404
Contoh
[vagrant@rocky8-k3s ~]$ velero restore describe ghost-20221227223404
Name: ghost-20221227223404
Namespace: velero
Labels: <none>
Annotations: <none>
Phase: Completed
Total items to be restored: 43
Items restored: 43
Started: 2022-12-27 22:34:04 +0000 UTC
Completed: 2022-12-27 22:34:05 +0000 UTC
Backup: ghost
Namespaces:
Included: all namespaces found in the backup
Excluded: <none>
Resources:
Included: *
Excluded: nodes, events, events.events.k8s.io, backups.velero.io, restores.velero.io, resticrepositories.velero.io, csinodes.storage.k8s.io, volumeattachments.storage.k8s.io, backuprepositories.velero.io
Cluster-scoped: auto
Namespace mappings: <none>
Label selector: <none>
Restore PVs: auto
Existing Resource Policy: <none>
Preserve Service NodePorts: auto
Seperti yang bisa kita lihat, ini sedang memulihkan pod
kubectl get pods -n ghost rocky8-k3s.fritz.box: Tue Dec 27 22:57:08 2022
NAME READY STATUS RESTARTS AGE
roksblog-ghost-686bc9d555-9zb29 0/1 Running 0 11s
roksblog-mysql-0 0/1 Running 0 11s
HELM juga mencantumkan grafik kami sebagai terpasang lagi
[vagrant@rocky8-k3s ~]$ helm list -n ghost
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /etc/rancher/k3s/k3s.yaml
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /etc/rancher/k3s/k3s.yaml
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
roksblog ghost 1 2022-12-27 22:55:02.709848568 +0000 UTC deployed ghost-19.1.52 5.26.3
Dan kita bisa menjelajahinya dengan baik
Jadwalkan pekerjaan Pencadangan
Kita dapat dengan mudah membuat beberapa jadwal pencadangan gaya cron dengan menjalankan:
# Daily Backups. Run the daily backup every day at 09:30. Please do note that the system runs on UTC time!!!
velero schedule create daily --schedule="30 09 * * *"
# Weekly Backups. Run the following backup job every Sunday at 10:30. Please do note that the system runs on UTC time!!!
velero schedule create weekly --schedule="30 10 * * 0" --include-cluster-resources=true
# Monthly Backups. Run the following backup job every 1st of the month at 20:30. Please do note that the system runs on UTC time!!! Keep the backups for 1 year.
velero schedule create monthly --schedule="30 22 1 * *" --include-cluster-resources=true --ttl 8064h0m0s
Saya sarankan untuk melakukan pencadangan harian, mingguan, dan bulanan dengan kebijakan penyimpanan individual. Disarankan juga untuk mencadangkan semua sumber daya klaster setidaknya seminggu sekali untuk tujuan DR. Jika Anda memerlukan bantuan untuk jadwal cron, lihat crontab.guru .
Dan tentu saja kita juga dapat melihat jadwal kita:
velero get schedule
Contoh
[vagrant@rocky8-k3s ~]$ velero get schedule
NAME STATUS CREATED SCHEDULE BACKUP TTL LAST BACKUP SELECTOR PAUSED
daily Enabled 2022-12-28 09:05:40 +0000 UTC 30 09 * * * 0s n/a <none> false
weekly Enabled 2022-12-28 09:05:40 +0000 UTC 30 10 * * 0 0s n/a <none> false
monthly Enabled 2022-12-28 09:22:02 +0000 UTC 30 22 1 * * 8064h0m0s n/a <none> false
Ini menunjukkan bahwa Velero sangat mudah dipasang, dikonfigurasi, dan digunakan. Dan tentu saja Anda juga dapat menggunakannya untuk pemulihan bencana. Kluster K8s Anda rusak? Tidak masalah. Buat kluster baru, cukup ikuti langkah-langkah yang sama untuk memasang Velero, arahkan ke penyimpanan S3 Anda, dan pulihkan cadangan Anda. Saya akan mengujinya di salah satu Blogpost saya berikutnya. Jadi, nantikan saja.
Tidak ada komentar:
Posting Komentar