Longhorn - Hệ thống lưu trữ phân tán container cloud cấp doanh nghiệp - Sao lưu và Phục hồi

Nội dung được trích từ tài liệu kỹ thuật chính thức Longhorn 1.1.2.

Mục lục

  • Tạo một bản snapshot
  • Sao lưu và snapshot định kỳ
  • Cấu hình snapshot định kỳ bằng giao diện Longhorn UI
  • Cấu hình công việc định kỳ bằng StorageClass
  • Cho phép công việc định kỳ khi volume tách rời
  • Volume phục hồi thảm họa
  • Tạo volume phục hồi thảm họa (DR)
  • Cấu hình mục tiêu sao lưu
  • Cấu hình lưu trữ sao lưu AWS S3
  • Cấu hình lưu trữ sao lưu kiểm tra cục bộ
  • Sử dụng chứng chỉ SSL tự ký để giao tiếp với S3
  • Kích hoạt truy cập kiểu virtual-hosted-style cho lưu trữ sao lưu tương thích S3
  • Lưu trữ sao lưu NFS
  • Tạo bản sao lưu
  • Phục hồi từ bản sao lưu
  • Phục hồi volume cho Kubernetes StatefulSets
  • Kích hoạt hỗ trợ snapshot CSI trên cụm
  • Thêm một VolumeSnapshotClass mặc định
  • Nếu bạn cập nhật từ phiên bản Longhorn trước trong môi trường Air Gap
  • Nếu bản phân phối Kubernetes của bạn không kèm theo Snapshot Controller
  • Tạo sao lưu qua CSI
  • Tạo sao lưu qua cơ chế CSI
  • Nguyên lý hoạt động của cơ chế CSI
  • Xem bản sao lưu
  • Ví dụ về VolumeSnapshot
  • Phục hồi sao lưu qua CSI
  • Phục hồi sao lưu qua đối tượng VolumeSnapshot
  • Phục hồi bản sao lưu không liên kết với VolumeSnapshot

Tạo một bản snapshot

snapshot là trạng thái của Kubernetes Volume tại một thời điểm cụ thể.

Để tạo snapshot cho một volume hiện có trong cụm,

  1. Trong thanh điều hướng trên cùng của giao diện Longhorn UI, nhấp vào Volume.
  2. Nhấp vào tên của volume mà bạn muốn tạo snapshot. Điều này sẽ hiển thị trang chi tiết volume.
  3. Nhấp vào nút Take Snapshot.

Sau khi tạo snapshot, bạn sẽ thấy nó trong danh sách các snapshot của volume trước khi volume đầu (volume head).

Sao lưu và snapshot định kỳ

Từ giao diện Longhorn UI, bạn có thể lên lịch tạo snapshot và sao lưu định kỳ.

Để thiết lập lịch trình, bạn sẽ chuyển đến chế độ xem chi tiết volume trong Longhorn. Sau đó bạn sẽ thiết lập:

  • Loại schedule, là backup (sao lưu) hoặc snapshot (snapshot)
  • Thời điểm tạo bản sao lưu hoặc snapshot, dưới dạng biểu thức CRON
  • Số lượng bản sao lưu hoặc snapshot cần giữ lại
  • Bất kỳ nhãn nào cần áp dụng cho bản sao lưu hoặc snapshot

Sau đó Longhorn sẽ tự động tạo snapshot hoặc sao lưu cho người dùng tại thời điểm đó, miễn là volume đó được gắn vào một node.

Bạn có thể sử dụng giao diện Longhorn UI hoặc cấu hình StorageClass của Kubernetes để thiết lập snapshot định kỳ.

Lưu ý: Để tránh vấn đề mà recurring jobs có thể ghi đè lên các bản sao lưu/snapshot cũ bằng các bản sao lưu/snapshot trống khi volume không có dữ liệu mới trong thời gian dài, Longhorn thực hiện các thao tác sau:

  1. Công việc sao lưu định kỳ (recurring backup job) chỉ thực hiện sao lưu mới khi volume có dữ liệu mới kể từ lần sao lưu cuối cùng.
  2. Công việc snapshot định kỳ (recurring snapshot job) chỉ chụp snapshot mới khi có dữ liệu mới trong volume head (dữ liệu thời gian thực).

Cấu hình snapshot định kỳ bằng giao diện Longhorn UI

Bạn có thể cấu hình snapshot và sao lưu định kỳ từ trang chi tiết volume. Để điều hướng đến trang này, hãy nhấp vào Volume, sau đó nhấp vào tên của volume.

Cấu hình công việc định kỳ bằng StorageClass

Bạn có thể cấu hình các công việc sao lưu và snapshot định kỳ trong tham số recurringJobs của StorageClass.

Bất kỳ volume nào được tạo trong tương lai bằng StorageClass này sẽ tự động được thiết lập các recurring jobs.

