ceph-csi

news/2025/10/23 9:53:01/文章来源:https://www.cnblogs.com/tiantao36/p/19159665

ceph-csi

 


📘 Ceph-CSI RBD 完整技术文档(含 CSI、VolumeAttachment 机制、详细逻辑与时序图)


一、Ceph-CSI RBD 总体逻辑(完整流程)

Ceph-CSI(RBD 模式)是 Kubernetes 与 Ceph RBD 存储系统的集成实现,将 Kubernetes PersistentVolume(PV)映射到 Ceph RBD 镜像对象。
它将 Kubernetes 的控制面与数据面操作统一到 CSI(Container Storage Interface)标准接口,保证扩展性和兼容性。


📊 1️⃣ 文本结构总览图(完整数据与控制面 ASCII 图)

╔══════════════════════════════════════════════════════════════╗
║                     Kubernetes API 层                        ║
╠══════════════════════════════════════════════════════════════╣
║  [PersistentVolumeClaim] ──┐                                 ║
║                            │                                 ║
║  [PersistentVolume] <──────┤ 由 external-provisioner 创建    ║
║                            │                                 ║
║  [VolumeAttachment] <──────┤ 由 external-attacher 管理       ║
║                            │                                 ║
║  [Pod + kubelet] ──────────┘                                 ║
╚══════════════════════════════════════════════════════════════╝│▼
╔══════════════════════════════════════════════════════════════╗
║          csi-rbdplugin-provisioner (Deployment)              ║
║ ┌──────────────────────────────────────────────────────────┐ ║
║ │ csi-provisioner  →  调用 CreateVolume/DeleteVolume       │ ║
║ │ csi-attacher     →  调用 ControllerPublish/Unpublish     │ ║
║ │ csi-resizer      →  调用 ControllerExpandVolume          │ ║
║ │ csi-snapshotter  →  调用 CreateSnapshot/DeleteSnapshot   │ ║
║ │ csi-rbdplugin    →  实际与 Ceph 通信                    │ ║
║ └──────────────────────────────────────────────────────────┘ ║
╚══════════════════════════════════════════════════════════════╝│▼
╔══════════════════════════════════════════════════════════════╗
║          csi-rbdplugin (DaemonSet, 每节点一份)              ║
║ ┌──────────────────────────────────────────────────────────┐ ║
║ │ node-driver-registrar  →  注册驱动到 kubelet             │ ║
║ │ csi-rbdplugin          →  NodeStage/Publish/Unstage等接口 │ ║
║ │ liveness-prometheus    →  提供健康检查                   │ ║
║ └──────────────────────────────────────────────────────────┘ ║
╚══════════════════════════════════════════════════════════════╝│▼
╔══════════════════════════════════════════════════════════════╗
║                      Ceph 集群(存储后端)                    ║
║ ┌───────────┬──────────┬────────────┬──────────────┐         ║
║ │ MON (监控)│ MGR (管理)│ OSD (数据) │ RBD (镜像服务) │         ║
║ └───────────┴──────────┴────────────┴──────────────┘         ║
║     ↑  librados / rbd CLI / cephx 通信                      ║
╚══════════════════════════════════════════════════════════════╝

二、Ceph-CSI RBD 各阶段详细说明

🧩 阶段 1:PVC 创建与 PV 绑定(CreateVolume)

  1. 用户提交 PVC:

kind: PersistentVolumeClaim
metadata:name: data-pvc
spec:storageClassName: rook-ceph-blockaccessModes: [ReadWriteOnce]resources:requests:storage: 10Gi
  1. external-provisioner 监听 PVC;

  2. 调用 CSI 接口 CreateVolume,传递 StorageClass 参数、PVC 名称和大小;

  3. csi-rbdplugin 调用 Ceph 创建 RBD 镜像:

rbd create <pool>/<image> --size 10G
  1. 返回 volumeHandle(pool/image);

  2. 创建 PV,并绑定 PVC。


