備份恢復(fù)
Longhorn 提供了備份恢復(fù)功能,要使用這個(gè)功能我們需要給卷創(chuàng)建一個(gè) snapshot 快照,快照是 Kubernetes Volume 在任何指定時(shí)間點(diǎn)的狀態(tài)。
在 Longhorn UI 的 Volume 頁面中點(diǎn)擊要?jiǎng)?chuàng)建快照的卷,進(jìn)入卷的詳細(xì)信息頁面,點(diǎn)擊下方的 Take Snapshot 按鈕即可創(chuàng)建快照了,創(chuàng)建快照后,將在卷頭(Volume Head)之前的快照列表中可以看到它,比如這里我們會(huì)前面測(cè)試使用的 mysql 卷創(chuàng)建一個(gè)快照:
同樣在節(jié)點(diǎn)的數(shù)據(jù)目錄下面也可以看到創(chuàng)建的快照數(shù)據(jù):
? tree /var/lib/longhorn/replicas/pvc-ec17a7e4-7bb4-4456-9380-353db3ed4307-fbf72396/
/var/lib/longhorn/replicas/pvc-ec17a7e4-7bb4-4456-9380-353db3ed4307-fbf72396/
├── revision.counter
├── volume-head-002.img
├── volume-head-002.img.meta
├── volume.meta
├── volume-snap-3b1f877b-24ba-44ec-808e-ab8d4b15f8dd.img
├── volume-snap-3b1f877b-24ba-44ec-808e-ab8d4b15f8dd.img.meta
├── volume-snap-5d403e8e-65e8-46d1-aa54-70aa3280dac4.img
└── volume-snap-5d403e8e-65e8-46d1-aa54-70aa3280dac4.img.meta
0 directories, 8 files
其中的 volume-snap-xxx 后面的數(shù)據(jù)和頁面上的快照名稱是一致的,比如頁面中我們剛剛創(chuàng)建的快照名稱為 3b1f877b-24ba-44ec-808e-ab8d4b15f8dd,其中的 img 文件是鏡像文件,而 img.meta 是保持當(dāng)前快照的元信息:
? cat volume-snap-3b1f877b-24ba-44ec-808e-ab8d4b15f8dd.img.meta
{"Name":"volume-head-001.img","Parent":"volume-snap-5d403e8e-65e8-46d1-aa54-70aa3280dac4.img","Removed":false,"UserCreated":true,"Created":"2022-02-22T07:36:48Z","Labels":null}
元信息里面包含父級(jí)的文件鏡像,這其實(shí)表面快照是增量的快照。
此外除了手動(dòng)創(chuàng)建快照之外,從 Longhorn UI 上還可以進(jìn)行周期性快照和備份,同樣在卷的詳細(xì)頁面可以進(jìn)行配置,在 Recurring Jobs Schedule 區(qū)域點(diǎn)擊 Add 按鈕即可創(chuàng)建一個(gè)定時(shí)的快照。
創(chuàng)建任務(wù)的時(shí)候可以選擇任務(wù)類型是備份(backup)或快照(snapshot),任務(wù)的時(shí)間以 CRON 表達(dá)式的形式進(jìn)行配置,還可以配置要保留的備份或快照數(shù)量以及標(biāo)簽。
為了避免當(dāng)卷長(zhǎng)時(shí)間沒有新數(shù)據(jù)時(shí),recurring jobs 可能會(huì)用相同的備份和空快照覆蓋舊的備份/快照的問題,Longhorn 執(zhí)行以下操作:
Recurring backup job 僅在自上次備份以來卷有新數(shù)據(jù)時(shí)才進(jìn)行新備份Recurring snapshot job 僅在卷頭(volume head)中有新數(shù)據(jù)時(shí)才拍攝新快照
此外我們還可以通過使用 Kubernetes 的 StorageClass 來配置定時(shí)快照,可以通過 StorageClass 的 recurringJobs 參數(shù)配置定時(shí)備份和快照,recurringJobs 字段應(yīng)遵循以下 JSON 格式:
apiVersion: storage.k8s.io/v1
kind: StorageClass
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:任務(wù)的名稱,不要在一個(gè) recurringJobs 中使用重復(fù)的名稱,并且 name 的長(zhǎng)度不能超過 8 個(gè)字符task:任務(wù)的類型,它僅支持 snapshot 或 backupcron:Cron 表達(dá)式,指定任務(wù)的執(zhí)行時(shí)間retain:Longhorn 將為一項(xiàng)任務(wù)保留多少快照/備份,不少于 1
使用這個(gè) StorageClass 創(chuàng)建的任何卷都將自動(dòng)配置上這些 recurring jobs。
要備份卷就需要在 Longhorn 中配置一個(gè)備份目標(biāo),可以是一個(gè) NFS 服務(wù)或者 S3 兼容的對(duì)象存儲(chǔ)服務(wù),用于存儲(chǔ) Longhorn 卷的備份數(shù)據(jù),備份目標(biāo)可以在 Settings/General/BackupTarget 中配置,我們這里使用 Helm Chart 安裝的,最好的方式是去定制 values 文件中的 defaultSettings.backupTarget,當(dāng)然也可以直接去通過 Longhorn UI 進(jìn)行配置,比如這里我們先配置備份目標(biāo)為 nfs 服務(wù),Backup Target 值設(shè)置為 nfs://192.168.31.31:/var/lib/k8s/data(要確保目錄存在),Backup Target Credential Secret 留空即可,然后拉到最下面點(diǎn)擊 Save:
備份目標(biāo)配置后,就可以開始備份了,同樣導(dǎo)航到 Longhorn UI 的 Volume 頁面,選擇要備份的卷,點(diǎn)擊 Create Backup,然后添加合適的標(biāo)簽點(diǎn)擊 OK 即可。
備份完成后導(dǎo)航到 Backup 頁面就可以看到對(duì)應(yīng)的備份數(shù)據(jù)了:
這些備份的數(shù)據(jù)也會(huì)對(duì)應(yīng)一個(gè) backupvolumes crd 對(duì)象:
? kubectl get backupvolumes -n longhorn-system
NAME CREATEDAT LASTBACKUPNAME LASTBACKUPAT LASTSYNCEDAT
pvc-ec17a7e4-7bb4-4456-9380-353db3ed4307 2022-02-22T09:23:24Z backup-8ae4af9c49534859 2022-02-22T09:23:24Z 2022-02-22T09:41:09Z
然后我們?nèi)サ?NFS 服務(wù)器上查看會(huì)在掛載目錄下面創(chuàng)建一個(gè) backupstore 目錄,下面會(huì)保留我們備份的數(shù)據(jù):
? tree /var/lib/k8s/data/backupstore
/var/lib/k8s/data/backupstore
└── volumes
└── 5e
└── b6
└── pvc-ec17a7e4-7bb4-4456-9380-353db3ed4307
├── backups
│ └── backup_backup-8ae4af9c49534859.cfg
├── blocks
│ ├── 02
│ │ └── 2e
│ │ └── 022eefc6526cd3d8fc3a9f9a4ba253a910c61a1c430a807403f60a2f233fa210.blk
......
│ └── f7
│ └── e3
│ └── f7e3ae1f83e10da4ece5142abac1fafc0d0917370f7418874c151a66a18bfa15.blk
└── volume.cfg
51 directories, 25 files
同樣這個(gè)時(shí)候我們也可以去快照列表選擇要備份的快照:
有了備份數(shù)據(jù)后要想要恢復(fù)數(shù)據(jù),只需要選擇對(duì)應(yīng)的備份數(shù)據(jù),點(diǎn)擊 Restore Latest Backup 恢復(fù)數(shù)據(jù)即可:
ReadWriteMany
Longhorn 可以通過 NFSv4 服務(wù)器暴露 Longhorn 卷,原生支持 RWX 工作負(fù)載,使用的 RWX 卷 會(huì)在 longhorn-system 命名空間下面創(chuàng)建一個(gè) share-manager- 的 Pod,該 Pod 負(fù)責(zé)通過在 Pod 內(nèi)運(yùn)行的 NFSv4 服務(wù)器暴露 Longhorn 卷。
要能夠使用 RWX 卷,每個(gè)客戶端節(jié)點(diǎn)都需要安裝 NFSv4 客戶端,對(duì)于 Ubuntu,可以通過以下方式安裝 NFSv4 客戶端:
? apt install nfs-common
對(duì)于基于 RPM 的發(fā)行版,可以通過以下方式安裝 NFSv4 客戶端:
? yum install nfs-utils
現(xiàn)在我們來創(chuàng)建一個(gè)如下所示的 PVC 對(duì)象,訪問模式配置為 ReadWriteMany:
# html-vol.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: html
spec:
accessModes:
- ReadWriteMany
storageClassName: longhorn
resources:
requests:
storage: 1Gi
直接創(chuàng)建上面的資源對(duì)象就會(huì)動(dòng)態(tài)創(chuàng)建一個(gè) PV 與之綁定:
? kubectl get pvc html
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
html Bound pvc-a03c5f7d-d4ca-43e9-aa4a-fb3b5eb5cf15 1Gi RWX longhorn 15s
? kubectl get pv pvc-a03c5f7d-d4ca-43e9-aa4a-fb3b5eb5cf15
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-a03c5f7d-d4ca-43e9-aa4a-fb3b5eb5cf15 1Gi RWX Delete Bound default/html longhorn 63s
然后創(chuàng)建一個(gè)如下所示的名為 writer 的 Deployment 資源對(duì)象,使用上面創(chuàng)建的 PVC 來持久化數(shù)據(jù):
# html-writer.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: writer
spec:
selector:
matchLabels:
app: writer
template:
metadata:
labels:
app: writer
spec:
containers:
- name: content
image: alpine:latest
volumeMounts:
- name: html
mountPath: /html
command: ["/bin/sh", "-c"]
args:
- while true; do
date >> /html/index.html;
sleep 5;
done
volumes:
- name: html
persistentVolumeClaim:
claimName: html
部署后上面創(chuàng)建的 Longhorn 的卷就變成 Attached 狀態(tài)了:
并且這個(gè)時(shí)候會(huì)自動(dòng)啟動(dòng)一個(gè) share-manager 的 Pod,通過該 Pod 內(nèi)運(yùn)行的 NFSv4 服務(wù)器來暴露 Longhorn 卷:
? kubectl get pods -n longhorn-system -l longhorn.io/component=share-manager
NAME READY STATUS RESTARTS AGE
share-manager-pvc-a03c5f7d-d4ca-43e9-aa4a-fb3b5eb5cf15 1/1 Running 0 2m16s
? kubectl logs -f share-manager-pvc-a03c5f7d-d4ca-43e9-aa4a-fb3b5eb5cf15 -n longhorn-system
time="2022-02-22T10:07:42Z" level=info msg="starting RLIMIT_NOFILE rlimit.Cur 1048576, rlimit.Max 1048576"
time="2022-02-22T10:07:42Z" level=info msg="ending RLIMIT_NOFILE rlimit.Cur 1048576, rlimit.Max 1048576"
time="2022-02-22T10:07:42Z" level=debug msg="volume pvc-a03c5f7d-d4ca-43e9-aa4a-fb3b5eb5cf15 device /dev/longhorn/pvc-a03c5f7d-d4ca-43e9-aa4a-fb3b5eb5cf15 contains filesystem of format " encrypted=false volume=pvc-a03c5f7d-d4ca-43e9-aa4a-fb3b5eb5cf15
I0222 10:07:42.432630 1 mount_linux.go:425] Disk "/dev/longhorn/pvc-a03c5f7d-d4ca-43e9-aa4a-fb3b5eb5cf15" appears to be unformatted, attempting to format as type: "ext4" with options: [-F -m0 /dev/longhorn/pvc-a03c5f7d-d4ca-43e9-aa4a-fb3b5eb5cf15]
I0222 10:07:42.981928 1 mount_linux.go:435] Disk successfully formatted (mkfs): ext4 - /dev/longhorn/pvc-a03c5f7d-d4ca-43e9-aa4a-fb3b5eb5cf15 /export/pvc-a03c5f7d-d4ca-43e9-aa4a-fb3b5eb5cf15
time="2022-02-22T10:07:43Z" level=info msg="starting nfs server, volume is ready for export" encrypted=false volume=pvc-a03c5f7d-d4ca-43e9-aa4a-fb3b5eb5cf15
time="2022-02-22T10:07:43Z" level=info msg="Running NFS server!"
time="2022-02-22T10:07:43Z" level=info msg="starting health check for volume" encrypted=false volume=pvc-a03c5f7d-d4ca-43e9-aa4a-fb3b5eb5cf15
然后我們?cè)賱?chuàng)建一個(gè)如下所示的 Deployment:
# html-reader.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: reader
spec:
replicas: 3
selector:
matchLabels:
app: reader
template:
metadata:
labels:
app: reader
spec:
containers:
- name: nginx
image: nginx:stable-alpine
ports:
- containerPort: 80
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
persistentVolumeClaim:
claimName: html
---
apiVersion: v1
kind: Service
metadata:
name: reader
spec:
selector:
app: reader
type: NodePort
ports:
- protocol: TCP
port: 80
targetPort: 80
上面的 reader Pods 可以引用 writer Pod 相同的 PVC,是因?yàn)樯厦嫖覀儎?chuàng)建的 PV 和 PVC 是 ReadWriteMany 訪問模式,直接創(chuàng)建上面的資源對(duì)象,我們可以通過 NodePort 來訪問應(yīng)用:
? kubectl get pods -l app=reader
NAME READY STATUS RESTARTS AGE
reader-b54c4749d-4bjxf 1/1 Running 0 11s
reader-b54c4749d-5thwz 1/1 Running 0 4m11s
reader-b54c4749d-drcfk 1/1 Running 0 5m35s
? kubectl get svc reader
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
reader NodePort 10.101.54.19 80:31800/TCP 84s
? curl http://192.168.31.31:31800
......
Tue Feb 22 10:18:39 UTC 2022
Tue Feb 22 10:18:44 UTC 2022
Tue Feb 22 10:18:49 UTC 2022
Tue Feb 22 10:18:54 UTC 2022
Tue Feb 22 10:18:59 UTC 2022
......
現(xiàn)在我們嘗試從一個(gè) reader Pod 中去產(chǎn)生一些數(shù)據(jù),然后再去訪問應(yīng)用驗(yàn)證數(shù)據(jù)是否正確:
? kubectl exec reader-b54c4749d-4bjxf-- /bin/sh -c "echo longhorn rwx access mode >> /usr/share/nginx/html/index.html"
? curl http://192.168.31.31:31800
......
Tue Feb 22 10:23:49 UTC 2022
longhorn rwx access mode
這里我們就驗(yàn)證了在 Longhorn 中使用 ReadWriteMany 訪問模式的 Volume 卷。
本文鏈接:http://www.www897cc.com/showinfo-119-2182-0.htmlLonghorn 高級(jí)使用之備份恢復(fù)與 ReadWriteMany
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com
上一篇: 通過 Kubernetes CSI 實(shí)現(xiàn) Longhorn 卷快照備份、恢復(fù)、克隆與擴(kuò)容功能