Trường recurringJobs nên tuân theo định dạng JSON sau:

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: longhorn
    provisioner: driver.longhorn.io
    parameters:
      numberOfReplicas: "3"
      staleReplicaTimeout: "30"
      fromBackup: ""
      recurringJobs: '[
        {
          "name":"snap",
          "task":"snapshot",
          "cron":"*/1 * * * *",
          "retain":1
        },
        {
          "name":"backup",
          "task":"backup",
          "cron":"*/2 * * * *",
          "retain":1
        }
      ]'

Bạn nên chỉ định các tham số sau cho mỗi recurring job:

  1. name: Tên của một job. Đừng sử dụng tên trùng lặp trong một recurringJobs. Và độ dài của name không được vượt quá 8 ký tự.
  2. task: Loại của một job. Nó chỉ hỗ trợ snapshot (tạo snapshot định kỳ) hoặc backup (tạo snapshot định kỳ sau đó thực hiện sao lưu).
  3. cron: Biểu thức CRON. Nó cho biết thời điểm thực hiện một job.
  4. retain: Số lượng snapshot/sao lưuLonghorn sẽ giữ lại cho một job. Nên không ít hơn 1.

Cho phép công việc định kỳ khi volume tách rời

Longhorn cung cấp cài đặt allow-recurring-job-while-volume-detached, cho phép bạn thực hiện sao lưu định kỳ ngay cả khi volume đã được tách rời. Bạn có thể tìm thấy cài đặt này trong giao diện Longhorn UI.

Sau khi kích hoạt cài đặt này, Longhorn sẽ tự động gắn volume và thực hiện snapshot/sao lưu khi cần thực hiện công việc định kỳ snapshot/sao lưu.

Lưu ý rằng trong quá trình tự động gắn (attached automatically), volume chưa sẵn sàng để xử lý tải công việc. Tải công việc phải đợi cho đến khi công việc định kỳ hoàn thành.

Volume phục hồi thảm họa

Volume phục hồi thảm họa (DR) là một loại volume đặc biệt, chủ yếu được sử dụng để lưu trữ dữ liệu trong cụm sao lưu khi cụm chính gặp sự cố. Volume phục hồi thảm họa được sử dụng để tăng khả năng chịu lỗi của các volume Longhorn.

Đối với volume phục hồi thảm họa, Last Backup biểu thị cho bản sao lưu mới nhất của volume gốc.

Nếu biểu tượng đại diện cho volume phục hồi có màu xám, điều đó có nghĩa là volume đang được phục hồi từ Last Backup và volume không thể được kích hoạt. Nếu biểu tượng có màu xanh, điều đó có nghĩa là volume đã được phục hồi từ Last Backup.

Tạo volume phục hồi thảm họa (DR)

Điều kiện tiên quyết: Thiết lập hai cụm Kubernetes. Chúng sẽ được gọi là cụm A và cụm B. Cài đặt Longhorn trên cả hai cụm và thiết lập cùng một mục tiêu sao lưu trên cả hai cụm.

  1. Trong cụm A, đảm bảo volume gốc X đã được tạo bản sao lưu hoặc đã được lên lịch sao lưu định kỳ.
  2. Trong trang sao lưu của cụm B, chọn bản sao lưu của volume X, sau đó tạo volume phục hồi thảm họa Y. Chúng tôi khuyên bạn nên sử dụng tên volume sao lưu làm tên volume phục hồi thảm họa.
  3. Longhorn sẽ tự động gắn volume DR Y vào một node ngẫu nhiên. Sau đó Longhorn sẽ bắt đầu quét bản sao lưu cuối cùng của volume X và phục hồi tăng dần vào volume Y.

Cấu hình mục tiêu sao lưu

Mục tiêu sao lưu là điểm cuối được sử dụng để truy cập backupstore trong Longhorn. backupstore là máy chủ NFS hoặc máy chủ tương thích S3 được sử dụng để lưu trữ các bản sao lưu của volume Longhorn. Mục tiêu sao lưu có thể được thiết lập trong Settings/General/BackupTarget.

Nếu bạn không có quyền truy cập AWS S3 hoặc muốn thử lưu trữ sao lưu trước, chúng tôi cũng cung cấp phương pháp sử dụng MinIO để thiết lập lưu trữ S3 kiểm tra cục bộ.

Longhorn còn hỗ trợ thiết lập các công việc snapshot/sao lưu định kỳ cho volume thông qua giao diện Longhorn UI hoặc Kubernetes Storage Class.