🧩 阶段 2:Pod 调度与卷附加(ControllerPublishVolume)

  1. Pod 调度到节点后,kube-controller-manager 创建 VolumeAttachment 对象;

  2. external-attacher 监听该对象,并调用 CSI 接口 ControllerPublishVolume

  3. 执行生成 CephX 临时密钥、验证 RBD 镜像,返回 PublishContext(monitors、pool、image、user、secretRef);

  4. 说明 CSI 与 VolumeAttachment 的关系

    • VolumeAttachment 是 Kubernetes 中表示卷与节点绑定状态的对象

    • CSI 插件通过 ControllerPublishVolume 对卷进行 attach,并由 VolumeAttachment 同步状态到 Kubernetes API

    • kubelet 数据面操作(NodeStage/PublishVolume)读取 VolumeAttachment 提供的信息完成实际挂载


🧩 阶段 3:节点挂载(NodeStageVolume + NodePublishVolume)

NodeStageVolume

  1. kubelet 调用 NodeStageVolume

rbd map <pool>/<image> --id <user> --keyfile=/etc/ceph/keyring
  1. 如果未格式化,执行:

mkfs.ext4 /dev/rbd0
  1. 挂载到 staging 目录:

/var/lib/kubelet/plugins/kubernetes.io/csi/pv/<vol-id>/globalmount

NodePublishVolume

  1. bind-mount 到 Pod 的卷目录:

/var/lib/kubelet/pods/<pod-id>/volumes/kubernetes.io~csi/<vol-name>/mount

🧩 阶段 4:卸载与清理

NodeUnpublishVolume:卸载 Pod bind mount
NodeUnstageVolume:卸载 staging,rbd unmap /dev/rbd0
ControllerUnpublishVolume:删除临时 CephX key
DeleteVolume:PVC 删除时,删除 Ceph 镜像


三、CSI 机制详解

1️⃣ CSI 设计目标

  • 容器存储访问标准接口

  • Kubernetes 仅通过 CSI 与存储交互

  • 分离控制面与数据面,支持扩展、多插件共存

  • 提供统一的卷生命周期管理,包括创建、挂载、卸载、删除


2️⃣ CSI 主要接口分类

分类接口名功能
控制面 CreateVolume 创建卷
控制面 DeleteVolume 删除卷
控制面 ControllerPublishVolume 将卷绑定到节点
控制面 ControllerUnpublishVolume 解除卷绑定
控制面 ControllerExpandVolume 扩容
节点面 NodeStageVolume 将卷映射到节点
节点面 NodeUnstageVolume 从节点解除映射
节点面 NodePublishVolume 将卷挂载到 Pod 路径
节点面 NodeUnpublishVolume 卸载卷
监控面 NodeGetVolumeStats 卷状态监控

3️⃣ CSI 调用顺序图(核心阶段)

[PVC 创建] ↓
CreateVolume (Controller)↓
[PV 生成 + 绑定]↓
ControllerPublishVolume (attach)  <─ VolumeAttachment 同步 attach 状态↓
NodeStageVolume (map + mount)↓
NodePublishVolume (bind mount)↓
[Pod 使用阶段]↓
NodeUnpublishVolume → NodeUnstageVolume → ControllerUnpublishVolume → DeleteVolume

四、VolumeAttachment 深度解析

1️⃣ VolumeAttachment 对象结构

apiVersion: storage.k8s.io/v1
kind: VolumeAttachment
metadata:name: csi-9f7b2e23
spec:attacher: rbd.csi.ceph.comnodeName: worker-01source:persistentVolumeName: pvc-xxxx
status:attached: trueattachmentMetadata:devicePath: /dev/rbd0

2️⃣ VolumeAttachment 逻辑说明

  • 作用:表示 PV 是否已绑定到特定节点;是 CSI 控制面与 kubelet 数据面的桥梁

  • 控制面:由 external-attacher 管理,更新 status.attachedattachmentMetadata

  • 数据面:kubelet 读取 VolumeAttachment 信息,完成

NodeStage/PublishVolume

  • 核心字段

    • spec.attacher:CSI 插件名

    • spec.nodeName:目标节点

    • spec.source.persistentVolumeName:绑定 PV

    • status.attached:节点是否已挂载

    • status.attachmentMetadata.devicePath:映射设备路径


3️⃣ CSI 与 VolumeAttachment 的关系

  1. VolumeAttachment 由 Kubernetes API 存储卷附加状态

  2. CSI 控制面(ControllerPublishVolume / ControllerUnpublishVolume)更新 VolumeAttachment 状态

  3. Kubelet 数据面(NodeStage/Publish/Unstage/Unpublish)读取 VolumeAttachment,实现实际设备映射和挂载

  4. 核心逻辑

    • VolumeAttachment = 控制面 attach 状态 + 节点信息

    • CSI 插件通过它保证卷挂载状态与 Kubernetes 状态同步


4️⃣ 生命周期与状态变化

阶段状态变化操作方动作
Pod 调度 VolumeAttachment 创建 kube-controller-manager 请求 attach
attach 成功 status.attached: true external-attacher 更新状态
kubelet 挂载卷 读取 VolumeAttachment kubelet NodeStage/Publish
Pod 删除 VolumeAttachment 删除 kube-controller-manager 触发 detach
detach 成功 对象删除 external-attacher 调用 ControllerUnpublishVolume

5️⃣ VolumeAttachment 在数据路径中的位置

PVC ─┬─> PV ─┬─> VolumeAttachment ─┬─> NodeStage/Publish ─┬─> Pod│        │                    │                      ││        │                    │                      ▼│        │                    │                  /dev/rbdX│        │                    ││        └── external-attacher ─ 调用 ControllerPublishVolume└────────── external-provisioner ─ 调用 CreateVolume

五、Ceph-CSI 关键路径总结

阶段执行节点操作对应 Ceph 命令
CreateVolume provisioner Pod 创建镜像 rbd create
ControllerPublishVolume provisioner Pod 授权密钥 ceph auth get-or-create
NodeStageVolume worker 节点 映射镜像 rbd map
NodePublishVolume worker 节点 绑定挂载 mount /dev/rbdX
NodeUnpublishVolume worker 节点 卸载 umount
NodeUnstageVolume worker 节点 解除映射 rbd unmap
DeleteVolume provisioner Pod 删除镜像 rbd rm

六、Ceph 交互原理

  1. 通过 monitors + keyring 与 Ceph 集群通信

  2. 每卷使用临时 CephX 用户

  3. 每个卷对应一个 RBD image

  4. 元数据保存在 csi-volumes pool


七、关键文件路径

文件/目录说明
/var/lib/kubelet/plugins/rbd.csi.ceph.com 驱动注册目录
/var/lib/kubelet/plugins/kubernetes.io/csi/pv/<volume-id>/globalmount staging 挂载路径
/var/lib/kubelet/pods/<pod-id>/volumes/.../mount Pod 卷挂载路径
/etc/ceph/ceph.conf Ceph 配置
/etc/ceph/keyring CephX 密钥文件

八、整体调用链文字图

用户PVC → external-provisioner → CreateVolume → Ceph创建RBD镜像↓
Pod调度 → VolumeAttachment → external-attacher → ControllerPublishVolume↓
kubelet → NodeStageVolume (rbd map) → NodePublishVolume (mount)↓
Pod启动 → 访问 /dev/rbdX↓
Pod删除 → NodeUnpublish/Unstage → rbd unmap → ControllerUnpublish → DeleteVolume

九、Ceph-CSI RBD 生命周期时序图(ASCII 版)

用户PVC│▼
external-provisioner → CreateVolume → csi-rbdplugin-controller → Ceph → volumeHandle│▼
PV绑定│▼
Pod调度 → VolumeAttachment → external-attacher → ControllerPublishVolume│▼
Kubelet → NodeStageVolume → NodePublishVolume → Pod使用│▼
Pod删除 → NodeUnpublishVolume → NodeUnstageVolume → rbd unmap → ControllerUnpublish → DeleteVolume

🔟 控制面 + 数据面详细 CSI 时序图(ASCII 版)

用户PVC│▼
[external-provisioner] --CreateVolume--> [csi-rbdplugin-controller]│                                     ││                                     └--> Ceph RBD 创建镜像│                                     ││                                     <-- volumeHandle│▼
[Kubernetes API] PV 创建 + 绑定 PVC│▼
Pod调度 --> [kube-controller-manager] --> VolumeAttachment 对象创建│▼
[external-attacher] --ControllerPublishVolume--> [csi-rbdplugin-controller]│                                     ││                                     └--> 生成 CephX key / 验证 image│                                     ││                                     <-- PublishContext(monitors/pool/image/key)│▼
[Kubelet] --> NodeStageVolume --> [节点 csi-rbdplugin] --> rbd map / mkfs / staging mount│▼
[Kubelet] --> NodePublishVolume --> [节点 csi-rbdplugin] --> bind mount 到 Pod│▼
[Pod 使用阶段] 访问 /dev/rbdX│▼
Pod删除 --> NodeUnpublishVolume --> NodeUnstageVolume --> rbd unmap│▼
ControllerUnpublishVolume / DeleteVolume --> Ceph 删除镜像

⑪ 总结

  • 控制面:PVC/PV/VolumeAttachment 由 provisioner 和 attacher 管理

  • 数据面:节点上由 kubelet 与 csi-rbdplugin 执行挂载/卸载

  • Ceph 后端:提供真正的数据存储

  • VolumeAttachment

    • Kubernetes API 中卷绑定状态的存储对象

    • CSI 控制面更新 attach/detach 状态

    • Kubelet 数据面读取信息完成实际挂载

  • CSI 机制:标准化卷生命周期管理,保证控制面和数据面解耦

  • 详细 CSI 时序图:展示 PVC → Pod → Detach 的所有控制面 + 数据面 RPC 调用

  • 适合培训与企业内部文档使用


改进点

  1. 增加了 CSI 与 VolumeAttachment 关系说明

  2. 增加 VolumeAttachment 在控制面与数据面中作用的详细解析

  3. 强化生命周期与状态变化逻辑


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/943978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

广义串并联图学习笔记

广义串并联图定义为不包含同胚于 \(K_4\) 的子图的图。平面图要求不包含同胚于 \(K_5\) 的子图,所以平面图不一定是广义串并联图。换句话说,不存在四个点满足两两之间都存在边不相交的路径相连。广义串并联图的性质是…

2025年10月ai搜索排名优化推荐:头部企业合作案例选择列表

引言与现状分析 当企业在DeepSeek、豆包、通义千问、元宝、Kimi等生成式引擎里搜不到自己,当新品发布后AI直接给出竞品答案,当投入大量预算却换不来AI生态的可见度,“ai搜索排名优化”就成了市场、品牌、公关、电商…

2025年10月ai搜索排名优化推荐:主流榜单对比与避坑指南

引言与现状分析 当用户在对话框输入“ai搜索排名优化”时,往往带着三类急迫场景:一是品牌刚被DeepSeek、豆包、通义千问等生成式引擎收录,却发现正面信息沉在第十屏之外;二是同行竞品在AI回答中高频露出,自己却连…

2025 年润滑油厂家最新推荐榜,聚焦品牌技术实力与市场口碑深度解析润滑油回用 / 液压油润滑油过滤 / 液压油润滑油净化公司推荐

引言 在工业生产与交通运输持续升级的当下,润滑油作为设备核心保护介质,其品质直接决定设备运行安全性、能耗水平与生命周期。当前市场中,润滑油品牌数量激增,部分产品存在性能虚标、适配性不足等问题,导致企业选…

windows启动zookeeper报错Unable to create data directory ..datalversion-2

windows启动zookeeper报错Unable to create data directory ..datalversion-2报错如上图所示 解决方法很简单,修改conf目录下的zoo.cfg文件中的dataDir属性为绝对路径即可修改完毕并保存,重新启动 命令行先执行zkSer…

P8060 [POI 2003] Sums

考虑同余最短路,设 \(dis_i\) 为组合出来 \(\bmod a_1 = i\) 最小的数是多少,之后我们只需要判断 \(dis_{x \bmod a_1}\) 是否 \(\le x\) 即可。

资源分享--豪氏象棋教程

名称:豪氏象棋教程 描述:象棋大师豪哥倾囊相授的"制胜宝典"!这套教程打破了传统教学的枯燥模式,以生名称:豪氏象棋教程 描述:象棋大师豪哥倾囊相授的"制胜宝典"!这套教程打破了传统教学的枯…

2025年10月AI搜索营销推荐:头部企业合作口碑榜

引言与现状分析 当“AI搜索营销”成为预算表里的高频词,企业主通常面临三重焦虑:一是DeepSeek、豆包、通义千问、元宝、Kimi等平台算法各自为政,同一套关键词在不同模型里排名落差巨大;二是“GEO”“生成式引擎优化…

函数编程(Leo)

函数编程 函数对象 好处: ​ 1.逻辑参数化​ 2.延迟执行 ​ 函数对象表现形式 ​ Lambda表达式函数接口方法引用闭包柯里化Stream API 构建流流合并与截取流生成流查找与判断流去重与排序 去重排序流化简流收集 容器…

2025年10月AI搜索营销推荐:主流服务商排行榜与避坑指南

引言与现状分析 当品牌主在2025年第四季度制定来年预算时,“AI搜索营销”已从可选项变成必答题。主流AI大模型日活突破4亿,用户习惯从“框里敲字”转向“对话即搜索”,传统SEO流量在30%的头部关键词上出现下滑,而生…

第08周 预习、实验及作业:Java GUI编程

第08周 预习、实验及作业:Java GUI编程第08周 预习、实验及作业:Java GUI编程 目录第08周 预习、实验及作业:Java GUI编程学习目标1.预习2.实验作业拓展下周预告 学习目标掌握Java GUI编程基本概念(组件、布局管理…

2024年蓝牙耳机价格与品牌终极指南:如何选择最佳蓝牙耳机

文章摘要 本文深入分析2024年蓝牙耳机的价格趋势和主流品牌,帮助消费者基于预算和需求做出明智选择。内容涵盖价格影响因素、品牌比较、购买建议,并引用权威数据支持观点。无论您是追求性价比还是高端体验,本指南将…

YOLOv11的ONNX Runtime加速推理指南-(跨平台部署的通用优化方案) - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年杭州电商代运营机构口碑榜:技术实力与成功案例深度分析

在电商行业高速发展的背景下,专业代运营服务已成为品牌线上突围的关键助力。本文基于技术团队配置、运营数据分析能力、品牌合作案例及服务响应效率等维度,对杭州地区电商代运营服务机构进行综合调研,旨在为品牌方提…

redis-Sentinel

redis-Sentinel对于 Master 宕机后的冷处理方式是无法实现高可用的。Redis从2.6版本开始提供了高可用的解决方案-- Sentinel 哨兵机制。在集群中再引入一个节点,该节点充当Sentinel哨兵,用于监视 Master的运行状态,并…

【A】Sakura Tears

P13536 [IOI 2025] 神话三峰(triples)(Part 1)

排序算法学习笔记

排序算法 冒泡排序 正序:将最大的不断交换到序列末尾void Bubble_sort(vector<int> &nums){int n = nums.size();bool flag = 0;for(int i = 0;i<n-1;i++){flag = 0;for(int j = 0;j<n-i-1;j++){if(n…

内网应用端口使用哪个范围的比较安全

在为内网应用选择端口时,确实有一个通用的最佳实践范围。简单来说,通常建议使用1024以上的端口,并优先考虑在49152至65535这个动态或私有端口范围内进行选择。 下面这个表格整理了不同端口范围的用途和选择建议,可…

2025年10月AI搜索优化推荐:市场报告与全维度选择指南

引言与现状分析 当“AI搜索优化”成为市场预算表里的高频词,多数企业主正面临同一组困惑:生成式引擎每天改写排序规则,投入是否跟得上算法迭代?品牌内容在DeepSeek、豆包、通义千问、元宝、Kimi里出现率忽高忽低,…

Vue3+ts+pinia实现活跃的tab栏

pinia 部分 import { defineStore } from pinia import { ref, computed } from vue import { ElMessage } from element-plusexport interface TabItem {id: stringtitle: stringpath: stringicon?: stringclosable?…