Backup và Restore cluster BKE với Velero

Tổng quan về Velero

Velero là một công cụ mã nguồn mở phổ biến có thể cung cấp cho cụm Kubernetes tính năng như sau:

  • Sao lưu tài nguyên và snapshot volume cụm Kubernetes
  • Khôi phục các tài nguyên và snapshot volume cụm Kubernetes
  • Di chuyển tài nguyên và snapshot volume cụm Kubernetes sang một cụm Kubernetes mới
  • Lập lịch sao lưu cụm Kubernetes

Velero và Bizfly Cloud Kubernetes Engine

Khi sao lưu tài nguyên ở BKE thì sẽ sao lưu lại 2 thành phần:

  • Các tài nguyên của Kubernetes (deployments/pod/statefulset/configmap/secret/…) được lưu trữ tại ETCD
  • Các dữ liệu của ứng dụng được lưu trữ trong các PV

Trong BKE, dữ liệu Kubernetes được lưu trong etcd được quản lý bởi Bizfly Cloud và chỉ có thể truy cập thông qua API Server của Kubernetes. Velero tận dụng API Kubernetes để lấy dữ liệu này từ ETCD.

Velero cũng hỗ trợ snapshot PV và khôi phục lại cùng dữ liệu của cụm.

Các hoạt động sao lưu và khôi phục là một tài nguyên Kubernetes Custom Resource Definition (CRD) và được quản lý bởi bộ điều khiển xử lý các đối tượng CRD này để thực hiện sao lưu, khôi phục và tất cả các hoạt động liên quan. Khi tạo các đối tượng CRD sao lưu và khôi phục này, bạn có thể chỉ định các tùy chỉnh sau:

  • Chọn lọc tài nguyên sao lưu: Velero cho phép hạn chế phạm vi sao lưu hoặc khôi phục lọc theo namespace, loại đối tượng hoặc nhãn. Khi khôi phục, bạn cũng có thể lọc bằng cách loại trừ các vùng tên và loại đối tượng.
  • Lập lịch sao lưu theo thời gian mong muốn
  • Lựa chọn thời gian tồi tại sao lưu

Quy trình sao lưu và khôi phục

Velero bao gồm hai thành phần:

  • 01 pod Velero server chạy trong cụm BKE
  • Client dòng lệnh (Velero CLI) chạy cục bộ tại máy KH

Mỗi khi chúng ta thực hiện một bản sao lưu trên một cụm BKE, Velero thực hiện sao lưu tài nguyên của cụm theo cách sau:

  1. CLI Velero gọi API server Kubernetes để tạo một đối tượng CRD sao lưu.

  2. Bộ điều khiển sao lưu:

    2.1. Kiểm tra phạm vi của đối tượng CRD sao lưu, tức là nếu chúng ta đặt bộ lọc.

    2.2. Truy vấn API server cho các tài nguyên cần sao lưu.

    2.3. Nén các đối tượng Kubernetes đã lấy được thành một tệp .tar và lưu nó vào Simple Storage.

image

Tương tự, mỗi khi chúng ta thực hiện một thao tác khôi phục:

  1. CLI Velero gọi API server Kubernetes để tạo một CRD khôi phục sẽ khôi phục từ một bản sao lưu hiện có.

  2. Bộ điều khiển khôi phục:

    2.1. Xác thực đối tượng CRD khôi phục.

    2.2. Gọi Amazon S3 để lấy tệp sao lưu.

    2.3. Khởi động thao tác khôi phục.

image

Velero cũng thực hiện việc sao lưu và khôi phục bất kỳ PV nào trong phạm vi sao lưu:

  • Nếu bạn đang sử dụng Bizfly Cloud Block Storage (Volume), Velero sẽ tạo snapshot Voume cho các PV.

  • Đối với bất kỳ loại Volume nào khác (ngoại trừ hostPath), hãy sử dụng tích hợp Restic của Velero để thực hiện sao lưu ở cấp tệp nội dung của các Volume của bạn. Tại thời điểm viết bài, Restic đang ở giai đoạn Beta, do đó không được khuyến nghị cho việc sao lưu ở quy mô production.

Các bước thực hiện

Phần này trình bày cách sử dụng Velero để sao lưu ứng dụng trong một cụm và khôi phục ứng dụng trong cụm khác.

Chuẩn bị

Để thực hiện theo các bước như trên, cần chuẩn bị các thành phần sau: - Velero client - Kubctl - 1 đến 2 cluster (tùy thuộc muốn khôi phục cụm cũ hoặc di chuyển sang cụm mới) - Bucket Simple Storage của Bizfly Cloud

Lưu ý, khi di chuyển sang cụm mới thì cluster cũng cần nằm cùng tài khoản, project, và region.

Tạo bucket Simple storage

  1. Vào dashboard của dịch vụ S3 và thực hiện tạo bucket s3. https://manage.bizflycloud.vn/simple-storage/storage
  2. Tạo access key https://manage.bizflycloud.vn/simple-storage/access-key

Cài đặt Velero

Velero client

  1. Sử dụng câu lệnh sau để cài velero client (linux):
wget https://github.com/vmware-tanzu/velero/releases/download/v1.15.0/velero-
v1.15.0-linux-amd64.tar.gz
tar xf velero-v1.15.0-linux-amd64.tar.gz
cp ./velero-v1.15.0-linux-amd64/velero /usr/local/bin/

image

  1. Tạo file access-key
vim ~/credentials-velero
[default]
aws_access_key_id = <YOUR_ACCESS_KEY>
aws_secret_access_key = <YOUR_SECRET_KEY>