Cấu hình lưu trữ sao lưu AWS S3

  1. Tạo một bucket mới trong AWS S3.
  2. Thiết lập quyền cho Longhorn. Có hai tùy chọn để thiết lập thông tin xác thực. Đầu tiên, bạn có thể thiết lập Kubernetes secret bằng thông tin xác thực của AWS IAM user. Thứ hai là bạn có thể sử dụng ứng dụng thứ ba để quản lý quyền AWS IAM tạm thời cho Pod thông qua annotations, thay vì sử dụng thông tin xác thực AWS.
  • Tùy chọn 1: Tạo Kubernetes secret bằng thông tin xác thực IAM user
  1. Làm theo hướng dẫn để tạo AWS IAM user mới và thiết lập các quyền sau. Chỉnh sửa phần Resource để sử dụng tên bucket S3 của bạn:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "GrantLonghornBackupstoreAccess0",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:ListBucket",
        "s3:DeleteObject"
      ],
      "Resource": [
        "arn:aws:s3:::<your-bucket-name>",
        "arn:aws:s3:::<your-bucket-name>/*"
      ]
    }
  ]
}

  1. Tạo một Kubernetes secret có tên là aws-secret trong không gian tên (namespace) chứa Longhorn (mặc định là longhorn-system). secret phải được tạo trong không gian tên longhorn-system để Longhorn có thể truy cập nó:
kubectl create secret generic <aws-secret> \
    --from-literal=AWS_ACCESS_KEY_ID=<your-aws-access-key-id> \
    --from-literal=AWS_SECRET_ACCESS_KEY=<your-aws-secret-access-key> \
    -n longhorn-system

  • Tùy chọn 2: Sử dụng AWS STS AssumeRole (kube2iam hoặc kiam) để thiết lập quyền bằng thông tin xác thực IAM tạm thời

kube2iam hoặc kiam là một ứng dụng Kubernetes cho phép quản lý quyền AWS IAM cho Pod thông qua annotations thay vì thao tác với thông tin xác thực AWS. Làm theo hướng dẫn trong kho lưu trữ GitHub của kube2iam hoặc kiam để cài đặt nó vào cụm Kubernetes.

  1. Làm theo hướng dẫn để tạo vai trò AWS IAM mới cho dịch vụ AWS S3 và thiết lập các quyền sau:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "GrantLonghornBackupstoreAccess0",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:ListBucket",
        "s3:DeleteObject"
      ],
      "Resource": [
        "arn:aws:s3:::<your-bucket-name>",
        "arn:aws:s3:::<your-bucket-name>/*"
      ]
    }
  ]
}

  1. Sửa đổi mối quan hệ tin cậy của AWS IAM role bằng cách sử dụng:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
          "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/<AWS_EC2_NODE_INSTANCE_ROLE>"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

  1. Tạo một Kubernetes secret có tên là aws-secret trong không gian tên chứa Longhorn (mặc định là longhorn-system). secret phải được tạo trong không gian tên longhorn-system để Longhorn có thể truy cập nó:
kubectl create secret generic <aws-secret> \
    --from-literal=AWS_IAM_ROLE_ARN=<your-aws-iam-role-arn> \
    -n longhorn-system

  1. Chuyển đến giao diện Longhorn UI. Trong thanh điều hướng trên cùng, nhấp vào Settings. Trong phần Backup, đặt Backup Target thành:
s3://<your-bucket-name>@<your-aws-region>/

Đảm bảo có dấu / ở cuối, nếu không sẽ báo lỗi. Bạn có thể sử dụng thư mục con (tiền tố):

s3://<your-bucket-name>@<your-aws-region>/mypath/

Đảm bảo bạnđã đặt <your-aws-region> trong URL.

Ví dụ, đối với AWS, bạn có thể tìm thấy mã vùng (region codes) tại: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RegionsAndAvailabilityZones.html

Đối với Google Cloud Storage, bạn có thể tìm thấy mã vùng tại: https://cloud.google.com/storage/docs/locations 4. Trong phần Backup, đặt Backup Target Credential Secret thành:

aws-secret

Đây là tên của secret chứa thông tin xác thực AWS hoặc AWS IAM role.

Kết quả: Longhorn có thể lưu trữ sao lưu trong S3. Để tạo sao lưu, hãy xem phần này.

Lưu ý: Nếu bạn đang vận hành Longhorn sau proxy và muốn sử dụng AWS S3 làm lưu trữ sao lưu, bạn phải cung cấp thông tin về proxy cho Longhorn trong aws-secret như sau:

kubectl create secret generic <aws-secret> \
    --from-literal=AWS_ACCESS_KEY_ID=<your-aws-access-key-id> \
    --from-literal=AWS_SECRET_ACCESS_KEY=<your-aws-secret-access-key> \
    --from-literal=HTTP_PROXY=<your-proxy-ip-and-port> \
    --from-literal=HTTPS_PROXY=<your-proxy-ip-and-port> \
    --from-literal=NO_PROXY=<excluded-ip-list> \
    -n longhorn-system

Đảm bảo NO_PROXY chứa các địa chỉ mạng (network addresses), phạm vi địa chỉ mạng (network address ranges) và miền (domains) không nên sử dụng proxy (proxy). Để Longhorn chạy, các giá trị tối thiểu yêu cầu cho NO_PROXY là:

  • localhost
  • 127.0.0.1
  • 0.0.0.0
  • 10.0.0.0/8 (IPs của các thành phần K8s)
  • 192.168.0.0/16 (IP nội bộ trong cụm)

