Longhorn,企業(yè)級云原生容器分布式存儲 - 備份與恢復

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