2万字长文:Kubernetes云原生开源分布式存储( 四 )


除此之外 , Longhorn还支持创建备份计划 , 可以通过cron指定时间点或者定时对volume进行快照或者备份到S3中 。
2万字长文:Kubernetes云原生开源分布式存储文章插图
longhorn backup
2.3 Kubernetes集成Longhorn存储Longhorn既支持FlexVolume也支持CSI接口 , 安装时会自动根据Kubernetes版本选择FlexVolume或者CSI 。
Kubernetes集成Longhorn , 根据前面对StorageClass的介绍 , 我们需要先安装Longhorn StorageClass:
kubectl create -f \声明一个20Gi的PVC:
# kubectl apply -f -apiVersion: v1kind: PersistentVolumeClaimmetadata:name: longhorn-volv-pvcspec:accessModes:- ReadWriteOncestorageClassName: longhornresources:requests:storage: 2Gi创建Pod并使用新创建的PVC:
# kubectl apply -f -apiVersion: v1kind: Podmetadata:name: test-volume-longhornspec:containers:- name: test-volume-longhornimage: jocatalin/kubernetes-bootcamp:v1volumeMounts:- name: volvmountPath: /datavolumes:- name: volvpersistentVolumeClaim:claimName: longhorn-volv-pvc通过Longhorn Dashboard查看volume状态已经挂载到Pod中:
2万字长文:Kubernetes云原生开源分布式存储文章插图
longhorn pvc
Longhorn volume不仅可以通过PV形式挂载到Kubernetes容器 , 还可以直接通过ISCSI接口挂载到Node节点上:
2万字长文:Kubernetes云原生开源分布式存储文章插图
longhorn_attach_to_host
此时可以通过 lsblk 在OS查看到块存储设备 , 通过 iscsiadm 命令可以查看Node节点连接的设备会话:
# lsblk -SNAME HCTLTYPE VENDORMODELREV TRANsda0:0:0:1disk IETVIRTUAL-DISK0001 iscsi# iscsiadm-m sessiontcp: [3] 10.244.0.50:3260,1 iqn.2019-10.io.longhorn:int32bit-volume-1 (non-flash)3 CAS开源实现OpenEBS3.1 OpenEBS简介OpenEBS [7] 是 MayaData [8] (之前叫CloudByte)公司开源的云原生容器存储项目 , 命名上可能参考了AWS EBS(Elastic Block Storage) 。
OpenEBS也是目前Container Attached Storage的一种开源实现方案 , 因此它直接运行在Kubernetes平台上 , 通过Kubernetes平台进行编排与调度 。
OpenEBS支持如下三种存储类型 , 分别为cStore、Jiva以及LocalPV 。
Jiva后端实现其实就是前面介绍的Longhorn , 也就是使用了raw格式sparse稀疏文件作为虚拟磁盘实现容器volume , 这个和虚拟机的本地虚拟磁盘实现类似 , 可以通过 qemu-img info 查看volume分配的虚拟大小以及实际使用的空间 , 稀疏文件默认路径为 /var/openebs, 所以volume的容量总大小取决于这个路径挂载的文件系统大小 。
实现上使用了Longhorn早期版本设计 , 即一个3副本的volume会有4个Pod控制器管理 , 一个是主控制器 , 三个副本控制器 , 其中主控制器运行了iSCSI Target服务 , 通过Service暴露ISCSI 3260端口 , 主控制器会把IO复制到所有副本的控制器 。
2万字长文:Kubernetes云原生开源分布式存储文章插图
openebs jiva
cStore这是OpenEBS最推荐的存储类型 , 测试最完备 , 经过了生产部署考验 , 支持多副本、快照、克隆、精简配置(thin provisioning)、数据强一致性等高级特性 。
和Jiva不一样的是 , cStore使用了类似ZFS或者LVM的Pool的概念 , blockdevices就相当于LVM的PV , 而Pool则类似LVM的VG概念 , volume类似LVM的LV , 其中blockdevice对应物理上的一块磁盘或者一个分区 , 多个blockdevices组成Pool , 这些blockdevices如何存储落盘取决于Pool策略 , cStore支持的Pool策略包括striped、mirrored、raidz、raidz2 , 这些概念都不陌生 。
2万字长文:Kubernetes云原生开源分布式存储文章插图
cstore pool
Pool是一个单Node节点层面的概念而不是分布式的 , 创建一个cStor Pool实际上会在每个Node节点创建相同策略的Pool实例 , 因此即使使用striped策略 , 数据打散后也只是存储在本地的多块磁盘 , 不会跨节点存储 , 当然volume副本是跨节点的 。
OpenEBS通过ISCSI接口实现volume的挂载 , 每当创建一个cStor Volume , OpenEBS就会创建一个新的cStor target Pod , cStor target会创建对应的LUN设备 。
cStor target除了负责LUN设备管理 , 还负责副本之间的数据同步 , 每当用户有数据写入时 , cStor target会把数据拷贝到其他所有副本中去 。
比如假设创建了一个三副本的cStore PV , 当用户写入数据时 , cStor target会同时往三个副本写入数据 , 只有等三个副本都写成功后 , 才会响应用户 , 因此显然OpenEBS是一个强一致性分布式存储系统 。
2万字长文:Kubernetes云原生开源分布式存储文章插图