Cấu hình lưu trữ sao lưu kiểm tra cục bộ

Chúng tôi đã cung cấp hai lưu trữ sao lưu (backupstore) dựa trên NFS serverMinIO S3 server cho mục đích kiểm tra trong ./deploy/backupstores.

  1. Sau khi tạo longhorn-system, sử dụng lệnh sau để thiết lập máy chủ MinIO S3 cho lưu trữ sao lưu.
kubectl create -f https://raw.githubusercontent.com/longhorn/longhorn/master/deploy/backupstores/minio-backupstore.yaml

  1. Chuyển đến giao diện Longhorn UI. Trong thanh điều hướng trên cùng, nhấp vào Settings. Trong phần Backup, đặt Backup Target thành
s3://backupbucket@us-east-1/

và đặt Backup Target Credential Secret thành:

minio-secret

minio-secret yaml như sau:

apiVersion: v1
kind: Secret
metadata:
  name: minio-secret
  namespace: longhorn-system
type: Opaque
data:
  AWS_ACCESS_KEY_ID: bG9uZ2hvcm4tdGVzdC1hY2Nlc3Mta2V5 # longhorn-test-access-key
  AWS_SECRET_ACCESS_KEY: bG9uZ2hvcm4tdGVzdC1zZWNyZXQta2V5 # longhorn-test-secret-key
  AWS_ENDPOINTS: aHR0cHM6Ly9taW5pby1zZXJ2aWNlLmRlZmF1bHQ6OTAwMA== # https://minio-service.default:9000
  AWS_CERT: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURMRENDQWhTZ0F3SUJBZ0lSQU1kbzQycGhUZXlrMTcvYkxyWjVZRHN3RFFZSktvWklodmNOQVFFTEJRQXcKR2pFWU1CWUdBMVVFQ2hNUFRHOXVaMmh2Y200Z0xTQlVaWE4wTUNBWERUSXdNRFF5TnpJek1EQXhNVm9ZRHpJeApNakF3TkRBek1qTXdNREV4V2pBYU1SZ3dGZ1lEVlFRS0V3OU1iMjVuYUc5eWJpQXRJRlJsYzNRd2dnRWlNQTBHCkNTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEWHpVdXJnUFpEZ3pUM0RZdWFlYmdld3Fvd2RlQUQKODRWWWF6ZlN1USs3K21Oa2lpUVBvelVVMmZvUWFGL1BxekJiUW1lZ29hT3l5NVhqM1VFeG1GcmV0eDBaRjVOVgpKTi85ZWFJNWRXRk9teHhpMElPUGI2T0RpbE1qcXVEbUVPSXljdjRTaCsvSWo5Zk1nS0tXUDdJZGxDNUJPeThkCncwOVdkckxxaE9WY3BKamNxYjN6K3hISHd5Q05YeGhoRm9tb2xQVnpJbnlTUEJTZkRuSDBuS0lHUXl2bGhCMGsKVHBHSzYxc2prZnFTK3hpNTlJeHVrbHZIRXNQcjFXblRzYU9oaVh6N3lQSlorcTNBMWZoVzBVa1JaRFlnWnNFbQovZ05KM3JwOFhZdURna2kzZ0UrOElXQWRBWHExeWhqRDdSSkI4VFNJYTV0SGpKUUtqZ0NlSG5HekFnTUJBQUdqCmF6QnBNQTRHQTFVZER3RUIvd1FFQXdJQ3BEQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFQQmdOVkhSTUIKQWY4RUJUQURBUUgvTURFR0ExVWRFUVFxTUNpQ0NXeHZZMkZzYUc5emRJSVZiV2x1YVc4dGMyVnlkbWxqWlM1awpaV1poZFd4MGh3Ui9BQUFCTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFDbUZMMzlNSHVZMzFhMTFEajRwMjVjCnFQRUM0RHZJUWozTk9kU0dWMmQrZjZzZ3pGejFXTDhWcnF2QjFCMVM2cjRKYjJQRXVJQkQ4NFlwVXJIT1JNU2MKd3ViTEppSEtEa0Jmb2U5QWI1cC9VakpyS0tuajM0RGx2c1cvR3AwWTZYc1BWaVdpVWorb1JLbUdWSTI0Q0JIdgpnK0JtVzNDeU5RR1RLajk0eE02czNBV2xHRW95YXFXUGU1eHllVWUzZjFBWkY5N3RDaklKUmVWbENtaENGK0JtCmFUY1RSUWN3cVdvQ3AwYmJZcHlERFlwUmxxOEdQbElFOW8yWjZBc05mTHJVcGFtZ3FYMmtYa2gxa3lzSlEralAKelFadHJSMG1tdHVyM0RuRW0yYmk0TktIQVFIcFc5TXUxNkdRakUxTmJYcVF0VEI4OGpLNzZjdEg5MzRDYWw2VgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==

