Hướng dẫn Sống còn Kubernetes: Làm chủ Velero để Khôi phục Namespace và PV

DevOps tutorial - IT technology blog
DevOps tutorial - IT technology blog

Cơn ác mộng Namespace lúc 3 giờ sáng

Mọi chuyện xảy ra chỉ trong tích tắc. Một kỹ sư mệt mỏi chạy lệnh kubectl delete namespace prod trong khi định xóa dev. Trong vòng năm giây, các API production, cơ sở dữ liệu và ConfigMap của bạn biến mất. Dù pipeline CI/CD có thể triển khai lại mã ứng dụng, nó không thể hồi sinh dữ liệu. Nếu bạn mất 500GB dữ liệu người dùng tải lên hoặc trạng thái cụ thể của một database cũ, các manifest YAML sẽ không thể cứu bạn.

GitOps rất mạnh mẽ, nhưng nó không phải là một chiến lược sao lưu cho trạng thái (state). Nhiều đội ngũ cho rằng vì hạ tầng được định nghĩa bằng code nên họ được bảo vệ. Thực tế không phải vậy. Git định nghĩa cách cluster của bạn trông như thế nào, nhưng nó không nắm giữ các bit dữ liệu thực tế bên trong Persistent Volumes (PVs). Khi một vùng (region) đám mây gặp sự cố hoặc một volume bị hỏng, bạn cần một cách để khôi phục dữ liệu, chứ không chỉ là bản triển khai.

Tại sao sao lưu etcd là chưa đủ

Kubernetes được thiết kế theo hướng tạm thời (ephemeral) và phân tán. Không giống như VM truyền thống nơi bạn snapshot một ổ đĩa duy nhất, một ứng dụng K8s là một tập hợp phân mảnh của các Service, Secret và PVC trải rộng trên nhiều node khác nhau. Chỉ dựa vào việc sao lưu etcd là rất rủi ro và kém hiệu quả.

Khôi phục một bản snapshot etcd 200MB chỉ để lấy lại một namespace cụ thể là một việc làm quá mức cần thiết (overkill). Nó giống như dùng búa tạ để đập một hạt dẻ. Quan trọng hơn, etcd chỉ lưu trữ metadata. Nếu ổ đĩa EBS hoặc Azure Disk bên dưới thực sự biến mất, etcd không có bản ghi nào về dữ liệu thực tế. Đây chính là lúc Velero lấp đầy khoảng trống đó.

Velero: Tiêu chuẩn ngành về Khôi phục Cluster

Velero (trước đây là Heptio Ark) là công cụ hàng đầu cho vấn đề này. Nó giao tiếp trực tiếp với Kubernetes API để sao lưu tài nguyên, đồng thời kích hoạt snapshot trên nhà cung cấp lưu trữ của bạn. Điều này tạo ra một điểm khôi phục thống nhất, đóng gói cả cấu hình và dữ liệu cùng nhau.

Tôi đã triển khai Velero trên các cluster quản lý hàng trăm node và độ ổn định của nó rất ấn tượng. Khi bạn kích hoạt sao lưu, Velero sẽ lấy các định nghĩa YAML và yêu cầu nhà cung cấp đám mây—cho dù là AWS, GCP hay một instance MinIO cục bộ—snapshot các volume ngay lập tức.

Các thành phần cốt lõi

  • Velero Client: Công cụ CLI dùng để quản lý sao lưu.
  • Velero Server: Một tập hợp các pod điều phối quá trình sao lưu và khôi phục.
  • Object Storage: Một bucket (như S3) lưu trữ metadata và log.
  • Volume Snapshotter: Một plugin giao tiếp with backend lưu trữ (EBS, Longhorn, v.v.) để xử lý dữ liệu PV.

Thực hành: Thiết lập Velero

Trong phần thiết lập này, chúng ta sẽ sử dụng một backend tương thích với S3. Hãy đảm bảo bạn có quyền truy cập kubectl vào một cluster đang chạy trước khi bắt đầu.

1. Cài đặt Velero CLI

Tải xuống bản phát hành mới nhất về máy cục bộ của bạn. Việc giữ phiên bản CLI đồng bộ với server là rất quan trọng để đảm bảo tính tương thích.

# Ví dụ cho Linux v1.15.0
wget https://github.com/vmware-tanzu/velero/releases/download/v1.15.0/velero-v1.15.0-linux-amd64.tar.gz
tar -xvf velero-v1.15.0-linux-amd64.tar.gz
sudo mv velero-v1.15.0-linux-amd64/velero /usr/local/bin/

2. Cấu hình thông tin xác thực lưu trữ

