存储分布式文件系统对象存储后端高可用【免费下载链接】cephCeph is a distributed object, block, and file storage platform项目地址https://gitcode.com/gh_mirrors/ce/ceph点击查看免费下载本篇技术指南聚焦于在 HashiCorp Nomad 集群中接入 Ceph 块设备RBD的完整方案以官方文档 doc/rbd/rbd-nomad.rst 为主线通过部署ceph-csi插件实现 RBD 镜像的动态供给与已有镜像的导入并覆盖存储池创建、CephX 认证配置、Nomad 特权容器设置、CSI Controller/Node 双组件部署以及用 MySQL 容器验证数据持久化的全过程。读完本文你将能够独立完成 Ceph 集群 → ceph-csi → Nomad 任务 整条链路的搭建与排障。与 Kubernetes 类似Nomad 同样可以消费 Ceph 块设备其桥梁正是ceph-csi它既能动态供给dynamic provisioning新的 RBD 镜像也能导入集群中已存在的 RBD 镜像。本文的参考基准为 Nomad v1.1.2文档撰写时的最新版本ceph-csi镜像使用quay.io/cephcsi/cephcsi:v3.3.1。Ceph 块设备的基本特性可参考 Ceph Block Device 总览。Nomad/Ceph 技术栈全景在 Nomad 环境中使用 Ceph 块设备本质上是让 Nomad 的 CSI 插件机制csi_plugin块与 Ceph 的存储后端对接。官方文档给出了如下分层结构-------------------------------------------------- | Container | ceph-csi | | | node | | ^ | ^ | ------------------------------------------------- | | | | | v | | | Nomad | | --------------------------------------------------- | ceph-csi | | controller | -------------------------------------------------- | | | configures maps | --------------- ---------------- | | v v ------------------------ ------------------------ | | | rbd--nbd | | Kernel Modules | ------------------------ | | | librbd | ------------------------------------------------- | RADOS Protocol | ------------------------------------------------- | OSDs | | Monitors | ------------------------ ------------------------容器侧任务容器通过 Nomad 挂载 CSI 卷访问由ceph-csi node插件暴露的卷。调度侧ceph-csi controller负责与 Ceph 集群 APIMonitor通信执行卷的创建、删除等控制面操作ceph-csi node则在客户端节点上执行卷挂载、格式化等数据面操作。接入侧底层有两种数据通道——默认使用RBD 内核模块rbdlibceph也可以使用rbd-nbdlibrbd用户态方案二者最终都通过 RADOS 协议与 OSD/Monitor 交互。注意Nomad 支持多种任务驱动task driver本文示例只使用 Docker 容器。重要ceph-csi默认使用 RBD 内核模块而内核模块可能并不支持全部的 Ceph CRUSH tunables 或 RBD 镜像特性如某些较新的 image feature 需要较新的内核版本在规划镜像特性时需要格外留意。第一步创建存储池默认情况下Ceph 块设备使用rbd池。但为了与 Nomad 的持久化存储隔离需要为 Nomad 单独创建一个池。确保 Ceph 集群处于运行状态后执行ceph osd pool create nomad关于池的 placement groupsPG数量设置参见 创建池 与 Placement Groups 的详细说明——PG 数量直接影响集群的均衡性与性能需按池的规模合理规划。新建的池在使用前必须初始化。使用rbd工具初始化rbd pool init nomadrbd pool init会为该池创建 RBD 所需的默认元数据对象例如rbd_directory、rbd_info等只有完成初始化后池才能承载 RBD 镜像。第二步配置 ceph-csi 客户端认证创建 Ceph 客户端用户ceph-csi需要以专用身份访问 Ceph 集群。执行下面的命令创建client.nomad用户并记录输出的 key后续配置 volume 时要用$ ceph auth get-or-create client.nomad mon profile rbd osd profile rbd poolnomad mgr profile rbd poolnomad [client.nomad] key AQAlh9Rgg2vrDxAARy25T7KHabs6iskSHpAEAQ命令中各段的含义如下段授权内容mon profile rbd赋予 Monitor 上 RBD 相关操作的rbdprofile 权限osd profile rbd poolnomad赋予 OSD 上仅针对nomad池的rbdprofile 权限权限被限定在池内mgr profile rbd poolnomad赋予 mgr 上仅针对nomad池的rbdprofile 权限从源码角度profile rbd的具体授权语义定义在 src/mon/MonCap.cc它授予mon、osd、pg三个子系统的只读权限同时额外授予osd blocklist及兼容旧版的osd blacklist权限——这正是 RBD 独占锁exclusive lock实现死客户端 blocklist所依赖的能力。也就是说profile rbd不是泛泛的完全访问而是经过裁剪的、恰好够 RBD 客户端工作的最小权限集。配置 Nomad 允许特权容器默认情况下Nomad 不允许容器使用 privileged 模式而ceph-csi node插件需要特权来挂载内核模块设备因此必须放开限制。编辑 Nomad 配置文件/etc/nomad.d/nomad.hcl加入以下配置块plugin docker { config { allow_privileged true } }加载 rbd 内核模块Nomad 节点上必须已加载rbd内核模块。确认方法$ lsmod | grep rbd rbd 94208 2 libceph 364544 1 rbd如果rbd模块未加载则手动加载sudo modprobe rbd重启 Nomad使上述配置生效sudo systemctl restart nomad第三步部署 ceph-csi controller 与 node 插件ceph-csi插件由两个组件构成Controller plugin控制器插件与 Ceph 集群provider 的 API通信负责卷的创建、删除、快照等控制面操作Node plugin节点插件在 Nomad 客户端节点上执行任务负责卷的挂载/卸载等数据面操作。提示两个 job 文件中都会出现 ceph-csi 的版本示例为v3.3.1。关于 ceph-csi 与其他版本的兼容性请参考 ceph-csi 官方 release 说明。收集集群信息Controller 插件需要 Ceph 集群的 monitor 地址。通过ceph mon dump同时获取集群唯一标识fsid与 monitor 地址$ ceph mon dump ... fsid b9127830-b0cc-4e34-aa47-9d1a2e9949a8 ... 0: [v2:192.168.1.1:3300/0,v1:192.168.1.1:6789/0] mon.a 1: [v2:192.168.1.2:3300/0,v1:192.168.1.2:6789/0] mon.b 2: [v2:192.168.1.3:3300/0,v1:192.168.1.3:6789/0] mon.c配置 controller 插件生成ceph-csi-plugin-controller.nomad文件将上一步获取的fsid填入clusterIDmonitor 地址填入monitorsjob ceph-csi-plugin-controller { datacenters [dc1] group controller { network { port metrics {} } task ceph-controller { template { data EOF [{ clusterID: b9127830-b0cc-4e34-aa47-9d1a2e9949a8, monitors: [ 192.168.1.1, 192.168.1.2, 192.168.1.3 ] }] EOF destination local/config.json change_mode restart } driver docker config { image quay.io/cephcsi/cephcsi:v3.3.1 volumes [ ./local/config.json:/etc/ceph-csi-config/config.json ] mounts [ { type tmpfs target /tmp/csi/keys readonly false tmpfs_options { size 1000000 # size in bytes } } ] args [ --typerbd, --controllerservertrue, --drivernamerbd.csi.ceph.com, --endpointunix://csi/csi.sock, --nodeid${node.unique.name}, --instanceid${node.unique.name}-controller, --pidlimit-1, --logtostderrtrue, --v5, --metricsport$${NOMAD_PORT_metrics} ] } resources { cpu 500 memory 256 } service { name ceph-csi-controller port metrics tags [ prometheus ] } csi_plugin { id ceph-csi type controller mount_dir /csi } } } }关键点说明template块生成的config.json挂载到容器内/etc/ceph-csi-config/config.jsonceph-csi 据此发现 Ceph 集群change_mode restart表示配置文件变更时自动重启任务通过tmpfs挂载/tmp/csi/keys用于存放运行时密钥内存盘不落盘--controllerservertrue声明该实例运行 controller 服务--drivernamerbd.csi.ceph.com是 RBD CSI 驱动名--nodeid${node.unique.name}与--instanceid保证 controller 与 node 实例的标识唯一csi_plugin块声明这是一个 CSI 插件任务type controller、mount_dir /csi用于存放 CSI socket。配置 node 插件生成ceph-csi-plugin-nodes.nomad文件同样替换clusterID与monitorsjob ceph-csi-plugin-nodes { datacenters [dc1] type system group nodes { network { port metrics {} } task ceph-node { driver docker template { data EOF [{ clusterID: b9127830-b0cc-4e34-aa47-9d1a2e9949a8, monitors: [ 192.168.1.1, 192.168.1.2, 192.168.1.3 ] }] EOF destination local/config.json change_mode restart } config { image quay.io/cephcsi/cephcsi:v3.3.1 volumes [ ./local/config.json:/etc/ceph-csi-config/config.json ] mounts [ { type tmpfs target /tmp/csi/keys readonly false tmpfs_options { size 1000000 # size in bytes } } ] args [ --typerbd, --drivernamerbd.csi.ceph.com, --nodeservertrue, --endpointunix://csi/csi.sock, --nodeid${node.unique.name}, --instanceid${node.unique.name}-nodes, --pidlimit-1, --logtostderrtrue, --v5, --metricsport$${NOMAD_PORT_metrics} ] privileged true } resources { cpu 500 memory 256 } service { name ceph-csi-nodes port metrics tags [ prometheus ] } csi_plugin { id ceph-csi type node mount_dir /csi } } } }与 controller 任务的两处关键差异job 的type system保证该任务在每个匹配的客户端节点上都运行这正是 node 插件的要求容器配置了privileged true这是第一步在 Nomad 中放开特权容器限制的原因——node 插件需要特权以操作 RBD 内核模块参数由--controllerservertrue换成--nodeservertruecsi_plugin的type换成node。启动插件并检查状态分别提交两个 jobnomad job run ceph-csi-plugin-controller.nomad nomad job run ceph-csi-plugin-nodes.nomad首次运行会下载ceph-csi镜像。等待几分钟后用nomad plugin status检查插件健康状态$ nomad plugin status ceph-csi ID ceph-csi Provider rbd.csi.ceph.com Version 3.3.1 Controllers Healthy 1 Controllers Expected 1 Nodes Healthy 1 Nodes Expected 1 Allocations ID Node ID Task Group Version Desired Status Created Modified 23b4db0c a61ef171 nodes 4 run running 3h26m ago 3h25m ago fee74115 a61ef171 controller 6 run running 3h26m ago 3h25m ago当Controllers Healthy与Nodes Healthy都等于Expected时说明 ceph-csi 已就绪可以开始供给 RBD 卷。第四步使用 Ceph 块设备创建 RBD 镜像CSI 卷ceph-csi需要 CephX 凭据才能与 Ceph 集群通信。生成ceph-volume.hcl文件填入第二步创建的 nomad 用户 ID 与 CephX keyid ceph-mysql name ceph-mysql type csi plugin_id ceph-csi capacity_max 200G capacity_min 100G capability { access_mode single-node-writer attachment_mode file-system } secrets { userID admin userKey AQAlh9Rgg2vrDxAARy25T7KHabs6iskSHpAEAQ } parameters { clusterID b9127830-b0cc-4e34-aa47-9d1a2e9949a8 pool nomad imageFeatures layering mkfsOptions -t ext4 }各字段含义字段说明id/name卷的唯一标识与名称ceph-mysqltype csi声明这是 CSI 卷plugin_id ceph-csi关联到已部署的 CSI 插件capacity_max/capacity_min卷容量区间Nomad 将据此在min~max之间选择容量动态供给示例为 100G~200Gaccess_mode single-node-writer单节点读写模式与 MySQL 这类单写者应用匹配attachment_mode file-system以文件系统方式挂载而非 block 原始设备secrets.userID/userKeyCephX 凭据示例使用admin生产环境建议使用client.nomad等最小权限用户parameters.clusterID集群 fsid与插件配置中的clusterID一致parameters.pool目标池即第一步创建的nomadparameters.imageFeaturesRBD 镜像特性示例只启用layering克隆支持。由于 ceph-csi 默认走内核模块路径应只启用内核支持的特性组合详见下文镜像特性与内核模块一节parameters.mkfsOptions首次挂载时 mkfs 的参数示例为格式化为ext4生成文件后创建卷nomad volume create ceph-volume.hcl将 RBD 镜像挂载进容器以改造 HashiCorp 官方的 Nomad stateful 示例为练习生成mysql.nomad文件job mysql-server { datacenters [dc1] type service group mysql-server { count 1 volume ceph-mysql { type csi attachment_mode file-system access_mode single-node-writer read_only false source ceph-mysql } network { port db { static 3306 } } restart { attempts 10 interval 5m delay 25s mode delay } task mysql-server { driver docker volume_mount { volume ceph-mysql destination /srv read_only false } env { MYSQL_ROOT_PASSWORD password } config { image hashicorp/mysql-portworx-demo:latest args [--datadir, /srv/mysql] ports [db] } resources { cpu 500 memory 1024 } service { name mysql-server port db check { type tcp interval 10s timeout 2s } } } } }要点group 内的volume块声明挂载名为ceph-mysql的 CSI 卷source指向第四步创建的卷 idvolume_mount将卷挂载到容器内/srvMySQL 数据目录为/srv/mysql通过--datadir指定卷的access_mode/attachment_mode必须与卷定义中的 capability 一致。启动任务nomad job run mysql.nomad检查任务状态$ nomad job status mysql-server ... Status running ... Allocations ID Node ID Task Group Version Desired Status Created Modified 38070da7 9ad01c63 mysql-server 0 run running 6s ago 3s ago验证数据持久性验证持久化的标准流程是向数据库写入数据 →nomad job stop停止purge该 job → 使用同一份mysql.nomad重新提交。由于卷仍指向同一个 RBD 镜像重启后数据依然存在——这就是同一个 RBD 镜像被重新使用re-used的持久化机制。如果数据在作业销毁重建后仍在说明整条 Nomad ceph-csi Ceph RBD 链路工作正常。纵深源码视角下的关键机制profile rbd到底授予了什么在 src/mon/MonCap.cc 中profile rbd的展开逻辑清晰可见凡是rbd前缀的 profile都会获得mon、osd、pg三个子系统的只读权限外加osd blocklist以及兼容的osd blacklist授权且 blocklist 命令参数被限定为IP/nonce形式。这意味着RBD 客户端可以读取集群拓扑monmap/osdmap/pgmap但默认不能执行写类管理命令当某个持有独占锁exclusive lock的客户端失联时新的写入者可以将其 blocklist这是 RBD 锁机制正确工作的前提。因此部署时给ceph-csi使用独立的最小权限用户而非admin是更安全的生产实践——文档示例中的client.nomad正是按profile rbd裁剪的。镜像特性与内核模块的兼容边界文档明确警告ceph-csi默认使用 RBD 内核模块并非所有镜像特性都被内核支持。在 doc/rbd/rbd-config-ref.rst 的 Image Features 一节中可以查到各特性的内核支持情况Layering内部值 1KRBD 自 Linux v3.10 起支持默认开启用于支持克隆Striping v2内部值 2KRBD 自 v3.10 支持仅默认条带默认开启Exclusive locking内部值 4KRBD 自 v4.9 支持默认开启其余特性如 Object map、Fast diff 等各有对应的 KRBD 支持版本部分特性如deep-flatten、fast-diff相关组合在较老内核上不受支持。这就是本文示例在parameters.imageFeatures中仅显式指定layering的原因在内核模块路径下显式声明内核确定支持的特性组合可避免因启用过高版本特性导致挂载失败。若需要用到更完整的高级特性则应改用rbd-nbdlibrbd用户态接入路径见技术栈图中的rbd-nbd分支这通常意味着额外的 node 端配置。相关仓库资料本指南主文档doc/rbd/rbd-nomad.rstCeph 块设备总览doc/rbd/index.rstRBD 镜像特性参考doc/rbd/rbd-config-ref.rst存储池创建指南doc/rados/operations/pools.rstPlacement Groups 规划doc/rados/operations/placement-groups.rstCRUSH tunables 说明doc/rados/operations/crush-map.rstprofile rbd权限实现src/mon/MonCap.cc赞分享存储分布式文件系统对象存储后端高可用【免费下载链接】cephCeph is a distributed object, block, and file storage platform项目地址https://gitcode.com/gh_mirrors/ce/ceph点击查看免费下载相关推荐Kubernetes Handbook使用 rbd-provisioner 为 Ceph RBD 提供动态持久化存储Dynamic Provisioning实战指南Kubernetes Handbook使用 rbd provisioner 为 Ceph RBD 提供动态持久化存储Dynamic Provisioning教程云原生容器编排Ceph 块设备与 Kubernetes基于 Ceph-CSI 的动态卷供应完整指南Ceph 块设备与 Kubernetes基于 Ceph CSI 的动态卷供应完整指南 导读 本文围绕 Ceph 官方文档中“Block Devices and存储分布式文件系统对象存储后端高可用Ceph-CSI NVMe-oF 驱动实战通过 NVMe/TCP 网关为容器供给 RBD 块设备Ceph CSI NVMe oF 驱动实战通过 NVMe/TCP 网关为容器供给 RBD 块设备 导读 本文讲解 Ceph 分布式存储的容器存储接口CSI存储分布式文件系统对象存储后端高可用上一篇终极指南如何用direnv彻底告别环境变量混乱实现项目环境自动切换下一篇MMLW-retrieval-roberta-large性能评测波兰语信息检索基准NDCG10达58.46的背后创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