Để biết thêm thông tin về việc tạo secret, hãy xem tài liệu Kubernetes. secret phải được tạo trong không gian tên longhorn-system để Longhorn có thể truy cập nó.

Lưu ý: Khi tạo mã hóa base64, hãy chắc chắn sử dụng echo -n, nếu không một dòng mới sẽ được thêm vào cuối chuỗi, gây lỗi khi truy cập S3.

  1. Nhấp vào tab Backup trong giao diện người dùng. Nó nên báo một danh sách trống không có lỗi.

Kết quả: Longhorn có thể lưu trữ sao lưu trong S3.

Sử dụng chứng chỉ SSL tự ký để giao tiếp với S3

Nếu bạn muốn sử dụng chứng chỉ SSL tự ký, bạn có thể chỉ định AWS_CERT trong Kubernetes secret được cung cấp cho Longhorn. Xem ví dụ trong Cấu hình lưu trữ sao lưu kiểm tra cục bộ. Lưu ý rằng chứng chỉ cần ở định dạng PEM và phải là CA của chính nó. Hoặc phải chứa một chuỗi chứng chỉ chứa chứng chỉ CA. Để chứa nhiều chứng chỉ, chỉ cần nối các chứng chỉ khác nhau (tệp PEM) lại với nhau.

Kích hoạt truy cập kiểu virtual-hosted-style cho lưu trữ sao lưu tương thích S3

Trong các trường hợp sau, bạn có thể cần kích hoạt phương thức truy cập mới này cho lưu trữ sao lưu tương thích S3

  1. Bạn muốn chuyển sang phương thức truy cập mới ngay lập tức, để bạn không cần phải lo lắng về kế hoạch loại bỏ đường dẫn Amazon S3;
  2. backupstore bạn sử dụng chỉ hỗ trợ truy cập kiểu virtual-hosted-style, ví dụ: Alibaba Cloud(Aliyun) OSS;
  3. Bạn đã cấu hình biến môi trường MINIO_DOMAIN để kích hoạt yêu cầu kiểu virtual-host-style cho máy chủ MinIO;
  4. Lỗi này ...... error: AWS Error: SecondLevelDomainForbidden Please use virtual hosted style to access. ..... được kích hoạt.

Phương pháp kích hoạt truy cập kiểu virtual-hosted-style

  1. Thêm một trường mới VIRTUAL_HOSTED_STYLE có giá trị true vào secret mục tiêu sao lưu của bạn. Ví dụ:
apiVersion: v1
kind: Secret
metadata:
  name: s3-compatible-backup-target-secret
  namespace: longhorn-system
type: Opaque
data:
  AWS_ACCESS_KEY_ID: bG9uZ2hvcm4tdGVzdC1hY2Nlc3Mta2V5
  AWS_SECRET_ACCESS_KEY: bG9uZ2hvcm4tdGVzdC1zZWNyZXQta2V5
  AWS_ENDPOINTS: aHR0cHM6Ly9taW5pby1zZXJ2aWNlLmRlZmF1bHQ6OTAwMA==
  VIRTUAL_HOSTED_STYLE: dHJ1ZQ== # true

  1. Triển khai/cập nhật(Deploy/update) secret và đặt nó trong Settings/General/BackupTargetSecret.

Lưu trữ sao lưu NFS

Để sử dụng máy chủ NFS làm lưu trữ sao lưu, máy chủ NFS phải hỗ trợ NFSv4.

URL mục tiêu nên trông như sau:

nfs://longhorn-test-nfs-svc.default:/opt/backupstore

Kết quả: Longhorn có thể lưu trữ sao lưu trong NFS.

Tạo bản sao lưu

Backups trong Longhorn là các đối tượng trong lưu trữ sao lưu bên ngoài cụm. Điểm cuối truy cập lưu trữ sao lưu là mục tiêu sao lưu.

Điều kiện tiên quyết: Phải đã thiết lập mục tiêu sao lưu. Để biết thêm thông tin, hãy xem Cấu hình mục tiêu sao lưu. Nếu chưa thiết lập BackupTarget, sẽ có lỗi.

Để tạo sao lưu,

  1. Điều hướng đến menu Volume.
  2. Chọn volume bạn muốn sao lưu.
  3. Nhấp vào Create Backup.
  4. Thêm các nhãn thích hợp và nhấp OK.

Kết quả: Bản sao lưu đã được tạo. Để xem nó, hãy nhấp vào Backup trong thanh điều hướng trên cùng.

Phục hồi từ bản sao lưu

Longhorn có thể dễ dàng phục hồi bản sao lưu vào một volume.

Khi phục hồi bản sao lưu, mặc định sẽ tạo một volume có cùng tên. Nếu đã tồn tại volume có tên giống với bản sao lưu, bản sao lưu sẽ không được phục hồi.

