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:
-
CLI Velero gọi API server Kubernetes để tạo một đối tượng CRD sao lưu.
-
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.
Tương tự, mỗi khi chúng ta thực hiện một thao tác khôi phục:
-
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ó.
-
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.
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
- 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
- Tạo access key https://manage.bizflycloud.vn/simple-storage/access-key
Cài đặt Velero
Velero client
- 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/
- Tạo file access-key
vim ~/credentials-velero
[default]
aws_access_key_id = <YOUR_ACCESS_KEY>
aws_secret_access_key = <YOUR_SECRET_KEY>
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
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.
Kiểm tra pod nginx và pv/pvc vừa tạo
kubectl get pod
kubectl get pvc
kubectl get pv
Exec vào pod tạo 1 file tại vị trí đã mount PV
kubectl exec -it <namepod> -- bash
Tạo 1 file tại vị trí đã mount PV
Thực hiện backup
Tạo 1 bản backup sử dụng lệnh
velero backup create cluster-pvc-1
Kiểm tra backup
Như ta thấy đã backup thành công.
Có thể xem lại trên S3
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>
Để 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>
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
Kiểm tra lại tài nguyên sau khi backup:
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
Kiểm tra cluster không có tài nguyên:
Thực hiện khôi phục
velero restore create --from-backup cluster-pvc-1
Kiểm tra với lệnh:
velero restore describe cluster-pvc-1-20241119163702
Kiểm tra tài nguyên
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ũ.