使用 OpenEBS 的 ZFS 本地存储模式的操作记录
介绍
OpenEBS 是一个开源的云原生存储解决方案,旨在为 Kubernetes 提供持久化存储。它通过容器化存储引擎(如 Jiva、cStor、ZFS、Mayastor 等)来管理和调度存储资源。OpenEBS 的 ZFS 存储引擎可以为有状态应用程序提供高性能、可扩展的存储卷,同时支持数据保护功能,如快照和克隆。
本文记录了在 Kubernetes 集群中使用 OpenEBS 的 ZFS 本地存储模式的安装与操作步骤。该流程涵盖了 Helm 安装 OpenEBS、创建持久化卷 (PVC)、快照及克隆操作等内容。
安装 OpenEBS
首先,使用 Helm 安装 OpenEBS,并禁用 Mayastor 引擎:
helm repo add openebs https://openebs.github.io/openebs
helm repo update
helm upgrade --install openebs --namespace openebs openebs/openebs --set engines.replicated.mayastor.enabled=false --create-namespace
创建 ZFS 池
使用 zfs create
命令创建 ZFS 存储池,详情可以查看此链接。
查看现有的 ZFS 池:
zfs list
示例输出:
NAME USED AVAIL REFER MOUNTPOINT
mypool 10.3G 20.2G 25.5K /mypool
mypool/myvolume 10.3G 30.2G 293M -
mypool/test 24K 20.2G 24K /mypool/test
pool 4.13G 56.9G 27K /pool
pool/pvc-259fa4d5-04f4-4f86-9d82-15300544e5a6 4.13G 60.9G 130M -
pool/pvc-f6e08a19-ef27-4867-a5d9-880cb69cbd81 24K 4.00G 24K legacy
创建存储类和 PVC
在这一部分,我们将创建两种不同类型的存储类和相应的 PVC。
zfs-sc.yaml
:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: openebs-zfspv
provisioner: openebs.io/zfs
allowVolumeExpansion: true ##添加此字段后使用此 sc 的 pvc 可以打快照
parameters:poolname: "pool"fstype: "ext4"
该存储类 openebs-zfspv
使用 ext4
文件系统。
zfs-sc-file.yaml
:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: openebs-zfspv-file
provisioner: openebs.io/zfs
allowVolumeExpansion: true
parameters:poolname: "pool"fstype: "zfs"
该存储类 openebs-zfspv-file
使用 zfs
文件系统。
创建存储类:
kubectl apply -f zfs-sc.yaml
kubectl apply -f zfs-sc-file.yaml
使用以下配置文件创建 PVC:
pvc.yaml
:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: csi-zfspv
spec:storageClassName: openebs-zfspvaccessModes:- ReadWriteOnceresources:requests:storage: 4Gi
pvc-file.yaml
:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: csi-zfspv-file
spec:storageClassName: openebs-zfspv-fileaccessModes:- ReadWriteOnceresources:requests:storage: 4Gi
创建 PVC:
kubectl apply -f pvc.yaml
kubectl apply -f pvc-file.yaml
查看 PVC 状态:
kubectl get pvc
示例输出:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
csi-zfspv Bound pvc-259fa4d5-04f4-4f86-9d82-15300544e5a6 4Gi RWO openebs-zfspv 7m33s
csi-zfspv-file Bound pvc-f6e08a19-ef27-4867-a5d9-880cb69cbd81 4Gi RWO openebs-zfspv-file 27m
创建 Pod 使用 PVC
使用以下配置文件创建使用 PVC 的 Pod:
pod.yaml
:
apiVersion: v1
kind: Pod
metadata:name: fio
spec:restartPolicy: Nevercontainers:- name: perfrunnerimage: openebs/tests-fio:latestimagePullPolicy: IfNotPresentcommand: ["/bin/bash"]args: ["-c", "while true ;do sleep 50; done"]volumeMounts:- mountPath: /datadirname: fio-voltty: truevolumes:- name: fio-volpersistentVolumeClaim:claimName: csi-zfspv
创建 Pod:
kubectl apply -f pod.yaml
查看 Pod 状态:
kubectl get pod zfs-pod
创建在 pvc 中创建一个文件。
kubectl exec -it fio -- /bin/bash touch /datadir/1.txt
创建卷快照
使用以下配置文件创建卷快照:
snapshot.yaml
:
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:name: zfspv-snap
spec:volumeSnapshotClassName: zfspv-snapclasssource:persistentVolumeClaimName: csi-zfspv
创建快照:
kubectl apply -f snapshot.yaml
查看快照:
kubectl get volumesnapshot.snapshot
示例输出:
NAME READYTOUSE SOURCEPVC SOURCESNAPSHOTCONTENT RESTORESIZE SNAPSHOTCLASS SNAPSHOTCONTENT CREATIONTIME AGE
zfspv-snap true csi-zfspv 5Gi zfspv-snapclass snapcontent-ef413403-1990-425d-b766-f5c21f4311b5 12s 12s
查看快照详细信息:
kubectl get volumesnapshot.snapshot zfspv-snap -o yaml
示例输出包含了快照的元数据和状态。
克隆卷
根据快照创建了两个克隆卷 zfspv-clone
和 zfspv-clone-2
。需要注意的是,克隆后的数据与快照创建时的数据一致,没有发生变化。
使用以下配置文件创建克隆 PVC:
clone.yaml
:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: zfspv-clone
spec:dataSource:name: zfspv-snapkind: VolumeSnapshotapiGroup: snapshot.storage.k8s.iostorageClassName: openebs-zfspvaccessModes:- ReadWriteOnceresources:requests:storage: 5Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: zfspv-clone-2
spec:dataSource:name: zfspv-snapkind: VolumeSnapshotapiGroup: snapshot.storage.k8s.iostorageClassName: openebs-zfspvaccessModes:- ReadWriteOnceresources:requests:storage: 5Gi
创建克隆 PVC:
kubectl apply -f clone.yaml
查看 PVC 状态:
kubectl get pvc
示例输出:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
csi-zfspv Bound pvc-259fa4d5-04f4-4f86-9d82-15300544e5a6 5Gi RWO openebs-zfspv 18m
csi-zfspv-file Bound pvc-f6e08a19-ef27-4867-a5d9-880cb69cbd81 4Gi RWO openebs-zfspv-file 38m
zfspv-clone Bound pvc-7fb8351c-72c8-4256-adbe-2bc6b26f5645 5Gi RWO openebs-zfspv 4s
zfspv-clone-2 Bound pvc-04ad67d7-2bc4-47c1-9c79-0835405929df 4Gi RWO openebs-zfspv 4s
查看 ZFS 列表
查看所有类型的 ZFS:
zfs list -t all
示例输出:
NAME USED AVAIL REFER MOUNTPOINT
mypool 10.3G 20.2G 25.5K /mypool
mypool/myvolume 10.3G 30.2G 293M -
mypool/test 24K 20.2G 24K /mypool/test
pool 5.30G 55.7G 27K /pool
pool/pvc-04ad67d7-2bc4-47c1-9c79-0835405929df 0B 4G 26K legacy
pool/pvc-259fa4d5-04f4-4f86-9d82-15300544e5a6 5.30G 60.9G 146M -
pool/pvc-259fa4d5-04f4-4f86-9d82-15300544e5a6@snapshot-ef413403-1990-425d-b766-f5c21f4311b5 0B - 146M -
pool/pvc-7fb8351c-72c8-4256-adbe-2bc6b26f5645 1K 55.7G 146M -
pool/pvc-f6e08a19-ef27-4867-a5d9-880cb69cbd81 26K 4.00G 26K legacy
pool/pvc-f6e08a19-ef27-4867-a5d9-880cb69cbd81@pvc-04ad67d7-2bc4-47c1-9c79-0835405929df 0B - 26K -
查看 ZFS Volume (ZV)
在 OpenEBS 中,一个 ZFS 卷对应一个 ZV。
查看 ZV:
kubectl get zv -n openebs
示例输出:
NAME ZPOOL NODEID SIZE STATUS FILESYSTEM AGE
pvc-04ad67d7-2bc4-47c1-9c79-0835405929df pool test2 4294967296 Ready zfs 7m48s
pvc-259fa4d5-04f4-4f86-9d82-15300544e5a6 pool test2 5368709120 Ready ext4 26m
pvc-2d162e69-3ad3-4757-912d-6543f586d7ed pool test2 4294967296 Ready zfs 8s
pvc-7fb8351c-72c8-4256-adbe-2bc6b26f5645 pool test2 5368709120 Ready ext4 7m48s
pvc-f6e08a19-ef27-4867-a5d9-880cb69cbd81 pool test2 4294967296 Ready zfs 46m
验证克隆后的数据
使用克隆后的 pvc :
apiVersion: v1
kind: Pod
metadata:name: fio
spec:restartPolicy: Nevercontainers:- name: perfrunnerimage: openebs/tests-fio:latestimagePullPolicy: IfNotPresentcommand: ["/bin/bash"]args: ["-c", "while true ;do sleep 50; done"]volumeMounts:- mountPath: /datadirname: fio-voltty: truevolumes:- name: fio-volpersistentVolumeClaim:claimName: zfspv-clone
执行命令进入测试容器:
kubectl exec -it fio -- /bin/bash
进入 datadir
目录并查看文件:
cd datadir/
ls
示例输出:
1.txt lost+found
总结
以上是使用 OpenEBS 的 ZFS 本地存储模式的操作记录。包括安装、PVC 的创建、快照的管理、克隆卷的操作、Pod 使用 PVC 以及 ZV 的查看等步骤。通过这些步骤,可以有效地管理 Kubernetes 中的存储资源。
后记
- zfs文件系统
- openesb