Để phục hồi bản sao lưu,

  1. Điều hướng đến menu Backup
  2. Chọn bản sao lưu bạn muốn phục hồi, sau đó nhấp vào Restore Latest Backup
  3. Trong trường Name, chọn volume bạn muốn phục hồi
  4. Nhấp vào OK

Kết quả: Volume được phục hồi có sẵn trên trang Volume.

Phục hồi volume cho Kubernetes StatefulSets

Longhorn hỗ trợ phục hồi sao lưu, một trường hợp sử dụng của tính năng này là phục hồi dữ liệu được sử dụng trong Kubernetes StatefulSet, điều này đòi hỏi phải phục hồi một volume cho mỗi bản sao lưu của bộ dữ liệu.

Để phục hồi, hãy làm theo hướng dẫn sau. Ví dụ dưới đây sử dụng một StatefulSet trong đó một volume được gắn vào mỗi Pod và hai bản sao.

  1. Kết nối với trang Longhorn UI qua trình duyệt web. Dưới tab Backup, chọn tên của volume StatefulSet. Nhấp vào menu thả xuống của mục volume và phục hồi nó. Đặt tên cho volume để có thể tham chiếu dễ dàng sau này.
  • Lặp lại bước này cho mỗi volume cần phục hồi.
  • Ví dụ, nếu phục hồi StatefulSet có hai volume có tên pvc-01apvc-02b, việc phục hồi có thể như sau:
Tên Bản Sao Lưu Volume Được Phục Hồi
pvc-01a statefulset-vol-0
pvc-02b statefulset-vol-1
  1. Trong Kubernetes, tạo một Persistent Volume cho mỗi Longhorn volume được tạo. Đặt tên cho Persistent Volume để có thể tham chiếu dễ dàng sau này. dung lượng lưu trữ, numberOfReplicas, storageClassNamevolumeHandle phải được thay thế dưới đây. Trong ví dụ này, chúng tôi tham chiếu đến statefulset-vol-0statefulset-vol-1 trong Longhorn và sử dụng longhorn làm storageClassName của chúng tôi.
apiVersion: v1
kind: PersistentVolume
metadata:
  name: statefulset-vol-0
spec:
  capacity:
    storage: <size> # phải khớp với kích thước volume Longhorn
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  csi:
    driver: driver.longhorn.io # driver phải khớp với điều này
    fsType: ext4
    volumeAttributes:
      numberOfReplicas: <replicas> # phải khớp với giá trị volume Longhorn
      staleReplicaTimeout: '30' # bằng phút
    volumeHandle: statefulset-vol-0 # phải khớp với tên volume từ Longhorn
  storageClassName: longhorn # phải là cùng tên mà chúng tôi sẽ sử dụng sau
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: statefulset-vol-1
spec:
  capacity:
    storage: <size>  # phải khớp với kích thước volume Longhorn
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  csi:
    driver: driver.longhorn.io # driver phải khớp với điều này
    fsType: ext4
    volumeAttributes:
      numberOfReplicas: <replicas> # phải khớp với giá trị volume Longhorn
      staleReplicaTimeout: '30'
    volumeHandle: statefulset-vol-1 # phải khớp với tên volume từ Longhorn
  storageClassName: longhorn # phải là cùng tên mà chúng tôi sẽ sử dụng sau

  1. Trong không gian tên, triển khai StatefulSet, tạo PersistentVolume Claims cho mỗi Persistent Volume. Tên của PersistentVolume Claim phải tuân theo kế hoạch đặt tên sau:
<tên của Volume Claim Template>-<tên của StatefulSet>-<chỉ số>

StatefulSet Pod được đánh số không (zero-indexed). Trong ví dụ này, tên của Volume Claim Templatedata, tên của StatefulSetwebapp, và có hai bản sao, có chỉ số 01.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data-webapp-0
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi # phải khớp với kích thước từ trước
storageClassName: longhorn # phải khớp với tên từ trước
volumeName: statefulset-vol-0 # phải tham chiếu đến Persistent Volume
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data-webapp-1
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi # phải khớp với kích thước từ trước
storageClassName: longhorn # phải khớp với tên từ trước
volumeName: statefulset-vol-1 # phải tham chiếu đến Persistent Volume

  1. Tạo StatefulSet:
apiVersion: apps/v1beta2
kind: StatefulSet
metadata:
  name: webapp # khớp với kế hoạch đặt tên PersistentVolumeClaim
spec:
  selector:
    matchLabels:
      app: nginx # phải khớp với .spec.template.metadata.labels
  serviceName: "nginx"
  replicas: 2 # mặc định là 1
  template:
    metadata:
      labels:
        app: nginx # phải khớp với .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: k8s.gcr.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: data
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: data # khớp với kế hoạch đặt tên PersistentVolumeClaim
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: longhorn # phải khớp với tên từ trước
      resources:
        requests:
          storage: 2Gi # phải khớp với kích thước từ trước

Kết quả: Bây giờ dữ liệu được phục hồi có thể được truy cập từ bên trong các Pods của StatefulSet.

