Longhorn,企業(yè)級(jí)云原生容器分布式存儲(chǔ)之備份與恢復(fù)
目錄
- 創(chuàng)建一個(gè)快照
- 周期性(Recurring)快照和備份
- 使用 Longhorn UI 設(shè)置周期性快照
- 使用 StorageClass 設(shè)置 Recurring Jobs
- 分離卷時(shí)允許 Recurring Job
- 容災(zāi)卷
- 創(chuàng)建容災(zāi)(DR)卷
- 設(shè)置備份目標(biāo)
- 設(shè)置 AWS S3 備份存儲(chǔ)
- 設(shè)置本地測(cè)試備份存儲(chǔ)
- 使用自簽名 SSL 證書進(jìn)行 S3 通信
- 為 S3 兼容的備份存儲(chǔ)啟用 virtual-hosted-style 訪問(wèn)
- NFS 備份存儲(chǔ)
- 創(chuàng)建備份
- 從備份恢復(fù)
- 為 Kubernetes StatefulSets 恢復(fù)卷
- 在集群上啟用 CSI 快照支持
- 添加一個(gè)默認(rèn)的 VolumeSnapshotClass
- 如果您在 Air Gap 環(huán)境中從以前的 Longhorn 版本進(jìn)行更新
- 如果您的 Kubernetes 發(fā)行版未捆綁 Snapshot Controller
- 通過(guò) CSI 創(chuàng)建備份
- 通過(guò) CSI Mechanism 創(chuàng)建備份
- CSI Mechanism 工作原理
- 查看備份
- VolumeSnapshot 示例
- 通過(guò) CSI 恢復(fù)備份
- 通過(guò) VolumeSnapshot 對(duì)象恢復(fù)備份
- 還原沒(méi)有關(guān)聯(lián) VolumeSnapshot 的備份
創(chuàng)建一個(gè)快照
snapshot 是 Kubernetes Volume 在任何給定時(shí)間點(diǎn)的狀態(tài)。
要?jiǎng)?chuàng)建現(xiàn)有集群的快照,
- 在 Longhorn UI 的頂部導(dǎo)航欄中,單擊 Volume。
- 單擊要為其創(chuàng)建快照的卷的名稱。這會(huì)導(dǎo)致卷詳細(xì)信息頁(yè)面。
- 單擊 Take Snapshot 按鈕。
創(chuàng)建快照后,您將在卷頭(Volume Head)之前的卷的快照列表中看到它。
周期性快照和備份
從 Longhorn UI,可以安排周期性快照和備份。
要設(shè)置時(shí)間表(schedule),您將轉(zhuǎn)到 Longhorn 中的卷詳細(xì)信息視圖。然后你將設(shè)置:
- schedule 類型,備份(backup)或快照(snapshot)
- 將創(chuàng)建備份或快照的時(shí)間,以 CRON expression 的形式
- 要保留的備份或快照的數(shù)量
- 應(yīng)應(yīng)用于備份或快照的任何標(biāo)簽(Any labels)
然后 Longhorn 會(huì)自動(dòng)為當(dāng)時(shí)的用戶創(chuàng)建快照或備份,只要該卷附加到一個(gè)節(jié)點(diǎn)。
可以使用 Longhorn UI 或使用 Kubernetes StorageClass 配置周期性快照。
注意:為了避免當(dāng)卷長(zhǎng)時(shí)間沒(méi)有新數(shù)據(jù)時(shí),recurring jobs 可能會(huì)用相同的備份和空快照覆蓋舊的備份/快照的問(wèn)題,Longhorn 執(zhí)行以下操作:
- Recurring backup job 僅在自上次備份以來(lái)卷有新數(shù)據(jù)時(shí)才進(jìn)行新備份。
- Recurring snapshot job 僅在卷頭(volume head)中有新數(shù)據(jù)(實(shí)時(shí)數(shù)據(jù))時(shí)才拍攝新快照。
使用 Longhorn UI 設(shè)置周期性快照
可以從卷詳細(xì)信息頁(yè)面配置周期性快照和備份。要導(dǎo)航到此頁(yè)面,請(qǐng)單擊 Volume,,然后單擊卷的名稱。
使用 StorageClass 設(shè)置 Recurring Jobs
可以在 StorageClass 的 recurringJobs 參數(shù)中配置計(jì)劃備份和快照。
使用這個(gè) StorageClass 創(chuàng)建的任何未來(lái)卷都將自動(dòng)設(shè)置這些 recurring jobs。
recurringJobs 字段應(yīng)遵循以下 JSON 格式:
- 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
- }
- ]'
應(yīng)為每個(gè) recurring job 指定以下參數(shù):
- name:一項(xiàng) job 的名稱。不要在一個(gè) recurringJobs 中使用重復(fù)的名稱。 并且 name 的長(zhǎng)度不能超過(guò) 8 個(gè)字符。
- task:一項(xiàng) job 的類型。它僅支持 snapshot(定期創(chuàng)建快照)或backup(定期創(chuàng)建快照然后進(jìn)行備份)。
- cron:Cron 表達(dá)式。它告訴一項(xiàng) job 的執(zhí)行時(shí)間。
- retain:Longhorn 將為一項(xiàng) job 保留多少快照/備份(snapshots/backups)。應(yīng)該不少于 1。
分離卷時(shí)允許 Recurring Job
Longhorn 提供了 allow-recurring-job-while-volume-detached 設(shè)置,即使卷已分離,您也可以進(jìn)行周期性備份(recurring backup)。您可以在 Longhorn UI 中找到該設(shè)置。
啟用該設(shè)置后,Longhorn 將自動(dòng)附加卷并在需要執(zhí)行周期性快照/備份(recurring snapshot/backup)時(shí)進(jìn)行快照/備份。
請(qǐng)注意,在卷自動(dòng)附加(attached automatically)期間,卷尚未準(zhǔn)備好處理工作負(fù)載。Workload 必須等到 recurring job 完成。
容災(zāi)卷
容災(zāi) (DR) 卷是一種特殊卷,主要用于在整個(gè)主集群出現(xiàn)故障時(shí)將數(shù)據(jù)存儲(chǔ)在備份集群中。災(zāi)難恢復(fù)卷用于提高 Longhorn 卷的彈性。
對(duì)于災(zāi)難恢復(fù)卷,Last Backup 表示其原始備份卷的最新備份。
如果代表災(zāi)難卷的圖標(biāo)為灰色,則表示該卷正在恢復(fù) Last Backup,并且該卷無(wú)法激活。如果圖標(biāo)為藍(lán)色,則表示該卷已恢復(fù) Last Backup。
創(chuàng)建容災(zāi)(DR)卷
先決條件: 設(shè)置兩個(gè) Kubernetes 集群。它們將被稱為集群 A 和集群 B。在兩個(gè)集群上安裝 Longhorn,并在兩個(gè)集群上設(shè)置相同的備份目標(biāo)。
- 在集群 A 中,確保原始卷 X 已創(chuàng)建備份或已安排 recurring backups。
- 在集群 B 的備份頁(yè)面,選擇備份卷 X,然后創(chuàng)建容災(zāi)卷 Y。強(qiáng)烈建議使用備份卷名作為容災(zāi)卷名。
- Longhorn 會(huì)自動(dòng)將 DR 卷 Y 附加到隨機(jī)節(jié)點(diǎn)。然后 Longhorn 將開(kāi)始輪詢卷 X 的最后一次備份,并將其增量恢復(fù)到卷 Y。
設(shè)置備份目標(biāo)
備份目標(biāo)是用于訪問(wèn) Longhorn 中 backupstore 的端點(diǎn)。backupstore 是 NFS 服務(wù)器或 S3 兼容服務(wù)器,用于存儲(chǔ) Longhorn 卷的備份。備份目標(biāo)可以在 Settings/General/BackupTarget 中設(shè)置。
如果您無(wú)權(quán)訪問(wèn) AWS S3 或想先嘗試備份存儲(chǔ),我們還提供了一種使用 MinIO 設(shè)置本地 S3 測(cè)試備份存儲(chǔ)的方法。
Longhorn 還支持通過(guò) Longhorn UI 或 Kubernetes Storage Class 為卷設(shè)置周期性快照/備份(recurring snapshot/backup)作業(yè)。
設(shè)置 AWS S3 備份存儲(chǔ)
在 AWS S3 中創(chuàng)建一個(gè)新存儲(chǔ)桶。
為 Longhorn 設(shè)置權(quán)限。有兩種設(shè)置憑據(jù)的選項(xiàng)。首先,您可以使用 AWS IAM 用戶的憑證設(shè)置 Kubernetes secret。第二個(gè)是您可以使用第三方應(yīng)用程序通過(guò) annotations 來(lái)管理 Pod 的臨時(shí) AWS IAM 權(quán)限,而不是使用 AWS 憑證進(jìn)行操作。
- 選項(xiàng) 1:使用 IAM 用戶憑證創(chuàng)建 Kubernetes secret
- 選項(xiàng) 2:通過(guò) AWS STS AssumeRole(kube2iam 或 kiam)使用 IAM 臨時(shí)憑證設(shè)置權(quán)限
kube2iam 或 kiam 是一個(gè) Kubernetes 應(yīng)用程序,它允許通過(guò) annotations 而不是操作 AWS 憑證來(lái)管理 Pod 的 AWS IAM 權(quán)限。按照 kube2iam 或 kiam 的 GitHub 存儲(chǔ)庫(kù)中的說(shuō)明將其安裝到 Kubernetes 集群中。
按照指南為 AWS S3 服務(wù)創(chuàng)建新的 AWS IAM 角色,并設(shè)置以下權(quá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>/*"
- ]
- }
- ]
- }
使用以下信任關(guān)系編輯 AWS IAM 角色:
- {
- "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"
- }
- ]
- }
在 Longhorn 所在的命名空間(默認(rèn)為 longhorn-system)中創(chuàng)建一個(gè)名稱為 aws-secret 的 Kubernetes secret。secret 必須在 longhorn-system 命名空間中創(chuàng)建,以便 Longhorn 訪問(wèn)它:
- kubectl create secret generic <aws-secret> \
- --from-literal=AWS_IAM_ROLE_ARN=<your-aws-iam-role-arn> \
- -n longhorn-system
按照指南創(chuàng)建新的 AWS IAM 用戶,并設(shè)置以下權(quán)限。編輯 Resource 部分以使用您的 S3存儲(chǔ)桶名稱:
- {
- "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>/*"
- ]
- }
- ]
- }
在放置 Longhorn 的命名空間(默認(rèn)為 longhorn-system)中創(chuàng)建一個(gè)名稱為 aws-secret 的 Kubernetes secret。secret 必須在 longhorn-system 命名空間中創(chuàng)建,以便 Longhorn 訪問(wè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
轉(zhuǎn)到 Longhorn UI。在頂部導(dǎo)航欄中,單擊 Settings。 在 Backup 部分中,將 Backup Target 設(shè)置為:
- s3://<your-bucket-name>@<your-aws-region>/
確保末尾有 /,否則會(huì)報(bào)錯(cuò)。可以使用子目錄(前綴):
- s3://<your-bucket-name>@<your-aws-region>/mypath/
還要確保您在 URL 中設(shè)置了
例如,對(duì)于 AWS,您可以在:https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RegionsAndAvailabilityZones.html 找到區(qū)域代碼(region codes)。
對(duì)于 Google Cloud Storage,您可以在:https://cloud.google.com/storage/docs/locations 找到區(qū)域代碼。
在備份部分將 備份目標(biāo)憑據(jù) Secret(Backup Target Credential Secret) 設(shè)置為:
- aws-secret
這是具有 AWS 憑證或 AWS IAM 角色的 secret 名稱。
Result: Longhorn 可以在 S3 中存儲(chǔ)備份。要?jiǎng)?chuàng)建備份,請(qǐng)參閱本節(jié)。
Note: 如果您在代理后面操作 Longhorn 并且您想使用 AWS S3 作為備份存儲(chǔ),您必須在 aws-secret 中提供有關(guān)您的代理的 Longhorn 信息,如下所示:
- 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
確保 NO_PROXY 包含不應(yīng)使用代理(proxy)的網(wǎng)絡(luò)地址(network addresses)、網(wǎng)絡(luò)地址范圍和域(network address ranges and domains)。為了讓 Longhorn 運(yùn)行,NO_PROXY 的最低要求值為:
- localhost
- 127.0.0.1
- 0.0.0.0
- 10.0.0.0/8 (K8s components' IPs)
- 192.168.0.0/16 (internal IPs in the cluster)
設(shè)置本地測(cè)試備份存儲(chǔ)
我們?cè)?./deploy/backupstores 中提供了兩個(gè)基于 NFS server 和 MinIO S3 server 的測(cè)試目的備份存儲(chǔ)(backupstore)。
創(chuàng)建 longhorn-system 后,使用以下命令為備份存儲(chǔ)設(shè)置 MinIO S3 服務(wù)器。
- kubectl create -f https://raw.githubusercontent.com/longhorn/longhorn/master/deploy/backupstores/minio-backupstore.yaml
轉(zhuǎn)到 Longhorn UI。在頂部導(dǎo)航欄中,單擊 Settings。在 Backup 部分,將 Backup Target 設(shè)置為
- s3://backupbucket@us-east-1/
并將 Backup Target Credential Secret(備份目標(biāo)憑據(jù) Secret) 設(shè)置為:
- minio-secret
minio-secret yaml 如下所示:
- 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: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURMRENDQWhTZ0F3SUJBZ0lSQU1kbzQycGhUZXlrMTcvYkxyWjVZRHN3RFFZSktvWklodmNOQVFFTEJRQXcKR2pFWU1CWUdBMVVFQ2hNUFRHOXVaMmh2Y200Z0xTQlVaWE4wTUNBWERUSXdNRFF5TnpJek1EQXhNVm9ZRHpJeApNakF3TkRBek1qTXdNREV4V2pBYU1SZ3dGZ1lEVlFRS0V3OU1iMjVuYUc5eWJpQXRJRlJsYzNRd2dnRWlNQTBHCkNTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEWHpVdXJnUFpEZ3pUM0RZdWFlYmdld3Fvd2RlQUQKODRWWWF6ZlN1USs3K21Oa2lpUVBvelVVMmZvUWFGL1BxekJiUW1lZ29hT3l5NVhqM1VFeG1GcmV0eDBaRjVOVgpKTi85ZWFJNWRXRk9teHhpMElPUGI2T0RpbE1qcXVEbUVPSXljdjRTaCsvSWo5Zk1nS0tXUDdJZGxDNUJPeThkCncwOVdkckxxaE9WY3BKamNxYjN6K3hISHd5Q05YeGhoRm9tb2xQVnpJbnlUUEJTZkRuSDBuS0lHUXl2bGhCMGsKVHBHSzYxc2prZnFTK3hpNTlJeHVrbHZIRXNQcjFXblRzYU9oaVh6N3lQSlorcTNBMWZoVzBVa1JaRFlnWnNFbQovZ05KM3JwOFhZdURna2kzZ0UrOElXQWRBWHExeWhqRDdSSkI4VFNJYTV0SGpKUUtqZ0NlSG5HekFnTUJBQUdqCmF6QnBNQTRHQTFVZER3RUIvd1FFQXdJQ3BEQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBVEFQQmdOVkhSTUIKQWY4RUJUQURBUUgvTURFR0ExVWRFUVFxTUNpQ0NXeHZZMkZzYUc5emRJSVZiV2x1YVc4dGMyVnlkbWxqWlM1awpaV1poZFd4MGh3Ui9BQUFCTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFDbUZMMzlNSHVZMzFhMTFEajRwMjVjCnFQRUM0RHZJUWozTk9kU0dWMmQrZjZzZ3pGejFXTDhWcnF2QjFCMVM2cjRKYjJQRXVJQkQ4NFlwVXJIT1JNU2MKd3ViTEppSEtEa0Jmb2U5QWI1cC9VakpyS0tuajM0RGx2c1cvR3AwWTZYc1BWaVdpVWorb1JLbUdWSTI0Q0JIdgpnK0JtVzNDeU5RR1RLajk0eE02czNBV2xHRW95YXFXUGU1eHllVWUzZjFBWkY5N3RDaklKUmVWbENtaENGK0JtCmFUY1RSUWN3cVdvQ3AwYmJZcHlERFlwUmxxOEdQbElFOW8yWjZBc05mTHJVcGFtZ3FYMmtYa2gxa3lzSlEralAKelFadHJSMG1tdHVyM0RuRW0yYmk0TktIQVFIcFc5TXUxNkdRakUxTmJYcVF0VEI4OGpLNzZjdEg5MzRDYWw2VgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
有關(guān)創(chuàng)建 secret 的更多信息,請(qǐng)參閱 Kubernetes 文檔。 secret 必須在 longhorn-system 命名空間中創(chuàng)建,以便 Longhorn 訪問(wèn)它。
Note: 生成 base64 編碼時(shí)一定要使用 echo -n,否則會(huì)在字符串末尾添加新行,訪問(wèn) S3 時(shí)會(huì)出錯(cuò)。
單擊 UI 中的 Backup 選項(xiàng)卡。它應(yīng)該報(bào)告一個(gè)沒(méi)有任何錯(cuò)誤的空列表。
Result: Longhorn 可以在 S3 中存儲(chǔ)備份。
使用自簽名 SSL 證書進(jìn)行 S3 通信
如果要使用自簽名 SSL 證書,可以在提供給 Longhorn 的 Kubernetes secret 中指定 AWS_CERT。 請(qǐng)參閱設(shè)置本地測(cè)試備份存儲(chǔ)中的示例。 需要注意的是,證書需要采用 PEM 格式,并且必須是其自己的 CA。 或者必須包含一個(gè)包含 CA 證書的證書鏈。 要包含多個(gè)證書,只需連接不同的證書(PEM 文件)即可。
為 S3 兼容的備份存儲(chǔ)啟用 virtual-hosted-style 訪問(wèn)
在以下情況下,您可能需要為 S3 兼容的備份存儲(chǔ)啟用這種新的尋址方法
- 您想立即切換到這種新的訪問(wèn)方式,這樣您就無(wú)需擔(dān)心 Amazon S3 路徑棄用計(jì)劃;
- 您使用的 backupstore 只支持 virtual-hosted-style 的訪問(wèn),例如:Alibaba Cloud(Aliyun) OSS;
- 您已配置 MINIO_DOMAIN 環(huán)境變量以啟用 MinIO 服務(wù)器的 virtual-host-style 請(qǐng)求;
- 這個(gè)錯(cuò)誤 ...... error: AWS Error: SecondLevelDomainForbidden Please use virtual hosted style to access. ..... 被觸發(fā)。
啟用 virtual-hosted-style 訪問(wèn)的方法
將值為 true 的新字段 VIRTUAL_HOSTED_STYLE 添加到您的備份目標(biāo) secret。例如:
- 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
部署/更新(Deploy/update) secret,并在 Settings/General/BackupTargetSecret 中設(shè)置它。
NFS 備份存儲(chǔ)
要將 NFS 服務(wù)器用作備份存儲(chǔ),NFS 服務(wù)器必須支持 NFSv4。
目標(biāo) URL 應(yīng)如下所示:
- nfs://longhorn-test-nfs-svc.default:/opt/backupstore
Result: Longhorn 可以在 NFS 中存儲(chǔ)備份。
創(chuàng)建備份
Longhorn 中的 Backups 是集群外備份存儲(chǔ)中的對(duì)象。快照的備份被復(fù)制到備份存儲(chǔ),訪問(wèn)備份存儲(chǔ)的端點(diǎn)是備份目標(biāo)。
先決條件: 必須設(shè)置備份目標(biāo)。有關(guān)更多信息,請(qǐng)參閱設(shè)置備份目標(biāo)。如果尚未設(shè)置 BackupTarget,則會(huì)出現(xiàn)錯(cuò)誤。
要?jiǎng)?chuàng)建備份,
- 導(dǎo)航到 Volume 菜單。
- 選擇要備份的卷。
- 單擊 Create Backup。
- 添加適當(dāng)?shù)臉?biāo)簽并單擊 OK。
Result: 備份已創(chuàng)建。要查看它,請(qǐng)單擊頂部導(dǎo)航欄中的 Backup。
從備份恢復(fù)
Longhorn 可以輕松地將備份恢復(fù)到一個(gè)卷。
還原備份時(shí),默認(rèn)情況下會(huì)創(chuàng)建一個(gè)同名的卷。如果已存在與備份同名的卷,則不會(huì)恢復(fù)備份。
要恢復(fù)備份,
- 導(dǎo)航到 Backup 菜單
- 選擇您要恢復(fù)的備份,然后單擊 Restore Latest Backup
- 在 Name 字段中,選擇要恢復(fù)的卷
- 單擊 OK
Result: 恢復(fù)的卷在 Volume 頁(yè)面上可用。
為 Kubernetes StatefulSets 恢復(fù)卷
Longhorn 支持恢復(fù)備份,該特性的一個(gè)用例是恢復(fù) Kubernetes StatefulSet 中使用的數(shù)據(jù),這需要為備份的每個(gè)副本恢復(fù)一個(gè)卷。
要恢復(fù),請(qǐng)按照以下說(shuō)明操作。下面的示例使用一個(gè) StatefulSet,其中一個(gè)卷附加到每個(gè) Pod 和兩個(gè)副本。
連接到 Web 瀏覽器中的 Longhorn UI 頁(yè)面。在 Backup 選項(xiàng)卡下,選擇 StatefulSet 卷的名稱。單擊卷?xiàng)l目的下拉菜單并恢復(fù)它。將卷命名為稍后可以輕松引用的 Persistent Volumes。
Backup Name | Restored Volume |
---|---|
pvc-01a | statefulset-vol-0 |
pvc-02b | statefulset-vol-1 |
對(duì)需要恢復(fù)的每個(gè)卷重復(fù)此步驟。
例如,如果使用具有名為 pvc-01a 和 pvc-02b 的卷的兩個(gè)副本恢復(fù) StatefulSet,則恢復(fù)可能如下所示:
在 Kubernetes 中,為每個(gè)創(chuàng)建的 Longhorn 卷創(chuàng)建一個(gè) Persistent Volume。將卷命名為稍后可以輕松引用的 Persistent Volume Claims。storage 容量、numberOfReplicas、storageClassName 和 volumeHandle 必須在下面替換。在這個(gè)例子中,我們?cè)?Longhorn 中引用了 statefulset-vol-0 和 statefulset-vol-1,并使用 longhorn 作為我們的 storageClassName。
- apiVersion: v1
- kind: PersistentVolume
- metadata:
- name: statefulset-vol-0
- spec:
- capacity:
- storage: <size> # must match size of Longhorn volume
- volumeMode: Filesystem
- accessModes:
- - ReadWriteOnce
- persistentVolumeReclaimPolicy: Delete
- csi:
- driver: driver.longhorn.io # driver must match this
- fsType: ext4
- volumeAttributes:
- numberOfReplicas: <replicas> # must match Longhorn volume value
- staleReplicaTimeout: '30' # in minutes
- volumeHandle: statefulset-vol-0 # must match volume name from Longhorn
- storageClassName: longhorn # must be same name that we will use later
- ---
- apiVersion: v1
- kind: PersistentVolume
- metadata:
- name: statefulset-vol-1
- spec:
- capacity:
- storage: <size> # must match size of Longhorn volume
- volumeMode: Filesystem
- accessModes:
- - ReadWriteOnce
- persistentVolumeReclaimPolicy: Delete
- csi:
- driver: driver.longhorn.io # driver must match this
- fsType: ext4
- volumeAttributes:
- numberOfReplicas: <replicas> # must match Longhorn volume value
- staleReplicaTimeout: '30'
- volumeHandle: statefulset-vol-1 # must match volume name from Longhorn
- storageClassName: longhorn # must be same name that we will use later
在 namespace 中,將部署 StatefulSet,為每個(gè) Persistent Volume 創(chuàng)建 PersistentVolume Claims。Persistent Volume Claim 的名稱必須遵循以下命名方案:
- <name of Volume Claim Template>-<name of StatefulSet>-<index>
StatefulSet Pod 是零索引(zero-indexed)的。 在這個(gè)例子中,Volume Claim Template 的名字是 data,StatefulSet 的名字是 webapp, 并且有兩個(gè)副本,分別是索引 0 和 1。
- apiVersion: v1
- kind: PersistentVolumeClaim
- metadata:
- name: data-webapp-0
- spec:
- accessModes:
- - ReadWriteOnce
- resources:
- requests:
- storage: 2Gi # must match size from earlier
- storageClassName: longhorn # must match name from earlier
- volumeName: statefulset-vol-0 # must reference Persistent Volume
- ---
- apiVersion: v1
- kind: PersistentVolumeClaim
- metadata:
- name: data-webapp-1
- spec:
- accessModes:
- - ReadWriteOnce
- resources:
- requests:
- storage: 2Gi # must match size from earlier
- storageClassName: longhorn # must match name from earlier
- volumeName: statefulset-vol-1 # must reference Persistent Volume
創(chuàng)建 StatefulSet:
- apiVersion: apps/v1beta2
- kind: StatefulSet
- metadata:
- name: webapp # match this with the PersistentVolumeClaim naming scheme
- spec:
- selector:
- matchLabels:
- app: nginx # has to match .spec.template.metadata.labels
- serviceName: "nginx"
- replicas: 2 # by default is 1
- template:
- metadata:
- labels:
- app: nginx # has to match .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 # match this with the PersistentVolumeClaim naming scheme
- spec:
- accessModes: [ "ReadWriteOnce" ]
- storageClassName: longhorn # must match name from earlier
- resources:
- requests:
- storage: 2Gi # must match size from earlier
Result: 現(xiàn)在應(yīng)該可以從 StatefulSet Pods 內(nèi)部訪問(wèn)恢復(fù)的數(shù)據(jù)。
在集群上啟用 CSI 快照支持
先決條件
CSI 快照支持可用于 Kubernetes 版本 >= 1.17。
Kubernetes 發(fā)行版負(fù)責(zé)部署快照控制器(snapshot controller)以及相關(guān)的自定義資源定義。
有關(guān)更多信息,請(qǐng)參閱 CSI 卷快照。
添加一個(gè)默認(rèn)的 VolumeSnapshotClass
確保 Snapshot Beta CRD 的可用性。然后創(chuàng)建一個(gè)默認(rèn)的 VolumeSnapshotClass。
- kind: VolumeSnapshotClass
- apiVersion: snapshot.storage.k8s.io/v1beta1
- metadata:
- name: longhorn
- driver: driver.longhorn.io
- deletionPolicy: Delete
如果您在 Air Gap 環(huán)境中從以前的 Longhorn 版本進(jìn)行更新
- 更新 csi-provisioner 鏡像到 longhornio/csi-provisioner:v1.6.0
- 更新 csi-snapshotter 鏡像到 longhornio/csi-snapshotter:v2.1.1
如果您的 Kubernetes 發(fā)行版未捆綁 Snapshot Controller
您可以通過(guò)執(zhí)行以下步驟手動(dòng)安裝這些組件。
請(qǐng)注意,下面提到的 snapshot controller YAML 文件部署到 default 命名空間中。
先決條件
對(duì)于一般用途,請(qǐng)?jiān)诎惭b之前使用適當(dāng)?shù)?namespace 更新 snapshot controller YAML。
例如,在 vanilla Kubernetes 集群上,在發(fā)出 kubectl create 命令之前,將命名空間從 default 更新為 kube-system。
安裝 Snapshot Beta CRDs:
從 https://github.com/kubernetes-csi/external-snapshotter/tree/release-4.0/client/config/crd 下載文件
運(yùn)行 kubectl create -f client/config/crd.
每個(gè)集群執(zhí)行一次。
安裝 Common Snapshot Controller:
從 https://github.com/kubernetes-csi/external-snapshotter/tree/release-4.0/deploy/kubernetes/snapshot-controller 下載文件
將 namespace 更新為適合您環(huán)境的值(例如:kube-system)
運(yùn)行 kubectl create -f deploy/kubernetes/snapshot-controller
每個(gè)集群執(zhí)行一次。
有關(guān)其他信息,請(qǐng)參閱 kubernetes external-snapshotter git repo 中的 Usage 部分。
通過(guò) CSI 創(chuàng)建備份
Longhorn 中的 Backups 是集群外備份存儲(chǔ)(backupstore)中的對(duì)象,訪問(wèn)備份存儲(chǔ)的端點(diǎn)是備份目標(biāo)。
要以編程方式創(chuàng)建 backups,您可以使用通用的 Kubernetes CSI 快照機(jī)制。
先決條件: 需要在您的集群上啟用 CSI snapshot 支持。 如果您的 kubernetes 發(fā)行版沒(méi)有提供 kubernetes snapshot controller 以及快照相關(guān)的自定義資源定義,您需要手動(dòng)部署它們 更多信息,參閱 Enable CSI Snapshot Support
通過(guò) CSI Mechanism 創(chuàng)建備份
要使用 CSI 機(jī)制創(chuàng)建備份,請(qǐng)通過(guò) kubectl 創(chuàng)建一個(gè) Kubernetes VolumeSnapshot 對(duì)象。
Result: 已創(chuàng)建備份。VolumeSnapshot 對(duì)象的創(chuàng)建導(dǎo)致了 VolumeSnapshotContent Kubernetes 對(duì)象的創(chuàng)建。
VolumeSnapshotContent 是指其 VolumeSnapshotContent.snapshotHandle 字段中名為 bs://backup-volume/backup-name 的 Longhorn backup。
CSI Mechanism 工作原理
當(dāng)使用 kubectl 創(chuàng)建 VolumeSnapshot 對(duì)象時(shí),VolumeSnapshot.uuid 字段用于標(biāo)識(shí) Longhorn snapshot 和關(guān)聯(lián)的 VolumeSnapshotContent 對(duì)象。
這將創(chuàng)建一個(gè)名為 snapshot-uuid 的新 Longhorn snapshot。
然后啟動(dòng)該 snapshot 的 backup,并返回 CSI request。
然后創(chuàng)建一個(gè)名為 snapcontent-uuid 的 VolumeSnapshotContent 對(duì)象。
CSI snapshotter sidecar 定期查詢 Longhorn CSI 插件以評(píng)估備份狀態(tài)(backup status)。
備份完成后,VolumeSnapshotContent.readyToUse 標(biāo)志設(shè)置為 true。
查看備份
要查看備份,請(qǐng)單擊頂部導(dǎo)航欄中的 Backup 并導(dǎo)航到 VolumeSnapshotContent.snapshotHandle 中提到的備份卷(backup-volume)。
VolumeSnapshot 示例
下面是一個(gè)示例 VolumeSnapshot 對(duì)象。source 需要指向應(yīng)為其創(chuàng)建備份的 Longhorn volume 的 PVC。
volumeSnapshotClassName 字段指向一個(gè) VolumeSnapshotClass。
我們創(chuàng)建了一個(gè)名為 longhorn 的默認(rèn)類,它使用 Delete 作為它的 deletionPolicy。
- apiVersion: snapshot.storage.k8s.io/v1beta1
- kind: VolumeSnapshot
- metadata:
- name: test-snapshot-pvc
- spec:
- volumeSnapshotClassName: longhorn
- source:
- persistentVolumeClaimName: test-vol
如果您希望在刪除 VolumeSnapshot 時(shí)保留卷的關(guān)聯(lián)備份,請(qǐng)創(chuàng)建一個(gè)新的 VolumeSnapshotClass,并將 Retain 設(shè)置為 deletionPolicy。
有關(guān)快照類的更多信息,請(qǐng)參閱 VolumeSnapshotClasses 的 kubernetes 文檔。
通過(guò) CSI 恢復(fù)備份
Longhorn 可以輕松地將備份恢復(fù)到一個(gè)卷。
要以編程方式恢復(fù)備份,您可以使用通用的 kubernetes csi 快照機(jī)制。
先決條件
需要在您的集群上啟用 CSI 快照支持。
如果您的 Kubernetes 發(fā)行版未提供 Kubernetes snapshot controller 以及與快照相關(guān)的自定義資源定義,則您需要手動(dòng)部署它們。
通過(guò) VolumeSnapshot 對(duì)象恢復(fù)備份
創(chuàng)建一個(gè) PersistentVolumeClaim 對(duì)象,其中 dataSource 字段指向現(xiàn)有的 VolumeSnapshot 對(duì)象。
csi-provisioner 將獲取它并指示 Longhorn CSI driver 使用關(guān)聯(lián)備份(associated backup)中的數(shù)據(jù)來(lái)配置新卷。
您可以使用相同的機(jī)制來(lái)恢復(fù)尚未通過(guò) CSI 機(jī)制創(chuàng)建的 Longhorn 備份。
下面是一個(gè) PersistentVolumeClaim 示例。 dataSource 字段需要指向現(xiàn)有的 VolumeSnapshot 對(duì)象。
- 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
還原沒(méi)有關(guān)聯(lián) VolumeSnapshot 的備份
要恢復(fù)未通過(guò) CSI 機(jī)制創(chuàng)建的 Longhorn 備份,您必須首先手動(dòng)為備份創(chuàng)建 VolumeSnapshot 和 VolumeSnapshotContent 對(duì)象。
創(chuàng)建一個(gè) VolumeSnapshotContent 對(duì)象,并將 snapshotHandle 字段設(shè)置為 bs://backup-volume/backup-name。
backup-volume 和 backup-name 值可以從 Longhorn UI 的 Backup 頁(yè)面檢索。
- apiVersion: snapshot.storage.k8s.io/v1beta1
- kind: VolumeSnapshotContent
- metadata:
- name: test-existing-backup
- spec:
- volumeSnapshotClassName: longhorn
- driver: driver.longhorn.io
- deletionPolicy: Delete
- source:
- # NOTE: change this to point to an existing backup on the backupstore
- snapshotHandle: bs://test-vol/backup-625159fb469e492e
- volumeSnapshotRef:
- name: test-snapshot-existing-backup
- namespace: default
創(chuàng)建關(guān)聯(lián)的 VolumeSnapshot 對(duì)象,并將 name 字段設(shè)置為 test-snapshot-existing-backup,其中 source 字段通過(guò) volumeSnapshotContentName 字段引用 VolumeSnapshotContent 對(duì)象。
這與創(chuàng)建 backup 不同,在這種情況下,source 字段通過(guò) persistentVolumeClaimName 字段引用 PerstistentVolumeClaim。
只能為 VolumeSnapshot 對(duì)象設(shè)置一種類型的引用。
- apiVersion: snapshot.storage.k8s.io/v1beta1
- kind: VolumeSnapshot
- metadata:
- name: test-snapshot-existing-backup
- spec:
- volumeSnapshotClassName: longhorn
- source:
- volumeSnapshotContentName: test-existing-backup
現(xiàn)在您可以創(chuàng)建一個(gè)引用新創(chuàng)建的 VolumeSnapshot 對(duì)象的 PerstistentVolumeClaim 對(duì)象。