k8s持久化存储之OpenEBS

一、介绍

OpenEBS 是 CNCF 项目的一部分,采用 Apache v2 许可证。是 Kubernetes 部署使用最广泛且易用的开源存储解决方案。

目的:

让持久化工作负载的存储和存储服务完全集成到环境中,这样每个团队和工作负载都可以从控制的粒度和 Kubernetes 原生行为中获益。

特点:

  • 微服务架构,使用 Kubernetes 自身的能力来编排管理 OpenEBS 组件。

  • OpenEBS 支持一系列存储引擎,以便开发人员能够部署适合其应用程序设计目标的存储技术。

    像 Cassandra 这样的分布式应用程序可以使用 LocalPV 引擎实现最低延迟的写操作。

    像 MySQL 和 PostgreSQL 这样的独立应用程序可以使用 ZFS 引擎 (cStor) 进行恢复。

    像 Kafka 这样的流媒体应用程序可以使用 NVMe 引擎 Mayastor 在边缘环境中获得最佳性能。

    在各种引擎类型中,OpenEBS 为高可用性、快照、克隆和易管理性提供了一致的框架。

  • 管理员和开发人员可以使用 Kubernetes 提供的所有工具来交互和管理 OpenEBS。

二、OpenEBS 存储引擎建议

应用需求 存储类型 OpenEBS 卷类型
低时延、高可用性、同步复制、快照、克隆、精简配置 SSD/ 云存储卷 OpenEBS Mayastor
高可用性、同步复制、快照、克隆、精简配置 机械 /SSD/ 云存储卷 OpenEBS cStor
高可用性、同步复制、精简配置 主机路径或外部挂载存储 OpenEBS Jiva
低时延、本地 PV 主机路径或外部挂载存储 Dynamic Local PV - Hostpath, Dynamic Local PV - Rawfile
低时延、本地 PV 本地机械 /SSD/ 云存储卷等块设备 Dynamic Local PV - Device
低延迟,本地 PV,快照,克隆 本地机械 /SSD/ 云存储卷等块设备 OpenEBS Dynamic Local PV - ZFS , OpenEBS Dynamic Local PV - LVM
  • 多机环境,如果有额外的块设备(非系统盘块设备)作为数据盘,选用 OpenEBS MayastorOpenEBS cStor
  • 多机环境,如果没有额外的块设备(非系统盘块设备)作为数据盘,仅单块系统盘块设备,选用 OpenEBS Jiva
  • 单机环境,建议本地路径 Dynamic Local PV - Hostpath, Dynamic Local PV - Rawfile,由于单机多用于测试环境,数据可靠性要求较低。

三、安装

openobs官方安装文档

在安装openebs之前先去除污点,然后等安装完成再添加回来污点

1
2
3
4
# 去除污点
kubectl taint nodes k8s-master01 node-role.kubernetes.io/master=:NoSchedule-
# 添加污点
kubectl taint nodes k8s-master01 node-role.kubernetes.io/master=:NoSchedule

添加helm repo

1
2
helm repo add openebs https://openebs.github.io/charts
helm repo update

安装openebs(这里只会安装Jiva和Local组件)

1
helm install openebs --namespace openebs openebs/openebs --create-namespace --version 3.0.x

添加cstor支持

1
helm install openebs --namespace openebs openebs/openebs --create-namespace --set cstor.enabled=true --version 3.2.0

查看安装

1
2
3
4
# 查看安装pod
kubectl get pod -n openebs
# 查看安装blockdevice,这里的blockdevice是磁盘,当添加一块未分配的磁盘,就会有值
kubectl get bd -n openebs

OpenEBS依赖与iSCSI做存储管理,因此需要先确保您的集群上已有安装openiscsi。 (这里当报错的时候可以安装试试)

1
2
3
yum -y install iscsi-initiator-utils
systemctl enable iscsid --now
systemctl start iscsid

查看安装状况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@k8s-master01 ~]# kubectl get pod -n openebs
NAME READY STATUS RESTARTS AGE
openebs-cstor-admission-server-b74f5487-lkz84 1/1 Running 1 (6m21s ago) 8h
openebs-cstor-csi-controller-0 6/6 Running 0 4m44s
openebs-cstor-csi-node-4df4w 2/2 Running 2 (61m ago) 8h
openebs-cstor-csi-node-x8bmt 2/2 Running 6 (16m ago) 8h
openebs-cstor-csi-node-zzn4k 2/2 Running 2 (6m21s ago) 8h
openebs-cstor-cspc-operator-84464fb479-fh949 1/1 Running 3 (16m ago) 8h
openebs-cstor-cvc-operator-646f6f676b-xhd44 1/1 Running 2 (16m ago) 46m
openebs-localpv-provisioner-55b65f8b55-zqj29 1/1 Running 13 (6m23s ago) 8h
openebs-ndm-429hl 1/1 Running 2 (4m28s ago) 8h
openebs-ndm-9kkzd 1/1 Running 1 (6m21s ago) 8h
openebs-ndm-operator-6c944d87b6-5ddxz 1/1 Running 2 (16m ago) 46m
openebs-ndm-sqnwx 1/1 Running 6 (15m ago) 8h

四、添加磁盘