Kích hoạt hỗ trợ snapshot CSI trên cụm

Điều kiện tiên quyết

Hỗ trợ CSI snapshot có sẵn cho phiên bản Kubernetes >= 1.17.

Bản phân phối Kubernetes chịu trách nhiệm triển khai bộ điều khiển snapshot (snapshot controller) cùng với các định nghĩa tùy chỉnh tài nguyên liên quan.

Để biết thêm thông tin, hãy xem CSI Volume Snapshots.

Thêm một VolumeSnapshotClass mặc định

Đảm bảo tính sẵn có của Snapshot Beta CRD. Sau đó tạo một VolumeSnapshotClass mặc định.

kind: VolumeSnapshotClass
apiVersion: snapshot.storage.k8s.io/v1beta1
metadata:
  name: longhorn
driver: driver.longhorn.io
deletionPolicy: Delete

Nếu bạn cập nhật từ phiên bản Longhorn trước trong môi trường Air Gap

  1. Cập nhật hình ảnh csi-provisioner lên longhornio/csi-provisioner:v1.6.0
  2. Cập nhật hình ảnh csi-snapshotter lên longhornio/csi-snapshotter:v2.1.1

Nếu bản phân phối Kubernetes của bạn không kèm theo Snapshot Controller

Bạn có thể cài đặt các thành phần này một cách thủ công bằng cách thực hiện các bước sau.

Lưu ý rằng tệp snapshot controller YAML được đề cập dưới đây được triển khai đến không gian tên default.

Điều kiện tiên quyết

Đối với mục đích sử dụng chung, hãy cập nhật namespace trong tệp snapshot controller YAML trước khi cài đặt.

Ví dụ, trên cụm vanilla Kubernetes, hãy cập nhật không gian tên từ default thành kube-system trước khi发出 lệnh kubectl create.

Cài đặt Snapshot Beta CRDs:

  1. Tải xuống tệp từ https://github.com/kubernetes-csi/external-snapshotter/tree/release-4.0/client/config/crd
  2. Chạy kubectl create -f client/config/crd.
  3. Thực hiện một lần cho mỗi cụm.

Cài đặt Common Snapshot Controller:

  1. Tải xuống tệp từ https://github.com/kubernetes-csi/external-snapshotter/tree/release-4.0/deploy/kubernetes/snapshot-controller
  2. Cập nhật namespace thành giá trị phù hợp với môi trường của bạn (ví dụ: kube-system)
  3. Chạy kubectl create -f deploy/kubernetes/snapshot-controller
  4. Thực hiện một lần cho mỗi cụm.

Để biết thêm thông tin, hãy xem phần Usage trong kho lưu trữ kubernetes external-snapshotter git.

Tạo sao lưu qua CSI

Backups trong Longhorn là các đối tượng trong lưu trữ sao lưu (backupstore) bên ngoài cụm, điểm cuối truy cập lưu trữ sao lưu là mục tiêu sao lưu.

Để tạo backups theo chương trình, bạn có thể sử dụng cơ chế snapshot Kubernetes CSI chung.

Điều kiện tiên quyết: Cần phải kích hoạt hỗ trợ CSI snapshot trên cụm của bạn. Nếu bản phân phối kubernetes của bạn không cung cấp kubernetes snapshot controller cùng với các định nghĩa tùy chỉnh tài nguyên liên quan đến snapshot, bạn cần triển khai chúng một cách thủ công Để biết thêm thông tin, hãy xem Kích hoạt hỗ trợ Snapshot CSI

Tạo sao lưu qua cơ chế CSI

Để tạo sao lưu bằng cơ chế CSI, hãy tạo một đối tượng Kubernetes VolumeSnapshot thông qua kubectl.

Kết quả: Đã tạo bản sao lưu. Việc tạo đối tượng VolumeSnapshot dẫn đến việc tạo đối tượng VolumeSnapshotContent Kubernetes.

VolumeSnapshotContent đề cập đến Longhorn backup có tên là bs://backup-volume/backup-name trong trường VolumeSnapshotContent.snapshotHandle.

Nguyên lý hoạt động của cơ chế CSI

Khi tạo đối tượng VolumeSnapshot bằng kubectl, trường VolumeSnapshot.uuid được sử dụng để nhận diện Longhorn snapshot và đối tượng VolumeSnapshotContent liên quan.

Điều này tạo ra một Longhorn snapshot mới có tên là snapshot-uuid.

Sau đó khởi động backup của snapshot đó và trả về CSI request.

Sau đó tạo một đối tượng VolumeSnapshotContent có tên là snapcontent-uuid.

CSI snapshotter sidecar định kỳ truy vấn Longhorn CSI plugin để đánh giá trạng thái backup.

Sau khi hoàn tất, cờ VolumeSnapshotContent.readyToUse được đặt thành true.

Xem bản sao lưu

Để xem bản sao lưu, hãy nhấp vào Backup trong thanh điều hướng trên cùng và điều hướng đến volume sao lưu (backup-volume) được đề cập trong VolumeSnapshotContent.snapshotHandle.

