
內容來源於官方 Longhorn 1.1.2 英文技術手冊。
系列
- Longhorn 是什么?
- Longhorn 企業級雲原生容器分布式存儲解決方案設計架構和概念
- Longhorn 企業級雲原生容器分布式存儲-部署篇
- Longhorn 企業級雲原生容器分布式存儲-券(Volume)和節點(Node)
- Longhorn,企業級雲原生容器分布式存儲-K8S 資源配置示例
- Longhorn,企業級雲原生容器分布式存儲 - 監控(Prometheus+AlertManager+Grafana)
目錄
- 創建一個快照
- 周期性(
Recurring)快照和備份- 使用
Longhorn UI設置周期性快照 - 使用
StorageClass設置Recurring Jobs - 分離卷時允許
Recurring Job
- 使用
- 容災卷
- 創建容災(
DR)卷
- 創建容災(
- 設置備份目標
- 設置
AWS S3備份存儲 - 設置本地測試備份存儲
- 使用自簽名
SSL證書進行S3通信 - 為
S3兼容的備份存儲啟用virtual-hosted-style訪問 NFS備份存儲
- 設置
- 創建備份
- 從備份恢復
- 為
Kubernetes StatefulSets恢復卷 - 在集群上啟用
CSI快照支持- 添加一個默認的
VolumeSnapshotClass - 如果您在
Air Gap環境中從以前的Longhorn版本進行更新 - 如果您的
Kubernetes發行版未捆綁Snapshot Controller
- 添加一個默認的
- 通過
CSI創建備份 - 通過
CSI Mechanism創建備份CSI Mechanism工作原理- 查看備份
VolumeSnapshot示例
- 通過
CSI恢復備份 - 通過
VolumeSnapshot對象恢復備份- 還原沒有關聯
VolumeSnapshot的備份
- 還原沒有關聯
創建一個快照
snapshot 是 Kubernetes Volume 在任何給定時間點的狀態。
要創建現有集群的快照,
- 在
Longhorn UI的頂部導航欄中,單擊 Volume。 - 單擊要為其創建快照的卷的名稱。這會導致卷詳細信息頁面。
- 單擊 Take Snapshot 按鈕。
創建快照后,您將在卷頭(Volume Head)之前的卷的快照列表中看到它。
周期性快照和備份
從 Longhorn UI,可以安排周期性快照和備份。
要設置時間表(schedule),您將轉到 Longhorn 中的卷詳細信息視圖。然后你將設置:
schedule類型,備份(backup)或快照(snapshot)- 將創建備份或快照的時間,以 CRON expression 的形式
- 要保留的備份或快照的數量
- 應應用於備份或快照的任何標簽(
Any labels)
然后 Longhorn 會自動為當時的用戶創建快照或備份,只要該卷附加到一個節點。
可以使用 Longhorn UI 或使用 Kubernetes StorageClass 配置周期性快照。
注意:為了避免當卷長時間沒有新數據時,
recurring jobs可能會用相同的備份和空快照覆蓋舊的備份/快照的問題,Longhorn執行以下操作:
Recurring backup job僅在自上次備份以來卷有新數據時才進行新備份。Recurring snapshot job僅在卷頭(volume head)中有新數據(實時數據)時才拍攝新快照。
使用 Longhorn UI 設置周期性快照
可以從卷詳細信息頁面配置周期性快照和備份。要導航到此頁面,請單擊 Volume,,然后單擊卷的名稱。
使用 StorageClass 設置 Recurring Jobs
可以在 StorageClass 的 recurringJobs 參數中配置計划備份和快照。
使用這個 StorageClass 創建的任何未來卷都將自動設置這些 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 指定以下參數:
-
name:一項job的名稱。不要在一個recurringJobs中使用重復的名稱。 並且name的長度不能超過8個字符。 -
task:一項job的類型。它僅支持snapshot(定期創建快照)或backup(定期創建快照然后進行備份)。 -
cron:Cron表達式。它告訴一項job的執行時間。 -
retain:Longhorn將為一項job保留多少快照/備份(snapshots/backups)。應該不少於1。
分離卷時允許 Recurring Job
Longhorn 提供了 allow-recurring-job-while-volume-detached 設置,即使卷已分離,您也可以進行周期性備份(recurring backup)。您可以在 Longhorn UI 中找到該設置。
啟用該設置后,Longhorn 將自動附加卷並在需要執行周期性快照/備份(recurring snapshot/backup)時進行快照/備份。
請注意,在卷自動附加(attached automatically)期間,卷尚未准備好處理工作負載。Workload 必須等到 recurring job 完成。
容災卷
容災 (DR) 卷是一種特殊卷,主要用於在整個主集群出現故障時將數據存儲在備份集群中。災難恢復卷用於提高 Longhorn 卷的彈性。
對於災難恢復卷,Last Backup 表示其原始備份卷的最新備份。
如果代表災難卷的圖標為灰色,則表示該卷正在恢復 Last Backup,並且該卷無法激活。如果圖標為藍色,則表示該卷已恢復 Last Backup。
創建容災(DR)卷
先決條件: 設置兩個
Kubernetes集群。它們將被稱為集群 A 和集群 B。在兩個集群上安裝 Longhorn,並在兩個集群上設置相同的備份目標。
- 在集群
A中,確保原始卷X已創建備份或已安排recurring backups。 - 在集群
B的備份頁面,選擇備份卷X,然后創建容災卷Y。強烈建議使用備份卷名作為容災卷名。 Longhorn會自動將DR卷Y附加到隨機節點。然后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)作業。
設置 AWS S3 備份存儲
-
在 AWS S3 中創建一個新存儲桶。
-
為
Longhorn設置權限。有兩種設置憑據的選項。首先,您可以使用AWS IAM用戶的憑證設置Kubernetes secret。第二個是您可以使用第三方應用程序通過annotations來管理Pod的臨時AWS IAM權限,而不是使用AWS憑證進行操作。-
選項 1:使用
IAM用戶憑證創建Kubernetes secret-
按照指南創建新的
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:::<your-bucket-name>", "arn:aws:s3:::<your-bucket-name>/*" ] } ] } -
在放置
Longhorn的命名空間(默認為longhorn-system)中創建一個名稱為aws-secret的Kubernetes secret。secret必須在longhorn-system命名空間中創建,以便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> \ -n longhorn-system
-
-
選項 2:通過
AWS STS AssumeRole(kube2iam或kiam)使用IAM臨時憑證設置權限kube2iam 或 kiam 是一個
Kubernetes應用程序,它允許通過annotations而不是操作AWS憑證來管理Pod的AWS IAM權限。按照kube2iam或kiam的GitHub存儲庫中的說明將其安裝到Kubernetes集群中。-
按照指南為
AWS S3服務創建新的AWS IAM角色,並設置以下權限:{ "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>/*" ] } ] } -
使用以下信任關系編輯
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所在的命名空間(默認為longhorn-system)中創建一個名稱為aws-secret的Kubernetes secret。secret必須在longhorn-system命名空間中創建,以便Longhorn訪問它:kubectl create secret generic <aws-secret> \ --from-literal=AWS_IAM_ROLE_ARN=<your-aws-iam-role-arn> \ -n longhorn-system
-
-
-
轉到
Longhorn UI。在頂部導航欄中,單擊 Settings。 在Backup部分中,將 Backup Target 設置為:s3://<your-bucket-name>@<your-aws-region>/確保末尾有
/,否則會報錯。可以使用子目錄(前綴):s3://<your-bucket-name>@<your-aws-region>/mypath/還要確保您在 URL 中設置了
<your-aws-region>。例如,對於
AWS,您可以在:https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RegionsAndAvailabilityZones.html 找到區域代碼(region codes)。對於
Google Cloud Storage,您可以在:https://cloud.google.com/storage/docs/locations
找到區域代碼。 -
在備份部分將 備份目標憑據 Secret(Backup Target Credential Secret) 設置為:
aws-secret這是具有
AWS憑證或AWS IAM角色的secret名稱。
Result: Longhorn 可以在 S3 中存儲備份。要創建備份,請參閱本節。
Note: 如果您在代理后面操作 Longhorn 並且您想使用 AWS S3 作為備份存儲,您必須在 aws-secret 中提供有關您的代理的 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 包含不應使用代理(proxy)的網絡地址(network addresses)、網絡地址范圍和域(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)。
-
創建
longhorn-system后,使用以下命令為備份存儲設置MinIO S3服務器。kubectl create -f https://raw.githubusercontent.com/longhorn/longhorn/master/deploy/backupstores/minio-backupstore.yaml -
轉到
Longhorn UI。在頂部導航欄中,單擊 Settings。在Backup部分,將 Backup Target 設置為s3://backupbucket@us-east-1/並將 Backup Target Credential Secret(備份目標憑據 Secret) 設置為:
minio-secretminio-secretyaml 如下所示: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==有關創建
secret的更多信息,請參閱 Kubernetes 文檔。
secret必須在longhorn-system命名空間中創建,以便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環境變量以啟用 MinIO 服務器的 virtual-host-style 請求; - 這個錯誤
...... error: AWS Error: SecondLevelDomainForbidden Please use virtual hosted style to access. .....被觸發。
啟用 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 中存儲備份。
創建備份
Longhorn 中的 Backups 是集群外備份存儲中的對象。快照的備份被復制到備份存儲,訪問備份存儲的端點是備份目標。
先決條件: 必須設置備份目標。有關更多信息,請參閱
設置備份目標。如果尚未設置BackupTarget,則會出現錯誤。
要創建備份,
- 導航到 Volume 菜單。
- 選擇要備份的卷。
- 單擊 Create Backup。
- 添加適當的標簽並單擊
OK。
Result: 備份已創建。要查看它,請單擊頂部導航欄中的 Backup。
從備份恢復
Longhorn 可以輕松地將備份恢復到一個卷。
還原備份時,默認情況下會創建一個同名的卷。如果已存在與備份同名的卷,則不會恢復備份。
要恢復備份,
- 導航到 Backup 菜單
- 選擇您要恢復的備份,然后單擊 Restore Latest Backup
- 在 Name 字段中,選擇要恢復的卷
- 單擊 OK
Result: 恢復的卷在 Volume 頁面上可用。
為 Kubernetes StatefulSets 恢復卷
Longhorn 支持恢復備份,該特性的一個用例是恢復 Kubernetes StatefulSet 中使用的數據,這需要為備份的每個副本恢復一個卷。
要恢復,請按照以下說明操作。下面的示例使用一個 StatefulSet,其中一個卷附加到每個 Pod 和兩個副本。
-
連接到
Web瀏覽器中的Longhorn UI頁面。在Backup選項卡下,選擇StatefulSet卷的名稱。單擊卷條目的下拉菜單並恢復它。將卷命名為稍后可以輕松引用的Persistent Volumes。- 對需要恢復的每個卷重復此步驟。
- 例如,如果使用具有名為
pvc-01a和pvc-02b的卷的兩個副本恢復StatefulSet,則恢復可能如下所示:
Backup Name Restored Volume pvc-01a statefulset-vol-0 pvc-02b statefulset-vol-1 -
在
Kubernetes中,為每個創建的Longhorn卷創建一個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: <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,為每個Persistent Volume創建PersistentVolume Claims。Persistent Volume Claim的名稱必須遵循以下命名方案:<name of Volume Claim Template>-<name of StatefulSet>-<index>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 -
創建
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: 現在應該可以從 StatefulSet Pods 內部訪問恢復的數據。
在集群上啟用 CSI 快照支持
先決條件
CSI快照支持可用於Kubernetes版本 >= 1.17。
Kubernetes發行版負責部署快照控制器(snapshot controller)以及相關的自定義資源定義。有關更多信息,請參閱 CSI 卷快照。
添加一個默認的 VolumeSnapshotClass
確保 Snapshot Beta CRD 的可用性。然后創建一個默認的 VolumeSnapshotClass。
kind: VolumeSnapshotClass
apiVersion: snapshot.storage.k8s.io/v1beta1
metadata:
name: longhorn
driver: driver.longhorn.io
deletionPolicy: Delete
如果您在 Air Gap 環境中從以前的 Longhorn 版本進行更新
- 更新
csi-provisioner鏡像到longhornio/csi-provisioner:v1.6.0 - 更新
csi-snapshotter鏡像到longhornio/csi-snapshotter:v2.1.1
如果您的 Kubernetes 發行版未捆綁 Snapshot Controller
您可以通過執行以下步驟手動安裝這些組件。
請注意,下面提到的 snapshot controller YAML 文件部署到 default 命名空間中。
先決條件
對於一般用途,請在安裝之前使用適當的 namespace 更新
snapshot controller YAML。例如,在
vanilla Kubernetes集群上,在發出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. - 每個集群執行一次。
安裝 Common Snapshot Controller:
- 從 https://github.com/kubernetes-csi/external-snapshotter/tree/release-4.0/deploy/kubernetes/snapshot-controller 下載文件
- 將
namespace更新為適合您環境的值(例如:kube-system) - 運行
kubectl create -f deploy/kubernetes/snapshot-controller - 每個集群執行一次。
有關其他信息,請參閱 kubernetes external-snapshotter git repo 中的 Usage 部分。
通過 CSI 創建備份
Longhorn 中的 Backups 是集群外備份存儲(backupstore)中的對象,訪問備份存儲的端點是備份目標。
要以編程方式創建 backups,您可以使用通用的 Kubernetes CSI 快照機制。
先決條件: 需要在您的集群上啟用
CSI snapshot支持。
如果您的kubernetes發行版沒有提供kubernetes snapshot controller
以及快照相關的自定義資源定義,您需要手動部署它們
更多信息,參閱 Enable CSI Snapshot Support
通過 CSI Mechanism 創建備份
要使用 CSI 機制創建備份,請通過 kubectl 創建一個 Kubernetes VolumeSnapshot 對象。
Result:
已創建備份。VolumeSnapshot 對象的創建導致了 VolumeSnapshotContent Kubernetes 對象的創建。
VolumeSnapshotContent 是指其 VolumeSnapshotContent.snapshotHandle 字段中名為 bs://backup-volume/backup-name 的 Longhorn backup。
CSI Mechanism 工作原理
當使用 kubectl 創建 VolumeSnapshot 對象時,VolumeSnapshot.uuid 字段用於標識 Longhorn snapshot 和關聯的 VolumeSnapshotContent 對象。
這將創建一個名為 snapshot-uuid 的新 Longhorn snapshot。
然后啟動該 snapshot 的 backup,並返回 CSI request。
然后創建一個名為 snapcontent-uuid 的 VolumeSnapshotContent 對象。
CSI snapshotter sidecar 定期查詢 Longhorn CSI 插件以評估備份狀態(backup status)。
備份完成后,VolumeSnapshotContent.readyToUse 標志設置為 true。
查看備份
要查看備份,請單擊頂部導航欄中的 Backup 並導航到 VolumeSnapshotContent.snapshotHandle 中提到的備份卷(backup-volume)。
VolumeSnapshot 示例
下面是一個示例 VolumeSnapshot 對象。source 需要指向應為其創建備份的 Longhorn volume 的 PVC。
volumeSnapshotClassName 字段指向一個 VolumeSnapshotClass。
我們創建了一個名為 longhorn 的默認類,它使用 Delete 作為它的 deletionPolicy。
apiVersion: snapshot.storage.k8s.io/v1beta1
kind: VolumeSnapshot
metadata:
name: test-snapshot-pvc
spec:
volumeSnapshotClassName: longhorn
source:
persistentVolumeClaimName: test-vol
如果您希望在刪除 VolumeSnapshot 時保留卷的關聯備份,請創建一個新的 VolumeSnapshotClass,並將 Retain 設置為 deletionPolicy。
有關快照類的更多信息,請參閱 VolumeSnapshotClasses 的 kubernetes 文檔。
通過 CSI 恢復備份
Longhorn 可以輕松地將備份恢復到一個卷。
要以編程方式恢復備份,您可以使用通用的 kubernetes csi 快照機制。
先決條件
需要在您的集群上啟用 CSI 快照支持。
如果您的
Kubernetes發行版未提供Kubernetes snapshot controller以及與快照相關的自定義資源定義,則您需要手動部署它們。
通過 VolumeSnapshot 對象恢復備份
創建一個 PersistentVolumeClaim 對象,其中 dataSource 字段指向現有的 VolumeSnapshot 對象。
csi-provisioner 將獲取它並指示 Longhorn CSI driver 使用關聯備份(associated backup)中的數據來配置新卷。
您可以使用相同的機制來恢復尚未通過 CSI 機制創建的 Longhorn 備份。
下面是一個 PersistentVolumeClaim 示例。 dataSource 字段需要指向現有的 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
還原沒有關聯 VolumeSnapshot 的備份
要恢復未通過 CSI 機制創建的 Longhorn 備份,您必須首先手動為備份創建 VolumeSnapshot 和 VolumeSnapshotContent 對象。
創建一個 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
創建關聯的 VolumeSnapshot 對象,並將 name 字段設置為 test-snapshot-existing-backup,其中 source 字段通過 volumeSnapshotContentName 字段引用 VolumeSnapshotContent 對象。
這與創建 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
現在您可以創建一個引用新創建的 VolumeSnapshot 對象的 PerstistentVolumeClaim 對象。
公眾號:黑客下午茶
