內容來源於官方 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
的最低要求值為:
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)
設置本地測試備份存儲
我們在 ./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-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==
有關創建
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
對象。
公眾號:黑客下午茶