1
2
3
4
5
[root@k8s-master01 ~]# kubectl get bd -n openebs
NAME NODENAME SIZE CLAIMSTATE STATUS AGE
blockdevice-57886fae032a3d3638badeb1282dd67e k8s-node02 21473771008 Unclaimed Active 53s
blockdevice-d923fc382d96ff6eea7d9ab8efb66224 k8s-master01 21473771008 Unclaimed Active 11m
blockdevice-e5009ce419c80719025c4cc9409253ab k8s-node01 21473771008 Unclaimed Active 33s

五、配置

5.1 创建cStor存储池

cspc.yaml :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
apiVersion: cstor.openebs.io/v1
kind: CStorPoolCluster
metadata:
name: cstor-disk-pool
namespace: openebs
spec:
pools:
- nodeSelector:
kubernetes.io/hostname: "k8s-master01"
dataRaidGroups:
- blockDevices:
- blockDeviceName: "blockdevice-d923fc382d96ff6eea7d9ab8efb66224"
poolConfig:
dataRaidGroupType: "stripe"

- nodeSelector:
kubernetes.io/hostname: "k8s-node01"
dataRaidGroups:
- blockDevices:
- blockDeviceName: "blockdevice-e5009ce419c80719025c4cc9409253ab"
poolConfig:
dataRaidGroupType: "stripe"

- nodeSelector:
kubernetes.io/hostname: "k8s-node02"
dataRaidGroups:
- blockDevices:
- blockDeviceName: "blockdevice-57886fae032a3d3638badeb1282dd67e"
poolConfig:
dataRaidGroupType: "stripe"

dataRaidGroupType:可以根据您的需要设置为 stripe or mirror 。下面以配置为stripe为例。

1
2
3
[root@k8s-master01 openebs]# kubectl get CStorPoolCluster -n openebs
NAME HEALTHYINSTANCES PROVISIONEDINSTANCES DESIREDINSTANCES AGE
cstor-disk-pool 3 3 42s

5.2 storageclass创建

5.2.1 cstor的创建

1
2
3
4
5
6
7
8
9
10
11
12
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: cstor-csi-disk
provisioner: cstor.csi.openebs.io
allowVolumeExpansion: true
parameters:
cas-type: cstor
# cstorPoolCluster should have the name of the CSPC
cstorPoolCluster: cstor-disk-pool
# replicaCount should be <= no. of CSPI created in the selected CSPC
replicaCount: "3"

添加硬盘后查看磁盘情况

1
2
3
4
5
6
7
8
9
10
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:gpt
Disk identifier: ADA9C10B-8C31-4EE2-A29B-F2701E9554DC


# Start End Size Type Name
1 2048 41943006 20G Linux filesyste OpenEBS_NDM

5.2.2 jiva

1
2
3
4
5
6
7
8
9
10
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: jiva-storageclass
annotations:
openebs.io/cas-type: jiva
cas.openebs.io/config: |
- name: StoragePool
value: default
provisioner: openebs.io/provisioner-iscsi

5.2.3 hostpath

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: localpv-hostpath-sc
annotations:
openebs.io/cas-type: local
cas.openebs.io/config: |
- name: BasePath
value: "/var/openebs/local"
- name: StorageType
value: "hostpath"
provisioner: openebs.io/local

5.2.4 device

下面的类型需要添加硬盘

1
2
3
4
5
6
7
8
9
10
磁盘 /dev/sdc:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:gpt
Disk identifier: BAD0A706-0A9D-478A-85C6-319224EC5D1F


# Start End Size Type Name
1 2048 41943006 20G Linux filesyste OpenEBS_NDM
1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: localpv-device-sc
annotations:
openebs.io/cas-type: local
cas.openebs.io/config: |
- name: StorageType
value: "device"
- name: FSType
value: ext4
provisioner: openebs.io/local

查看:

1
2
3
4
5
[root@k8s-master01 openebs]# kubectl get sc -n openebs
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
cstor-csi-disk cstor.csi.openebs.io Delete Immediate true 43s
openebs-device openebs.io/local Delete WaitForFirstConsumer false 9h
openebs-hostpath openebs.io/local Delete WaitForFirstConsumer false 9h

5.2.5 cStor、Jiva、LocalPV 特性比较:

特性 Jiva cStor Local PV
轻量级运行于用户空间 Yes Yes Yes
同步复制 Yes Yes No
适合低容量工作负载 Yes Yes Yes
支持快照,克隆 Basic Advanced No
数据一致性 Yes Yes NA
使用 Velero 恢复备份 Yes Yes Yes
适合高容量工作负载 No Yes Yes
自动精简配置 Yes No
磁盘池或聚合支持 Yes No
动态扩容 Yes Yes
数据弹性 (RAID 支持) Yes No
接近原生磁盘性能 No No Yes

大多数场景推荐 cStor,因其提供了强大的功能,包括快照 / 克隆、存储池功能(如精简资源调配、按需扩容等)。

Jiva 适用于低容量需求的工作负载场景,例如 550G。尽管使用 Jiva 没有空间限制,但建议将其用于低容量工作负载。Jiva 非常易于使用,并提供企业级容器本地存储,而不需要专用硬盘。有快照和克隆功能的需求的场景,优先考虑使用 cStor 而不是 Jiva

5.3 默认sc

1
kubectl patch storageclass cstor-csi-disk -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

推荐文章:

https://blog.csdn.net/easylife206/article/details/125213855

https://zhuanlan.zhihu.com/p/519172233


k8s持久化存储之OpenEBS
https://leellun.github.io/2022/07/23/k8s/persistence/k8s持久化存储之OpenEBS/
作者
leellun
发布于
2022年7月23日
许可协议