Ví dụ về VolumeSnapshot

Dưới đây là ví dụ về đối tượng VolumeSnapshot. source cần trỏ đến Longhorn volume mà bản sao lưu sẽ được tạo.

Trường volumeSnapshotClassName trỏ đến một VolumeSnapshotClass.

Chúng tôi đã tạo một lớp mặc định có tên là longhorn sử dụng Delete làm deletionPolicy của nó.

apiVersion: snapshot.storage.k8s.io/v1beta1
kind: VolumeSnapshot
metadata:
  name: test-snapshot-pvc
spec:
  volumeSnapshotClassName: longhorn
  source:
    persistentVolumeClaimName: test-vol

Nếu bạn muốn giữ lại bản sao lưu liên quan của volume khi xóa VolumeSnapshot, hãy tạo một VolumeSnapshotClass mới và đặt Retain làm deletionPolicy.

Để biết thêm thông tin về các lớp snapshot, hãy xem tài liệu kubernetes về VolumeSnapshotClasses.

Phục hồi sao lưu qua CSI

Longhorn có thể dễ dàng phục hồi bản sao lưu vào một volume.

Để phục hồi sao lưu theo chương trình, bạn có thể sử dụng cơ chế snapshot kubernetes csi chung.

Điều kiện tiên quyết

Cần phải kích hoạt hỗ trợ CSI snapshot trên cụm của bạn.

Nếu bản phân phối Kubernetes của bạn không cung cấp Kubernetes snapshot controller cùng với các định nghĩa tùy chỉnh tài nguyên liên quan đến snapshot, bạn cần triển khai chúng một cách thủ công.

Phục hồi bản sao lưu qua đối tượng VolumeSnapshot

Tạo một đối tượng PersistentVolumeClaim trong đó trường dataSource trỏ đến đối tượng VolumeSnapshot hiện có.

csi-provisioner sẽ lấy nó và hướng dẫn Longhorn CSI driver sử dụng dữ liệu từ bản sao lưu liên quan (associated backup) để cấu hình volume mới.

Bạn có thể sử dụng cùng một cơ chế để phục hồi các Longhorn backup chưa được tạo bằng cơ chế CSI.

Dưới đây là ví dụ về PersistentVolumeClaim. Trường dataSource cần trỏ đến đối tượng VolumeSnapshot hiện có.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-restore-snapshot-pvc
spec:
  storageClassName: longhorn
  dataSource:
    name: test-snapshot-pvc
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi

Phục hồi bản sao lưu không liên kết với VolumeSnapshot

Để phục hồi Longhorn backup không được tạo bằng cơ chế CSI, bạn phải tạo thủ công các đối tượng VolumeSnapshotVolumeSnapshotContent cho bản sao lưu đó.

Tạo một đối tượng VolumeSnapshotContent và đặt trường snapshotHandle thành bs://backup-volume/backup-name.

Các giá trị backup-volumebackup-name có thể được truy xuất từ trang Backup của giao diện Longhorn UI.

apiVersion: snapshot.storage.k8s.io/v1beta1
kind: VolumeSnapshotContent
metadata:
  name: test-existing-backup
spec:
  volumeSnapshotClassName: longhorn
  driver: driver.longhorn.io
  deletionPolicy: Delete
  source:
    # LƯU Ý: thay đổi điều này để trỏ đến một bản sao lưu hiện có trên backupstore
    snapshotHandle: bs://test-vol/backup-625159fb469e492e
  volumeSnapshotRef:
    name: test-snapshot-existing-backup
    namespace: default

Tạo đối tượng VolumeSnapshot liên quan và đặt trường name thành test-snapshot-existing-backup, trong đó trường source tham chiếu đến đối tượng VolumeSnapshotContent thông qua trường volumeSnapshotContentName.

Điều này khác với việc tạo backup, trong trường hợp này, trường source tham chiếu đến PerstistentVolumeClaim thông qua trường persistentVolumeClaimName.

Chỉ có thể đặt một loại tham chiếu cho đối tượng VolumeSnapshot.

apiVersion: snapshot.storage.k8s.io/v1beta1
kind: VolumeSnapshot
metadata:
  name: test-snapshot-existing-backup
spec:
  volumeSnapshotClassName: longhorn
  source:
    volumeSnapshotContentName: test-existing-backup

Bây giờ bạn có thể tạo một đối tượng PerstistentVolumeClaim tham chiếu đến đối tượng VolumeSnapshot vừa được tạo.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-restore-existing-backup-pvc
spec:
  storageClassName: longhorn
  dataSource:
    name: test-snapshot-existing-backup
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi

Kết quả: Bây giờ dữ liệu được phục hồi có thể được truy cập từ bên trong các Pods của StatefulSet.

Thẻ: Longhorn Kubernetes CSI Storage backup

Đăng vào ngày 10 tháng 6 lúc 18:38