image

Velero server

Lưu ý: cần export môi trường cho KUBECONFIG trước khi thực hiện cài velero.

velero install \
	--provider aws \
	--plugins velero/velero-plugin-for-aws:v1.2.1 \
	--bucket quantest \
	--secret-file ~/credentials-velero \
	--use-volume-snapshots=true \
   --backup-location-config region=HN,s3ForcePathStyle="true",s3Url=https://hn.ss.bfcplatform.vn \
	--use-node-agent \
	--snapshot-location-config region=HN \
	--features=EnableCSI

Kiểm tra cài đặt velero:

kubectl get pod -n velero

image

Tạo tài nguyên thử nghiệm

Tạo nginx với manifest sau

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx2
spec:
  replicas: 2
  selector:
	matchLabels:
  	app: nginx2
  template:
	metadata:
  	labels:
    	app: nginx2
	spec:
  	containers:
  	- name: nginx
    	image: nginx:latest
    	ports:
    	- containerPort: 80
    	resources:
      	limits:
        	cpu: "300m"
        	memory: "300Mi"
      	requests:
        	cpu: "200m"
        	memory: "200Mi"
    	volumeMounts:
    	- name: nginx-storage
      	mountPath: /usr/share/nginx/html  # Path inside the container where the PVC will be mounted
  	volumes:
  	- name: nginx-storage
    	persistentVolumeClaim:
      	claimName: example-pvc  # Name of the PVC to use
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc2
spec:
  ports:
  - port: 80
	targetPort: 80
	protocol: TCP
	name: http
  selector:
	app: nginx2
  type: ClusterIP
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: example-pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
	requests:
  	storage: 4Gi
  storageClassName: premium-hdd1

Để kiểm tra các StorageClass mà Bizfly Cloud Kubernetes Engine, ta có thể dùng lệnh sau:

kubectl get sc

Sau đấy ta cần phải apply file trên.

image

Kiểm tra pod nginx và pv/pvc vừa tạo

kubectl get pod
kubectl get pvc
kubectl get pv

image

Exec vào pod tạo 1 file tại vị trí đã mount PV

kubectl exec -it <namepod> -- bash

image

Tạo 1 file tại vị trí đã mount PV

image

Thực hiện backup

Tạo 1 bản backup sử dụng lệnh

velero backup create cluster-pvc-1

image

Kiểm tra backup

image

image

Như ta thấy đã backup thành công.

Có thể xem lại trên S3

image

Restore cluster

Lưu ý: Velero sẽ kiểm tra các tài nguyên của cụm khi thực hiện restore để quyết định xem có restore tài nguyên đó không, điều đó có nghĩa là nếu vẫn còn tài nguyên deployment nginx như trên thì sẽ không restore lại trạng thái cũ của tài nguyên

Ví dụ: Tại thời điểm A thực hiện backup - nginx version đang là 1.20.6 - Volume PVC đang có chỉ có 01 file tên là test có nội dung “xxx”

Sang tới thời điểm B (B > A) - Bạn tự nâng version nginx lên 1.21.1 - Volume PVC có thêm file test2 có nội dung “yyy”

Khi thực hiện restore về thời điểm A thì sẽ không đưa nginx về version 1.20.6 và nội dung trong PV về chỉ có file test mà sẽ giữ nguyên tài nguyên của cluster

Muốn restore lại về thời điểm A cần loại bỏ deployment nginx và PV mount tại thời điểm đó

Lưu ý quan trọng: vì snapshot gắn liền với volume nên khi xóa PV thì snapshot cũng bị xóa cùng, nếu muốn lưu lại Volume sau khi xóa PV/PVC thì cần chuyển persistentVolumeReclaimPolicy từ Delete thành Retain.

Thao tác như sau:

kubectl edit pv <pvname> 

image

image

Để Restore thành công ta sẽ xóa deployment toàn bộ manifest vừa tạo ở trên (sau khi chuyển reclaim policy về retain)

Để xóa deployment:

kubectl delete deployment <namedeployment>

image

Sử dụng lệnh sau để restore bản backup:

velero restore create --from-backup cluster-pvc-1

Kiểm tra với lệnh:

velero describe restore cluster-pvc-1-20241119160502

image

Kiểm tra lại tài nguyên sau khi backup:

image

Ta có thể thấy các tài nguyên được khôi phục lại tráng thái cũ và volume cũng được tạo lại từ snapshot có đủ thông tin khi backup

Di chuyển Cluster

Để di chuyển cluster A sang cluster B, ta cần tạo cluster ở cùng project và region

Tại cluster B, ta cũng cần tạo lại velero server sử dụng lệnh tương tự

velero install \
	--provider aws \
	--plugins velero/velero-plugin-for-aws:v1.2.1 \
	--bucket quantest \
	--secret-file ~/credentials-velero \
	--use-volume-snapshots=true \
	--backup-location-config region=HN,s3ForcePathStyle="true",s3Url=https://hn.ss.bfcplatform.vn \
	--use-node-agent \
	--snapshot-location-config region=HN \
	--features=EnableCSI

Sau khi cài xong ta sẽ get được các bảo sao lưu và khôi phục từ đó:

velero backup get

image

Kiểm tra cluster không có tài nguyên:

image

Thực hiện khôi phục

velero restore create --from-backup cluster-pvc-1

image

Kiểm tra với lệnh:

velero restore describe cluster-pvc-1-20241119163702

image

Kiểm tra tài nguyên

image

image

Ta có thể thấy cụm mới tạo đã được tạo lại toàn bộ tài nguyên và volume từ snapshot giống như cụm cũ.