Velero cần quyền ghi vào object storage của bạn. Tạo một file credentials-velero với các key của bạn:

[default]
aws_access_key_id = AKIAIOSFODNN7EXAMPLE
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

3. Triển khai Velero Server

Lệnh này sẽ cài đặt các thành phần server vào cluster của bạn. Chúng ta sẽ sử dụng MinIO cho ví dụ này, nhưng quy trình với AWS S3 cũng gần như tương tự.

velero install \
    --provider aws \
    --plugins velero/velero-plugin-for-aws:v1.9.0 \
    --bucket k8s-backups \
    --secret-file ./credentials-velero \
    --use-volume-snapshots=true \
    --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio.storage.svc.cluster.local:9000 \
    --snapshot-location-config region=default

Kiểm tra tình trạng cài đặt bằng cách theo dõi các pod trong namespace velero:

kubectl get pods -n velero

Sao lưu và Khôi phục trong thực tế

Hãy bảo vệ một namespace production có tên app-production chứa một database có trạng thái (stateful).

Kích hoạt sao lưu thủ công

Chạy lệnh này để tạo một bản snapshot tại một thời điểm cho toàn bộ namespace và các volume của nó:

velero backup create prod-snapshot-01 --include-namespaces app-production

Xác minh trạng thái và đảm bảo các volume snapshot là ‘Completed’:

velero backup describe prod-snapshot-01
velero backup get

Mô phỏng thảm họa

Xóa toàn bộ namespace. Nếu bạn sử dụng CSI driver tiêu chuẩn, các PV của bạn có khả năng sẽ biến mất cùng với các pod.

kubectl delete namespace app-production

Quy trình khôi phục

Velero bây giờ sẽ tái tạo lại toàn bộ môi trường từ bản snapshot trên S3. Nó sẽ khôi phục namespace trước, sau đó gọi nhà cung cấp đám mây để tạo lại các PV, và cuối cùng là triển khai các tài nguyên theo đúng thứ tự phụ thuộc.

velero restore create --from-backup prod-snapshot-01

Trong vòng 2 đến 5 phút—tùy thuộc vào kích thước volume—ứng dụng của bạn sẽ hoạt động trở lại mà không mất bất kỳ dữ liệu nào.

Chiến lược nâng cao: RPO và Sao lưu cấp độ tệp

Sao lưu thủ công thường không đáng tin cậy. Trong môi trường production, tôi luôn cấu hình lịch trình hàng giờ để đạt được Mục tiêu Điểm khôi phục (RPO) là 60 phút.

velero schedule create daily-prod --schedule="0 * * * *" --include-namespaces app-production --ttl 720h0m0s

Flag --ttl (Time To Live) là rất cần thiết. Nó tự động xóa các bản sao lưu cũ hơn 30 ngày để kiểm soát chi phí lưu trữ đám mây của bạn.

Sử dụng Node Agent (Restic/Kopia)

Nếu nhà cung cấp lưu trữ của bạn không hỗ trợ snapshot thì sao? Bạn có thể sử dụng Velero Node Agent. Nó thực hiện sao lưu ở cấp độ hệ thống tệp (file-system). Cách này chậm hơn so với snapshot phần cứng nhưng hoạt động trên mọi hạ tầng, bao gồm cả bare metal tại chỗ (on-premise).

Kích hoạt nó trong khi cài đặt với --use-node-agent, sau đó annotate các pod của bạn để bao gồm các volume của chúng:

kubectl annotate pod <pod-name> backup.velero.io/backup-volumes=data-storage

Kết luận: Tin cậy là một quy trình

Kubernetes giúp mở rộng ứng dụng, nhưng nó không tự động bảo vệ dữ liệu kinh doanh của bạn. Chuyển từ chiến lược “dựa trên hy vọng” sang một kế hoạch khôi phục đã được kiểm chứng là một cột mốc quan trọng đối với bất kỳ đội ngũ DevOps nào. Bằng cách triển khai Velero, bạn xây dựng một mạng lưới an toàn cho phép các kỹ sư di chuyển nhanh hơn mà không phải lo sợ mất dữ liệu.

Hãy bắt đầu từ việc nhỏ. Chọn một namespace quan trọng, thiết lập backend MinIO cục bộ và thực hành khôi phục toàn bộ. Một khi bạn thấy dữ liệu của mình xuất hiện trở lại sau lệnh kubectl delete, bạn sẽ ngủ ngon hơn trong các ca trực on-call. Sự tin cậy không chỉ nằm ở phần mềm bạn sử dụng; nó nằm ở quy trình khôi phục mà bạn thực sự kiểm tra.

Share: