尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
k8s集群通过csi对接ceph集群,rbd提供动态存储pv(4)
一·、前言上篇介绍了客户端挂载使用rbd块设备。本文介绍生产上ceph如何通过csi对接k8s集群通过rbd提供k8s的动态存储pv。温馨提示ceph19.2.6版本为了修复安全漏洞秘钥升级了需要7以上的内核。大坑兄弟替大家踩过坑了建议生产使用19.2.3以下版本推荐阅读[CVE] [URGENT] Squid v19.2.6 and Tentacle v20.2.4 released - ceph-announce - lists.ceph.io二、环境说明环境K8sv1.23.17Ubuntu22.04docker runtime3 节点CephSquid 19.2.3cephadm 部署目标Ceph RBD CSI 动态供给 PVC官方 ceph-csirbd 驱动三、官网推荐阅读https://docs.ceph.com/en/reef/rbd/rbd-kubernetes/四、步骤一、ceph基础环境准备1.ceph创建一个存储池。[rootceph141 ~]# ceph osd pool create ceph-block-pool 128声明[rootceph141 ~]# ceph osd pool ls detail2,创建csi专用用户单独权限不要用admin[rootceph141 ~]# ceph auth get-or-create client.k8s-csi mon allow r osd allow rwx poolceph-block-pool mgr allow r #19.2.6版本的密钥长度 [client.k8s-csi] key AgA7puFqTA/2ACAAbXYBsZOGD9uzBVxMUl74RNrGrNQLLsfJkbQmScqWow #19.2.3版本的密钥长度 [client.k8s-csi] key AQAiaNqAOxhGxAALKdiiO3/ThJ3W5QpY5Wo8g ​ [rootceph141 ~]#拿到 key后面要放到k8s secret[rootceph141 ~]# ceph auth get-key client.k8s-csi AgA7puFqTA/2ACAAbXYBsZOGD9uzBVxMUl74RNrGrNQLLsfJkbQmScqWow[rootceph141 ~]#获取 ceph fsid集群唯一ID必用[rootceph141 ~]# ceph fsid 0fcfb026-d3ab-11f1-8474-31750d21178a [rootceph141 ~]#二、k8s基础环境准备1.所有的k8s节点都需要安装ceph-common客户端工具rbd依赖。(只安装ceph-common工具不需要拷贝ceph的admin用户的证书)节点上 krbd 内核模块、rbd 命令csi-node 插件需要它做映射 rbd 设备。可以参考我之前博客使用cephadm部署ceph集群ceph进阶之路-1.cephadm部署ceph集群_cephadm下载地址-CSDN博客1.安装cephadm2.安装ceph-common小编有点累了下面的不用代码框了验证所有节点已经安装ceph-common[rootmaster231 ~]# rbd --version ceph version 19.2.7 (9ec952b9f9668e9fa97e29a4c2b51e951674df2a) squid (stable) [rootmaster231 ~]# [rootworker232 ~]# rbd --version ceph version 19.2.7 (9ec952b9f9668e9fa97e29a4c2b51e951674df2a) squid (stable) [rootworker232 ~]# [rootworker233 ~]# rbd --version ceph version 19.2.7 (9ec952b9f9668e9fa97e29a4c2b51e951674df2a) squid (stable) [rootworker233 ~]#2.检查网络连通性k8s的所有节点和ceph的mon6789端口[rootmaster231 ~]# telnet 10.0.0.141 6789 [rootmaster231 ~]# telnet 10.0.0.142 6789 [rootmaster231 ~]# telnet 10.0.0.143 67893.所有k8s节点加载rbd内核模块[rootmaster231 ~]# lsmod | grep rbd [rootmaster231 ~]# modprobe rbd [rootmaster231 ~]# lsmod | grep rbd rbd 114688 0 libceph 454656 1 rbd [rootmaster231 ~]# [rootworker232 ~]# modprobe rbd [rootworker232 ~]# lsmod | grep rbd rbd 114688 0 libceph 454656 1 rbd [rootworker232 ~]# [rootworker233 ~]# lsmod | grep rbd [rootworker233 ~]# modprobe rbd [rootworker233 ~]# modprobe rbd [rootworker233 ~]# lsmod | grep rbd rbd 114688 0 libceph 454656 1 rbd [rootworker233 ~]#三、部署csi一、基础环境的yaml文件部署1.ns.yaml[rootmaster231 ceph-csi]# cat ns.yaml apiVersion: v1 kind: Namespace metadata: name: ceph-csi-rbd ​ [rootmaster231 ceph-csi]#部署验证[rootmaster231 ceph-csi]# kubectl apply -f ns.yaml namespace/ceph-csi-rbd created [rootmaster231 ceph-csi]# kubectl get ns ceph-csi-rbd NAME STATUS AGE ceph-csi-rbd Active 17s ​2.csi-rbd-secret.yaml[rootmaster231 ceph-csi]# cat csi-secret.yaml apiVersion: v1 kind: Secret metadata: name: ceph-rbd-secret namespace: ceph-csi-rbd stringData: userID: k8s-csi userKey: AgA7puFqTA/2ACAAbXYBsZOGD9uzBVxMUl74RNrGrNQLLsfJkbQmScqWow ​ [rootmaster231 ceph-csi]#部署验证[rootmaster231 ceph-csi]# kubectl apply -f csi-secret.yaml secret/ceph-rbd-secret created [rootmaster231 ceph-csi]# kubec3.csi-driver-rbd.yaml[rootmaster231 ceph-csi]# cat csi-driver-rbd.yaml apiVersion: storage.k8s.io/v1 kind: CSIDriver metadata: name: rbd.csi.ceph.com spec: attachRequired: true podInfoOnMount: true fsGroupPolicy: File ​部署验证[rootmaster231 ceph-csi]# kubectl apply -f csi-driver-rbd.yaml csidriver.storage.k8s.io/rbd.csi.ceph.com created [rootmaster231 ceph-csi]#4.storageclass-rbd.yaml[rootmaster231 ceph-csi]# cat storageclass-rbd.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: ceph-rbd-sc provisioner: rbd.csi.ceph.com parameters: clusterID: 5137c1d2-c390-11f1-a8ef-874362e1ed81 pool: ceph-block-pool imageFeatures: layering csi.storage.k8s.io/provisioner-secret-name: ceph-rbd-secret csi.storage.k8s.io/provisioner-secret-namespace: ceph-csi-rbd csi.storage.k8s.io/node-stage-secret-name: ceph-rbd-secret csi.storage.k8s.io/node-stage-secret-namespace: ceph-csi-rbd csi.storage.k8s.io/controller-expand-secret-name: ceph-rbd-secret csi.storage.k8s.io/controller-expand-secret-namespace: ceph-csi-rbd csi.storage.k8s.io/fstype: ext4 reclaimPolicy: Delete allowVolumeExpansion: true ​⚠️ reclaimPolicy: Delete 测试环境用上线生产改成 Retain防止删 PVC 直接丢数据温馨提示StorageClass 里的reclaimPolicy控制当你在 k8s 里删除 PVC 的时候Ceph 里对应的 RBD 镜像怎么处理reclaimPolicy: Delete删除 PVC → csi 插件自动去 ceph 集群里删除这个 rbd 镜像✅ 适合测试环境删 PVC 就清干净资源不会残留垃圾镜像 ❌ 风险极高一旦误删 PVC数据直接没了无法恢复reclaimPolicy: Retain删除 PVC →不会删除 Ceph 里的 RBD 镜像镜像保留在 ceph-block-pool 里 此时 PV 会变成Released状态不会自动回收 ✅ 生产环境用防止误删 PVC 造成数据丢失 后续如果你确认数据不要了需要手动删除 PV到 ceph 集群手动rbd rm ceph-block-pool/镜像名部署验证[rootmaster231 ceph-csi]# kubectl apply -f storageclass-rbd.yaml storageclass.storage.k8s.io/ceph-rbd-sc created ​二、拉取官方 rbac、controller、node yamlv3.11.0yaml文件1.从github官网获取yaml文件需要的yaml文件为页面里现在的文件名之前的旧名字作用csi-provisioner-rbac.yamlcsi-rbd-provisioner-rbac.yamlcontrollerprovisioner的 RBAC 权限csi-nodeplugin-rbac.yamlcsi-rbd-node-rbac.yamlnode 插件的 RBAC 权限csi-rbdplugin-provisioner.yamlcsi-rbd-controller.yamlCSI ControllerDeployment负责创建 RBD 镜像csi-rbdplugin.yamlcsi-rbd-node.yamlCSI NodeDaemonSet每个节点挂载卸载 RBDcsidriver.yamlcsi-driver-rbd.yamlCSIDriver 资源定义GitHub · Change is constant. GitHub keeps you ahead. · GitHub · GitHubceph-csitag-》v3.11.0deploy-rbd/kubernets页面里现在的文件名之前的旧名字作用csi-provisioner-rbac.yamlcsi-rbd-provisioner-rbac.yamlcontrollerprovisioner的 RBAC 权限csi-nodeplugin-rbac.yamlcsi-rbd-node-rbac.yamlnode 插件的 RBAC 权限csi-rbdplugin-provisioner.yamlcsi-rbd-controller.yamlCSI ControllerDeployment负责创建 RBD 镜像csi-rbdplugin.yamlcsi-rbd-node.yamlCSI NodeDaemonSet每个节点挂载卸载 RBDcsidriver.yamlcsi-driver-rbd.yamlCSIDriver 资源定义csi-config-map.yaml新增这个版本不需要我们不用它下载文件方式一、浏览器下载文件然后传到服务器方式二wget下载2.更改yaml文件的namespace替换名称空间为自己需要的名称空间我的这里ceph-csi用的是ceph-csi-rbd这个名称空间。[rootmaster231 ceph-csi]# sed -i s/namespace: default/namespace: ceph-csi-rbd/g csi-provisioner-rbac.yaml csi-nodeplugin-rbac.yaml csi-rbdplugin-provisioner.yaml csi-rbdplugin.yaml拉镜像2.部署前准备拉镜像2.1拉镜像部署涉及到这些镜像所有的worker节点都需要拉镜像需要的镜像我的阿里源仓库国内加速地址quay.io/cephcsi/cephcsi:v3.11.0太大了流量不够用quay.m.daocloud.io/cephcsi/cephcsi:v3.11.0registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.10.0crpi-4x444avp1n5z7m4n.cn-huhehaote.personal.cr.aliyuncs.com/chenjie666888/csi-node-driver-registrar:v2.10.0k8s.m.daocloud.io/sig-storage/csi-node-driver-registrar:v2.10.0registry.k8s.io/sig-storage/csi-provisioner:v4.0.0太大了流量不够用k8s.m.daocloud.io/sig-storage/csi-provisioner:v4.0.0registry.k8s.io/sig-storage/csi-attacher:v4.5.0太大了流量不够用k8s.m.daocloud.io/sig-storage/csi-attacher:v4.5.0registry.k8s.io/sig-storage/csi-resizer:v1.10.0太大了流量不够用k8s.m.daocloud.io/sig-storage/csi-resizer:v1.10.0registry.k8s.io/sig-storage/csi-snapshotter:v7.0.0太大了流量不够用k8s.m.daocloud.io/sig-storage/csi-snapshotter:v7.0.02.2打tag通过加速源拉下来的镜像需要打下tag和yaml里面的image一样所有镜像都需要打tag以下面这个为例[rootworker232 ~]# docker tag k8s.m.daocloud.io/sig-storage/csi-provisioner:v4.0.0 registry.k8s.io/sig-storage/csi-provisioner:v4.0.0 [rootworker232 ~]# docker image rmi k8s.m.daocloud.io/sig-storage/csi-provisioner:v4.0.0 Untagged: k8s.m.daocloud.io/sig-storage/csi-provisioner:v4.0.0 Untagged: k8s.m.daocloud.io/sig-storage/csi-provisionersha256:de79c8bbc271622eb94d2ee8689f189ea7c1cb6adac260a421980fe5eed667083.部署部署RBACkubectl apply -f csi-provisioner-rbac.yaml kubectl apply -f csi-nodeplugin-rbac.yaml部署CSIDRIVER(上面已经部署了这一步可以省略)部署controller和node插件kubectl apply -f csi-rbdplugin-provisioner.yaml kubectl apply -f csi-rbdplugin.yaml4.检查pods[rootmaster231 ceph-csi]# kubectl -n ceph-csi-rbd get pods NAME READY STATUS RESTARTS AGE csi-rbdplugin-grrjc 0/3 ContainerCreating 0 20h csi-rbdplugin-kmnpr 0/3 ContainerCreating 0 20h csi-rbdplugin-provisioner-7dbd5d6c48-78m64 0/7 ContainerCreating 0 20h csi-rbdplugin-provisioner-7dbd5d6c48-8xhx4 0/7 ContainerCreating 0 20h csi-rbdplugin-provisioner-7dbd5d6c48-rdqz7 0/7 Pending 0 20h [rootmaster231 ceph-csi]#发现pods都没有起来describe提示cm挂载失败查看发现没有cm资源ceph-configceph-csi-configceph-csi-encryption-kms-config[rootmaster231 ceph-csi]# kubectl -n ceph-csi-rbd get cm NAME DATA AGE kube-root-ca.crt 1 24h [rootmaster231 ceph-csi]#原因是这 3 个 ConfigMap 必须单独部署官方原版 yamlcsi-rbdplugin.yaml、provisioner.yaml已经硬编码挂载了这 3 个 CM。[rootmaster231 ceph-csi]# kubectl -n ceph-csi-rbd get pods csi-rbdplugin-grrjc -o yaml \ | egrep -e ceph-csi-config -e ceph-csi-encryption-kms-config -e ceph-csi - mountPath: /etc/ceph-csi-config/ name: ceph-csi-config - mountPath: /etc/ceph-csi-encryption-kms-config/ name: ceph-csi-encryption-kms-config name: ceph-csi-config name: ceph-csi-config name: ceph-csi-encryption-kms-config name: ceph-csi-encryption-kms-config [rootmaster231 ceph-csi]#configmap5.部署cm推荐阅读https://docs.ceph.com/en/reef/rbd/rbd-kubernetes/5.1三个cm的作用1ceph-config必须 挂载路径/etc/ceph/ 作用给 CSI 容器提供 ceph.conf 配置文件包含 mon 地址、cephx 认证配置容器内部执行 rbd 命令读取此配置连接 Ceph 集群Ceph。 内容ceph.conf 空 keyringkeyring 必须存在留空即可Ceph。 2ceph-csi-config核心、必须 挂载路径/etc/ceph-csi-config/ 作用Ceph-CSI 全局集群清单JSON 格式定义多个 Ceph 集群的 clusterID(fsid) 和 monitors 列表CSI 插件启动后读取这个文件识别要对接哪些 Ceph 集群Ceph。 关键字段clusterIDceph fsid、monitors[mon地址列表]Ceph。 3ceph-csi-encryption-kms-config可选不加密也要建空 CM 挂载路径/etc/ceph-csi-encryption-kms-config/ 作用存放块加密 KMS 密钥服务配置你不用 RBD 加密也要创建一个空的 ConfigMap否则 pod 挂载会失败5.2部署cmceph-config.yaml官方原版apiVersion: v1 kind: ConfigMap metadata: name: ceph-config namespace: ceph-csi-rbd data: ceph.conf: | [global] auth_cluster_required cephx auth_service_required cephx auth_client_required cephx mon_host 10.0.0.141:6789,10.0.0.142:6789,10.0.0.143:6789 keyring: | ​ceph-csi-config.yaml官方原版apiVersion: v1 kind: ConfigMap metadata: name: ceph-csi-config namespace: ceph-csi-rbd data: config.json: |- [ { clusterID: 你的ceph fsid, monitors: [ 10.0.0.141:6789, 10.0.0.142:6789, 10.0.0.143:6789 ] } ] ​获取 fsid 命令ceph fsidceph-csi-encryption-kms-config.yaml空配置不加密必建apiVersion: v1 kind: ConfigMap metadata: name: ceph-csi-encryption-kms-config namespace: ceph-csi-rbd data: config.json: {} ​验证[rootmaster231 ceph-csi]# kubectl -n ceph-csi-rbd get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES csi-rbdplugin-provisioner-669fdc67db-plrhq 7/7 Running 0 11s 10.100.1.208 worker232 none none csi-rbdplugin-provisioner-669fdc67db-zldmx 7/7 Running 0 93s 10.100.2.127 worker233 none none csi-rbdplugin-tfkbv 3/3 Running 0 36m 10.0.0.232 worker232 none none csi-rbdplugin-xqkmt 3/3 Running 0 35m 10.0.0.233 worker233 none none [rootmaster231 ceph-csi]#五、部署pvc验证ceph和k8s的联动性1.创建pvc.yaml[rootmaster231 ceph-csi]# cat pvc-test.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: rbd-test-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: ceph-rbd-sc ​ [rootmaster231 ceph-csi]#应用[rootmaster231 ceph-csi]# kubectl apply -f pvc-test.yaml persistentvolumeclaim/rbd-test-pvc created ​2.验证[rootmaster231 ceph-csi]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE rbd-test-pvc Bound pvc-893efc06-fe65-4930-ac50-bba89da4ccf8 1Gi RWO ceph-rbd-sc 5s [rootmaster231 ceph-csi]ceph验证下存储池的rbd[rootceph141 ~]# rbd ls -l ceph-block-pool NAME SIZE PARENT FMT PROT LOCK csi-vol-61f4416d-25d3-4215-b297-323a1b5c087d 1 GiB 2 [rootceph141 ~]#本文作者jasonchen陈杰转载请标注原文链接。下章介绍19.2.6版本的大坑之处以及集群版本如何回退问题。
RELATED

相关推荐

医疗深拆:验证光谱、责任结构与数据孤岛

医疗深拆:验证光谱、责任结构与数据孤岛

医疗是全系列验证器光谱最硬的一端:诊断有金标准、药物有临床试验、错误有死亡作为不可逆代价——第 26 篇说科学是验证器最硬的领域,医疗比科学更硬一层,因为验证的账单以人命计价。医疗深拆因此回答一个精确问题:在责任、监管与…

📅 2026/10/31 7:02:45
世界模型深拆:视频生成、潜在模拟与物理直觉

世界模型深拆:视频生成、潜在模拟与物理直觉

终章写下"全部的悬念在消化侧"之后,技术侧仍有一条正在成形的正面前线:世界模型。语言模型预测下一个词,世界模型预测下一个状态——把"下一个 token"从符号序列搬到物理时空。这不是第 15 篇(多模态&#xf…

📅 2026/10/31 7:02:45
【LMP】规范精讲[10]: 语音专线开线记——SCO 固定占座与 eSCO 限时重传

【LMP】规范精讲[10]: 语音专线开线记——SCO 固定占座与 eSCO 限时重传

手头两份日志摆在一起看特别有意思。一份是立体声耳机的连接:链路建立后双方互探能力,特性集里明晃晃带着扩展同步传输的支持位,免提应用层的能力查询也有来有回,可从头到尾没有一条语音专线建立,音乐数据全部跑在异步…

📅 2026/10/31 7:02:45
MORE NEWS

更多资讯

📰

OpenShell 命令行框架实战:命令注册、参数校验与跨语言组合

1. 从零认识 OpenShell:它到底解决什么问题第一次听到 OpenShell 这个名字,很多人会下意识以为它跟某个操作系统内核或者远程终端工具有关。实际上,OpenShell 是一个面向命令行交互场景的开源框架,核心目标是把“人跟机器对话”这…

📰

串联混合动力汽车能量管理与模型预测控制实践

1. 串联混合动力汽车能量管理概述 串联混合动力汽车(Series Hybrid Electric Vehicle, SHEV)作为新能源汽车的重要分支,其能量管理系统的设计直接决定了整车性能和经济性表现。与传统燃油车相比,SHEV的动力系统架构具有显著差异&a…

📰

PostgreSQL并发控制:MVCC与锁机制详解

1. 并发控制的基本概念与PostgreSQL实现 在数据库系统中,并发控制是确保多个事务同时执行时数据一致性的关键技术。PostgreSQL作为一款功能强大的开源关系型数据库,提供了多种并发控制机制来应对不同的业务场景需求。 并发控制主要解决三类问题&#xf…

📰

搜索引擎高级检索的底层逻辑与六大全能语法

1. 这不是“搜索技巧”,而是信息筛选的底层逻辑重构很多人把“高级搜索语法”当成玄学口诀来背:site:、intitle:、filetype:这些符号像咒语一样被反复默念,却始终卡在“搜到了但不是我要的”这个死循环里。我带过不少刚接触信息检索的某高校学…

📰

DirectDraw老源码迁移实战:从编译到双缓冲游戏循环

简介:这份资源是《Windows游戏编程大师技巧(第二版)》配套光盘源码的完整打包,面向有一定C基础、希望系统学习Windows平台游戏开发的中高级读者,可用于对照书中章节动手复现示例、理解底层实现思路。压缩包共收录1035个…

📰

ICU4C 54.1 源码包实战:从编译集成到裁剪优化

简介:这份资源是 ICU4C 54.1 版本的完整 C 源码包,面向需要在 Windows 平台使用 Visual C 编译国际化与 Unicode 支持库的开发者,尤其适合从事跨语言、跨区域应用开发的中高级 C 工程师。压缩包共 4519 个文件,约 25.7MB&#xff…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