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:

Velero Docs - Pencadangan Sistem File

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.