Ceph CSI 对接 K8S 指南
一、介绍
1.1、Ceph CSI 介绍
Ceph CSI 插件实现了支持 CSI 的容器编排器 (CO) 与 Ceph 集群之间的接口。它们支持动态配置 Ceph 卷并将其附加到工作负载。项目地址: https://github.com/ceph/ceph-csi 。该仓库包含用于 RBD、CephFS 和 Kubernetes sidecar 部署 YAML 的 Ceph 容器存储接口 (CSI) 驱动程序,以支持 CSI 功能:provisioner、attacher、resizer、driver-registrar 和 snapper。
本文基于 Ceph CSI v3.14.1 版本进行测试。
Ceph CSI 驱动与测试过的 Kubernetes 版本信息表: (参考 known-to-work-co-platforms)
Ceph CSI 版本 | Kubernetes 版本 |
---|---|
v3.14.1 | v1.30、v1.31、v1.32 |
v3.14.0 | v1.30、v1.31、v1.32 |
v3.13.1 | v1.29、v1.30、v1.31 |
v3.13.0 | v1.29、v1.30、v1.31 |
Ceph-CSI RBD 功能和可用版本信息表: (参考 ceph-csi-features-and-available-versions)
特性 | 状态 | CSI 驱动版本 | CSI 规范版本 | Ceph 集群版本 | Kubernetes 版本 |
---|---|---|---|---|---|
动态/取消配置块模式 RWO 卷 | 正式版本 | >= v1.0.0 | >= v1.0.0 | Pacific (>=v16.2.0) | >= v1.14.0 |
动态/取消配置块模式 RWX 卷 | 正式版本 | >= v1.0.0 | >= v1.0.0 | Pacific (>=v16.2.0) | >= v1.14.0 |
动态/取消配置文件模式 RWO 卷 | 正式版本 | >= v1.0.0 | >= v1.0.0 | Pacific (>=v16.2.0) | >= v1.14.0 |
创建/删除快照 | 正式版本 | >= v1.0.0 | >= v1.0.0 | Pacific (>=v16.2.0) | >= v1.17.0 |
从快照配置卷 | 正式版本 | >= v1.0.0 | >= v1.0.0 | Pacific (>=v16.2.0) | >= v1.17.0 |
从另一个卷配置卷 | 正式版本 | >= v1.0.0 | >= v1.0.0 | Pacific (>=v16.2.0) | >= v1.16.0 |
文件模式卷的卷/PV 指标 | 正式版本 | >= v1.2.0 | >= v1.1.0 | Pacific (>=v16.2.0) | >= v1.15.0 |
区块模式卷的卷/PV 指标 | 正式版本 | >= v1.2.0 | >= v1.1.0 | Pacific (>=v16.2.0) | >= v1.21.0 |
扩大卷 | Beta版本 | >= v2.0.0 | >= v1.1.0 | Pacific (>=v16.2.0) | >= v1.15.0 |
拓扑感知配置支持 | Alpha版本 | >= v2.1.0 | >= v1.1.0 | Pacific (>=v16.2.0) | >= v1.14.0 |
从快照配置文件模式 ROX 卷 | Alpha版本 | >= v3.0.0 | >= v1.0.0 | Pacific (>=v16.2.0) | >= v1.17.0 |
从另一个卷配置文件模式 ROX 卷 | Alpha版本 | >= v3.0.0 | >= v1.0.0 | Pacific (>=v16.2.0) | >= v1.16.0 |
从快照配置块模式 ROX 卷 | Alpha版本 | >= v3.0.0 | >= v1.0.0 | Pacific (>=v16.2.0) | >= v1.17.0 |
从另一个卷提供块模式 ROX 卷 | Alpha版本 | >= v3.0.0 | >= v1.0.0 | Pacific (>=v16.2.0) | >= v1.16.0 |
动态/取消文件模式 RWOP 卷 | Alpha版本 | >= v3.5.0 | >= v1.5.0 | Pacific (>=v16.2.0) | >= v1.22.0 |
动态/取消配置块模式 RWOP 卷 | Alpha版本 | >= v3.5.0 | >= v1.5.0 | Pacific (>=v16.2.0) | >= v1.22.0 |
Ceph-CSI CephFS 功能和可用版本信息表: (参考 ceph-csi-features-and-available-versions)
特性 | 状态 | CSI 驱动版本 | CSI 规范版本 | Ceph 集群版本 | Kubernetes 版本 |
---|---|---|---|---|---|
动态/取消配置文件模式 RWO 卷 | 正式版本 | >= v1.1.0 | >= v1.0.0 | Pacific (>=v16.2.0) | >= v1.14.0 |
动态/取消配置文件模式 RWX 卷 | 正式版本 | >= v1.1.0 | >= v1.0.0 | Pacific (>=v16.2.0) | >= v1.14.0 |
创建和删除快照 | 正式版本 | >= v3.1.0 | >= v1.0.0 | Pacific (>=v16.2.0) | >= v1.17.0 |
从快照配置卷 | 正式版本 | >= v3.1.0 | >= v1.0.0 | Pacific (>=v16.2.0) | >= v1.17.0 |
从另一个卷配置卷 | 正式版本 | >= v3.1.0 | >= v1.0.0 | Pacific (>=v16.2.0) | >= v1.16.0 |
文件模式卷的卷/PV 指标 | 正式版本 | >= v1.2.0 | >= v1.1.0 | Pacific (>=v16.2.0) | >= v1.15.0 |
扩大卷 | Beta版本 | >= v2.0.0 | >= v1.1.0 | Pacific (>=v16.2.0) | >= v1.15.0 |
动态/取消配置文件模式 ROX 卷 | Alpha版本 | >= v3.0.0 | >= v1.0.0 | Pacific (>=v16.2.0) | >= v1.14.0 |
动态/取消配置文件模式 RWOP 卷 | Alpha版本 | >= v3.5.0 | >= v1.5.0 | Pacific (>=v16.2.0) | >= v1.22.0 |
创建和删除卷组快照 | Alpha版本 | >= v3.11.0 | >= v1.9.0 | Squid (>=v19.0.0) | >= v1.31.0 |
Ceph-CSI NFS 功能和可用版本信息表: (参考 ceph-csi-features-and-available-versions)
特性 | 状态 | CSI 驱动版本 | CSI 规范版本 | Ceph 集群版本 | Kubernetes 版本 |
---|---|---|---|---|---|
动态/取消配置文件模式 RWO 卷 | Alpha版本 | >= v3.6.0 | >= v1.0.0 | Pacific (>=v16.2.0) | >= v1.14.0 |
动态/取消配置文件模式 RWX 卷 | Alpha版本 | >= v3.6.0 | >= v1.0.0 | Pacific (>=v16.2.0) | >= v1.14.0 |
动态/取消配置文件模式 ROX 卷 | Alpha版本 | >= v3.6.0 | >= v1.0.0 | Pacific (>=v16.2.0) | >= v1.14.0 |
动态/取消配置文件模式 RWOP 卷 | Alpha版本 | >= v3.6.0 | >= v1.5.0 | Pacific (>=v16.2.0) | >= v1.22.0 |
扩大卷 | Alpha版本 | >= v3.7.0 | >= v1.1.0 | Pacific (>=v16.2.0) | >= v1.15.0 |
创建和删除快照 | Alpha版本 | >= v3.7.0 | >= v1.1.0 | Pacific (>=v16.2.0) | >= v1.17.0 |
从快照配置卷 | Alpha版本 | >= v3.7.0 | >= v1.1.0 | Pacific (>=v16.2.0) | >= v1.17.0 |
从另一个卷配置卷 | Alpha版本 | >= v3.7.0 | >= v1.1.0 | Pacific (>=v16.2.0) | >= v1.16.0 |
1.2、资源拓扑情况
本文中机器资源部署拓扑情况如下所示:
机器节点 | 机器IP地址 | 角色 |
---|---|---|
node01 | 10.10.0.1 | CephServer |
node02 | 10.10.0.2 | CephServer |
node03 | 10.10.0.3 | CephServer/minikube |
字段解释:
CephServer
: 其中部署了 Ceph Monitor/Manager/OSD等组件的节点,使用的 Ceph 版本为 v19.2.1 。minikube
: 搭建 K8S 测试集群的节点;
二、配置 Ceph 集群
在已部署的 Ceph 集群之上执行如下的配置,用于支持后续通过 Ceph CSI 组件来访问 Ceph 集群数据。
2.1、初始化数据池
相关命令:
# 初始化 CephFS 数据池 |
2.2、新增访问密钥
按照 Ceph-CSI CephFS Capabilities 和 Ceph-CSI CephRBD Capabilities 中所描述的访问密钥的所需能力,我们执行如下操作创建对应密钥。
要求的权限能力:
# for CephFS |
相关命令:
# 新增 CephFS 访问用户 |
三、搭建 K8S 集群
3.1、安装基础工具
为了进行测试,这里使用 minikube 工具搭建单节点的 K8S 测试集群。为此我们需要安装 kubectl 和 minikube 工具。
相关命令: (位于 10.10.0.3 机器上执行)
# 安装 kubectl |
3.2、搭建集群
需要注意,由于我的测试机器上使用的是 podman ,所以在使用 minikube 部署集群的时候建议使用非 root 用户执行。
相关命令: (位于 10.10.0.3 机器上执行)
# 通过 minikube 搭建单节点集群 |
相关输出信息:
[bugwz@node03 data]$ minikube start --mount=true --mount-string="/gpfsdata:/gpfsdata" |
四、部署 CSI 服务
以下使用的配置文件位于 ceph-csi 项目中。
相关命令:
# 创建 ceph config map |
文件解析:
ceph-conf.yaml
: 文件路径为 ./deploy/ceph-conf.yamlcsi-config-map.yaml
: 文件路径为 ./deploy/cephfs/kubernetes/csi-config-map.yamlcsi-provisioner-rbac.yaml
: 文件路径为 ./deploy/cephfs/kubernetes/csi-provisioner-rbac.yamlcsi-nodeplugin-rbac.yaml
: 文件路径为 ./deploy/cephfs/kubernetes/csi-nodeplugin-rbac.yamlcsi-cephfsplugin-provisioner.yaml
: 文件路径为 ./deploy/cephfs/kubernetes/csi-cephfsplugin-provisioner.yamlcsi-cephfsplugin.yaml
: 文件路径为 ./deploy/cephfs/kubernetes/csi-cephfsplugin.yamlcsidriver.yaml
: 文件路径为 ./deploy/cephfs/kubernetes/csidriver.yaml
csi-config-map.yaml 文件内容示例: (参考示例文件 ./deploy/csi-config-map-sample.yaml)
|
五、CephFS 对接 CSI
注意: 动态配置卷会在收到请求时由驱动程序删除。对于静态配置卷(插件版本低于或等于 1.0.0),在执行删除操作时不会执行任何操作,预计会由用户在 Ceph 集群上删除。
5.1、创建Secret
无论是使用静态配置还是动态配置,都需要创建 Secret ,因此这里统一设置。
相关命令:
# 应用 secret.yaml |
secret.yaml 文件示例: (参考文件 ./examples/cephfs/secret.yaml)
--- |
配置解析:
userID
: 创建的访问 CephFS 的用户名;userKey
: 创建的访问 CephFS 的用户密码;encryptionPassphrase
: 加密密码;
5.2、静态配置
我们可以将手动创建的 CephFS 子卷或卷挂载到应用程序并卸载,以下步骤显示如何创建 CephFS 子卷或卷、静态 PV 和静态 PVC。参考文档
5.2.1、创建子卷
注意: 静态配置方式中,删除 PV 和 PVC 不会删除后端 CephFS 子卷或卷,如果需要,用户需要手动删除 CephFS 子卷或卷。
相关命令:
# 创建子卷组 |
5.2.2、创建PV
相关命令:
# 创建 pv |
static-pv.yaml 示例文件: (参考资料 create-cephfs-static-pv)
apiVersion: v1 |
配置解析:
nodeStageSecretRef
:name
: 之前创建的密钥名。必需参数。namespace
: 之前创建的密钥所在的命名空间。必需参数。
volumeAttributes
: 卷相关属性。fsName
: 待挂载的 CephFS 文件系统名称。不传递此选项将挂载默认文件系统。可选参数。clusterID
: Ceph 集群 ID 。必需参数。staticVolume
: 必须将值设置为 true 才能挂载和卸载静态 CephFS PVC 。必需参数。rootPath
: Ceph 集群中子卷的实际路径,或者卷的文件夹路径。必需参数。
volumeHandle
: 可以是任何内容,不需要与 PV 名称或卷名称相同。为了简洁起见保持相同。persistentVolumeReclaimPolicy
: Ceph-CSI 不支持删除静态 PV 的 CephFS 子卷。所以该参数必须设置为 Retain ,以避免在 csi-provisioner 中尝试删除 PV 。
5.2.3、创建PVC
相关命令:
# 创建 pvc |
static-pvc.yaml 示例文件: (参考资料 create-cephfs-static-pvc)
apiVersion: v1 |
5.2.4、创建Pod
相关命令:
# 创建 pod |
static-pod.yaml 示例文件: (参考资料 verify-cephfs-static-pvc)
apiVersion: v1 |
5.3、动态配置
5.3.1、创建StorageClass
相关命令:
# 获取密钥 |
storageclass.yaml 文件示例: (参考文件 ./examples/cephfs/storageclass.yaml)
--- |
配置解析:
clusterID
: Ceph 集群 ID 。确保与 csi-config-map.yaml 中的集群 ID 保持一致。必需参数。fsName
: CephFS 文件系统名称,将会在其中创建卷。必需参数。pool
: Ceph 池名称,将会在其中存储卷数据。可选参数。fuseMountOptions
: Ceph-Fuse 挂载选项字符串,使用逗号分隔。可选参数。kernelMountOptions
: Cephfs 内核挂载选项字符串,使用逗号分隔。可选参数。mounter
: 挂载方式,可选值为 kernel/fuse 。默认将自动检测使用命令确定。可选参数。volumeNamePrefix
: 子卷命名前缀。默认为 csi-vol- 。可选参数。backingSnapshot
: 启用时 PVC 将由其数据源中指定的 CephFS 快照支持,这时不应配置pool
参数。默认为 true 。可选参数。encrypted
: 是否加密卷。默认为 false 。可选参数。encryptionKMSID
: 通过指定与 KMS ConfigMap 匹配的唯一 ID 来使用外部密钥管理系统进行加密密码。可选参数。
5.3.2、创建PVC
相关命令:
# 应用 pvc.yaml |
pvc.yaml 文件示例: (参考文件 ./examples/cephfs/pvc.yaml)
--- |
5.3.3、创建Pod
相关命令:
# 应用 pod.yaml |
pod.yaml 文件示例: (参考文件 ./examples/cephfs/pod.yaml)
--- |
六、CephRBD 对接 CSI
6.1、创建Secret
无论是使用静态配置还是动态配置,都需要创建 Secret ,因此这里统一设置。
相关命令:
# 应用 secret.yaml |
secret.yaml 文件示例: (参考文件 ./examples/rbd/secret.yaml)
--- |
配置解析:
userID
: 创建的访问 CephFS 的用户名;userKey
: 创建的访问 CephFS 的用户密码;encryptionPassphrase
: 加密密码;
6.2、静态配置
手动创建的 RBD 映像可以挂载到应用程序或从应用程序中卸载,以下步骤展示了如何创建 RBD 映像、静态 PV、静态 PVC 。
注意: 删除 PV 和 PVC 不会删除后端 RBD 映像,如果需要,用户需要手动删除 RBD 映像。
6.2.1、创建PV
相关命令:
# 创建 pv |
static-pv.yaml 示例文件: (参考资料: create-rbd-static-pv)
apiVersion: v1 |
参数解析:
fsType
:nodeStageSecretRef
:name
:namespace
:
volumeAttributes
:clusterID
: Ceph 集群 ID 。必需参数。pool
: 创建 RBD 映像的池名称。必需参数。staticVolume
: 必须将值设置为 true 才能挂载和卸载静态 RBD PVC 。必需参数。imageFeatures
: CSI RBD 目前支持 layering,journaling,exclusive-lock 功能。如果启用了 journaling ,则还必须启用 exclusive-lock 。必需参数。mounter
: 如果设置为 rbd-nbd ,则在具有 rbd-nbd 和 nbd 内核模块的节点上使用 rbd-nbd 来映射 RBD 映像。可选参数。
volumeHandle
: 对应之前创建的 RBD Image ,这里为 cephrbdimg01 。persistentVolumeReclaimPolicy
: Ceph-CSI 不支持删除静态 PV 的 RBD 映像。该参数必须设置为 Retain ,以避免在 csi-provisioner 中尝试删除 PV 。
6.2.2、创建PVC
相关命令:
# 创建 pvc |
static-pvc.yaml 示例文件: (参考资料: create-rbd-static-pvc)
apiVersion: v1 |
6.2.3、创建Pod
相关命令:
# 创建 pod |
static-pod.yaml 示例文件: (参考资料: verify-rbd-static-pvc)
apiVersion: v1 |
6.3、动态配置
6.3.1、创建StorageClass
相关命令:
# 更改并应用 storageclass.yaml |
storageclass.yaml 文件示例: (参考文件 ./examples/rbd/storageclass.yaml)
--- |
配置解析:
clusterID
: Ceph 集群 ID 。确保与 csi-config-map.yaml 中的集群 ID 保持一致。必需参数。dataPool
: 如果要使用带有 RBD 的纠删码池,则需要创建两个池。一个是纠删码池,一个是复制池。该参数用于设置对应的纠删码池。可选参数。pool
: Ceph 池名称,将会在其中存储卷数据。如果指定了 dataPool 的值,则该值用于设置对应额复制池,用于存储Image元数据。必需参数。imageFeatures
: RBD 图像功能,可选值为 layering,journaling,exclusive-lock,object-map,fast-diff,deep-flatten 。可选参数。mkfsOptions
: 在 RBD 设备上创建文件系统时传递给mkfs
命令的选项。当指定值后将取代默认值。默认选项取决于 csi.storage.k8s.io/fstype 类型。可选参数。- ext4 时,默认值为
-m0 -Enodiscard,lazy_itable_init=1,lazy_journal_init=1
; - xfs 时,默认值为
-K
;
- ext4 时,默认值为
tryOtherMounters
: 指定是否在当前挂载器无法挂载 rbd 图像时尝试其他挂载器。默认为 false 。可选参数。mapOptions
: 以逗号分隔的映射选项列表。默认为空。可选参数。unmapOptions
: 以逗号分隔的取消映射选项列表。默认为空。可选参数。csi.storage.k8s.io/fstype
: 指定卷的文件系统类型。如果未指定。可选参数。mounter
: 设置挂载器。可选参数。cephLogDir
: Ceph 客户端日志位置。可选参数。cephLogStrategy
: Ceph 客户端日志策略。默认为 remove 。可选参数。- remove : 取消映射时删除日志;
- compress : 取消映射时仅压缩而不删除;
- preserve : 取消映射时保留日志文件的文本格式;
volumeNamePrefix
: RBD 映像的前缀。默认为 csi-vol- 。可选参数。encrypted
: 是否加密卷。默认为 false 。可选参数。encryptionType
: 当启用加密卷时对应的加密类型。默认为 block 。可选参数。- file : 在挂载的文件系统上启用文件加密;
- block : 加密 RBD 块设备;
encryptionKMSID
: 指定与 KMS ConfigMap 匹配的唯一 ID 使用外部密钥管理系统进行加密密码。可选参数。topologyConstrainedPools
: 拓扑约束池配置,如果设置了基于拓扑的池,并且需要拓扑约束供应。可选参数。stripeUnit
: 图像条带化,条带单位(以字节为单位)。可选参数。stripeCount
: 图像条带化,在循环之前要条带化的对象。可选参数。objectSize
: 图像条带化,对象大小(以字节为单位)。可选参数。BaseReadIops
: RBD 卷 QoS ,每秒读取操作的基本限制。仅支持 rbd-nbd 挂载类型。可选参数。BaseWriteIops
: RBD 卷 QoS ,每秒写入操作的基本限制。仅支持 rbd-nbd 挂载类型。可选参数。BaseReadBytesPerSecond
: RBD 卷 QoS ,每秒读取字节的基本限制。仅支持 rbd-nbd 挂载类型。可选参数。BaseWriteBytesPerSecond
: RBD 卷 QoS ,每秒写入字节的基本限制。仅支持 rbd-nbd 挂载类型。可选参数。ReadIopsPerGiB
: RBD 卷 QoS ,每 GiB 的读取操作限制。仅支持 rbd-nbd 挂载类型。可选参数。WriteIopsPerGiB
: RBD 卷 QoS ,每 GiB 的写入操作限制。仅支持 rbd-nbd 挂载类型。可选参数。ReadBpsPerGiB
: RBD 卷 QoS ,每 GiB 的读取字节限制。仅支持 rbd-nbd 挂载类型。可选参数。WriteBpsPerGiB
: RBD 卷 QoS ,每 GiB 的写入字节限制。仅支持 rbd-nbd 挂载类型。可选参数。BaseVolSizeBytes
: RBD 卷 QoS ,用于根据容量计算 qos 的卷的最小大小。仅支持 rbd-nbd 挂载类型。可选参数。
6.3.2、创建PVC
相关命令:
# 应用 pvc.yaml |
pvc.yaml 文件示例: (参考文件 ./examples/rbd/pvc.yaml)
--- |
6.3.3、创建Pod
相关命令:
# 应用 pod.yaml |
pod.yaml 文件示例: (参考文件 ./examples/rbd/pod.yaml)
--- |
七、参考资料
- https://github.com/ceph/ceph-csi
- https://docs.ceph.com/en/latest/rbd/rbd-kubernetes/
- https://www.cnblogs.com/lianngkyle/p/14772121.html
- https://dylanyang.top/post/2021/05/15/k8s%E4%BD%BF%E7%94%A8ceph-csi%E6%8C%81%E4%B9%85%E5%8C%96%E5%AD%98%E5%82%A8cephfs/
- https://www.cnblogs.com/jiaxzeng/p/14880660.html
- https://www.modb.pro/db/137721
- https://kubernetes.io/zh-cn/docs/tutorials/hello-minikube/