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ỉ
SSLtự ký để giao tiếp vớiS3 - Kích hoạt truy cập kiểu
virtual-hosted-stylecho lưu trữ sao lưu tương thíchS3 - 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
CSItrên cụm - Thêm một
VolumeSnapshotClassmặc định - Nếu bạn cập nhật từ phiên bản
Longhorntrước trong môi trườngAir Gap - Nếu bản phân phối
Kubernetescủa bạn không kèm theoSnapshot 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,
- Trong thanh điều hướng trên cùng của giao diện
Longhorn UI, nhấp vào Volume. - 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.
- 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ặcsnapshot(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 jobscó 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,Longhornthực hiện các thao tác sau:
- 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.- Công việc snapshot định kỳ (
recurring snapshot job) chỉ chụp snapshot mới khi có dữ liệu mới trongvolume 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:
name: Tên của mộtjob. Đừng sử dụng tên trùng lặp trong mộtrecurringJobs. Và độ dài củanamekhông được vượt quá8ký tự.task: Loại của mộtjob. Nó chỉ hỗ trợsnapshot(tạo snapshot định kỳ) hoặcbackup(tạo snapshot định kỳ sau đó thực hiện sao lưu).cron: Biểu thức CRON. Nó cho biết thời điểm thực hiện mộtjob.retain: Số lượngsnapshot/sao lưumàLonghornsẽ giữ lại cho mộtjob. Nên không ít hơn1.
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.
- Trong cụm
A, đảm bảo volume gốcXđã được tạo bản sao lưu hoặc đã được lên lịchsao lưu định kỳ. - Trong trang sao lưu của cụm
B, chọn bản sao lưu của volumeX, sau đó tạo volume phục hồi thảm họaY. 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. Longhornsẽ tự động gắn volumeDRYvào một node ngẫu nhiên. Sau đóLonghornsẽ bắt đầu quét bản sao lưu cuối cùng của volumeXvà phục hồi tăng dần vào volumeY.
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
- Tạo một bucket mới trong AWS S3.
- 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ậpKubernetes secretbằng thông tin xác thực củaAWS IAMuser. Thứ hai là bạn có thể sử dụng ứng dụng thứ ba để quản lý quyềnAWS IAMtạm thời choPodthông quaannotations, thay vì sử dụng thông tin xác thựcAWS.
- Tùy chọn 1: Tạo
Kubernetes secretbằng thông tin xác thựcIAMuser
- Làm theo hướng dẫn để tạo
AWS IAMuser mới và thiết lập các quyền sau. Chỉnh sửa phầnResourceđể sử dụng tên bucketS3củ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>/*"
]
}
]
}
- Tạo một
Kubernetes secretcó tên làaws-secrettrong không gian tên (namespace) chứaLonghorn(mặc định làlonghorn-system).secretphải được tạo trong không gian tênlonghorn-systemđểLonghorncó 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(kube2iamhoặckiam) để thiết lập quyền bằng thông tin xác thựcIAMtạ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.
- Làm theo hướng dẫn để tạo vai trò
AWS IAMmới cho dịch vụAWS S3và 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>/*"
]
}
]
}
- Sửa đổi mối quan hệ tin cậy của
AWS IAMrole 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"
}
]
}
- Tạo một
Kubernetes secretcó tên làaws-secrettrong không gian tên chứaLonghorn(mặc định làlonghorn-system).secretphải được tạo trong không gian tênlonghorn-systemđểLonghorncó 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
- 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ầnBackup, đặ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à:
localhost127.0.0.10.0.0.010.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 server và MinIO S3 server cho mục đích kiểm tra trong ./deploy/backupstores.
- Sau khi tạo
longhorn-system, sử dụng lệnh sau để thiết lập máy chủMinIO S3cho lưu trữ sao lưu.
kubectl create -f https://raw.githubusercontent.com/longhorn/longhorn/master/deploy/backupstores/minio-backupstore.yaml
- 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ầnBackup, đặ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ụngecho -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ậpS3.
- 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
- 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;
backupstorebạn sử dụng chỉ hỗ trợ truy cập kiểuvirtual-hosted-style, ví dụ:Alibaba Cloud(Aliyun) OSS;- 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; - 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
- Thêm một trường mới
VIRTUAL_HOSTED_STYLEcó giá trịtruevàosecretmụ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
Triển khai/cập nhật(Deploy/update)secret và đặt nó trongSettings/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ậpBackupTarget, sẽ có lỗi.
Để tạo sao lưu,
- Điều hướng đến menu Volume.
- Chọn volume bạn muốn sao lưu.
- Nhấp vào Create Backup.
- 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,
- Điều hướng đến menu Backup
- Chọn bản sao lưu bạn muốn phục hồi, sau đó nhấp vào Restore Latest Backup
- Trong trường Name, chọn volume bạn muốn phục hồi
- 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.
- Kết nối với trang
Longhorn UIqua trình duyệt web. Dưới tabBackup, chọn tên của volumeStatefulSet. 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
StatefulSetcó hai volume có tênpvc-01avàpvc-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 |
- Trong
Kubernetes, tạo mộtPersistent Volumecho mỗiLonghornvolume được tạo. Đặt tên choPersistent Volumeđể có thể tham chiếu dễ dàng sau này.dung lượng lưu trữ,numberOfReplicas,storageClassNamevàvolumeHandlephải được thay thế dưới đây. Trong ví dụ này, chúng tôi tham chiếu đếnstatefulset-vol-0vàstatefulset-vol-1trongLonghornvà sử dụnglonghornlàmstorageClassNamecủ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
- Trong không gian tên, triển khai
StatefulSet, tạoPersistentVolume Claimscho mỗiPersistent Volume. Tên củaPersistentVolume Claimphả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 Template là data, tên của StatefulSet là webapp,
và có hai bản sao, có chỉ số 0 và 1.
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
- 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ợ
CSIsnapshot có sẵn cho phiên bảnKubernetes>= 1.17.Bản phân phối
Kuberneteschịu trách nhiệm triển khaibộ đ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
- Cập nhật hình ảnh
csi-provisionerlênlonghornio/csi-provisioner:v1.6.0 - Cập nhật hình ảnh
csi-snapshotterlênlonghornio/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
namespacetrong tệpsnapshot controller YAMLtrướ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ừdefaultthànhkube-systemtrước khi发出 lệnhkubectl create.
Cài đặt Snapshot Beta CRDs:
- Tải xuống tệp từ https://github.com/kubernetes-csi/external-snapshotter/tree/release-4.0/client/config/crd
- Chạy
kubectl create -f client/config/crd. - Thực hiện một lần cho mỗi cụm.
Cài đặt Common Snapshot Controller:
- Tải xuống tệp từ https://github.com/kubernetes-csi/external-snapshotter/tree/release-4.0/deploy/kubernetes/snapshot-controller
- Cập nhật
namespacethành giá trị phù hợp với môi trường của bạn (ví dụ:kube-system) - Chạy
kubectl create -f deploy/kubernetes/snapshot-controller - 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 snapshottrên cụm của bạn. Nếu bản phân phốikubernetescủa bạn không cung cấpkubernetes snapshot controllercù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
Kubernetescủa bạn không cung cấpKubernetes snapshot controllercù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 VolumeSnapshot và VolumeSnapshotContent 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-volume và backup-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.