
云原生CLI【免费下载链接】openebsA popular widely deployed Open Source Container Native Storage platform for Stateful Persistent Applications on Kubernetes.项目地址https://gitcode.com/gh_mirrors/op/openebs点击查看免费下载本篇技术指南以 OpenEBS 仓库中的设计文档 RWX Block Volume Support in Mayastor for KubeVirtOEP 4059状态implementable为核心剖析 Mayastor 如何在块卷上实现ReadWriteManyRWX语义从而让 KubeVirt 虚拟机可以在节点间热迁移live migration。读完本文你将掌握 CSI 访问模式与 KubernetesaccessModes之间的映射关系、Mayastor 基于 NVMe-oF 的多启动器multi-initiator数据通路设计、自上而下的五处控制面改动清单以及多路连接下 HA 故障切换的防抖动风险与缓解思路。背景与动机KubeVirt 热迁移为什么需要 RWX 块卷在 KubeVirt 的虚拟机VM使用场景中用户当前主要依赖ReadWriteOnceRWO访问模式的 PVC 挂载磁盘。RWO 意味着同一时刻只能有一个节点对卷执行读写这直接限制了虚拟机在不同节点之间的调度与迁移能力——KubeVirt 官方要求 PVC 具备ReadWriteMany访问模式才能启用其 live migration在线热迁移能力。该 OEP 的动机部分指出如果让 Mayastor 支持块Block类型的 RWX 卷虚拟机在热迁移时可以把同一块块设备从源节点切换到目标节点从而支持跨节点迁移、实现高可用HA、便于节点维护等场景。这是仓库中 README 将 Mayastor 定位为 Replicated PV复制卷子项目的延续——README.md 中把 Mayastor 与 Local PV Hostpath、ZFS、LVM 等本地卷引擎并列而 Mayastor 负责的是跨节点复制与共享访问这类更高阶的卷语义。目标与非目标Goals / Non-GoalsGoals目标在 Mayastor 中实现 RWX 块卷支持确保与 KubeVirt 虚拟机磁盘挂载的兼容性提供 CSI 兼容的 RWX 块卷语义可选支持 Persistent Reservations持久预留用于 fencing隔离/防冲突。Non-Goals非目标明确不做的事文件系统Filesystem卷的 RWX 支持——本提案明确拒绝文件系统卷的多写共享因为这在技术上无法成立非 KubeVirt 工作负载的 RWX 支持VM 级别的 fencing 或 quorum 管理——原文档特别强调we dont want to share, but rather to switch!我们不追求多写共享而是要完成切换。值得注意的是后续的设计文档 ReadOnlyMany (ROX) Support for Filesystem-Mode VolumesOEP 4242正是在此基础上进一步拓展的它复用本 OEP 铺好的多主机挂载路径为文件系统卷引入MultiNodeReaderOnly。这说明 RWX 块卷的多启动器数据通路是 Mayastor 共享卷能力的基石。总体方案CSI 访问模式与 NVMe-oF 多启动器路径CSI 规范允许的多种访问模式CSI 规范定义了多种access mode能力原文档摘录了与本提案直接相关的两种MULTI_NODE_SINGLE_WRITER一个卷可以同时在多个节点发布publish。同一时刻只允许其中一个节点读写其余节点只能只读。MULTI_NODE_MULTI_WRITER一个卷可以同时在多个节点以读写方式发布。Kubernetes 的访问模式缺口只有ReadWriteManyKubeVirt 消费的是 Kubernetes 层面的卷PV/PVC而 Kubernetes 并没有ReadWriteOneReadMany这类访问模式——它只有ReadWriteMany这一种多节点访问模式。因此要在 K8s 生态里给 KubeVirt 提供多节点共享块设备的能力Mayastor 只能通过实现MultiNodeMultiWriter能力来支撑ReadWriteMany的块卷。为什么 NVMe-oF 天然合适Mayastor 当前在协议层只暴露NVMe-oFNVMe over Fabrics。NVMe-oF 本身就把同一命名空间被多个节点同时访问作为基本设计场景因此它非常适合把卷同时暴露给多个节点多个 initiator启动器即客户端节点可以同时连接到同一个 target目标/nexus每个 initiator 通过各自路径访问同一块卷无需额外协议转换。NVMe 预留Reservations本提案选择不实现访问控制NVMe 协议本身支持reservations预留机制它可以控制对共享命名空间的访问防止主机之间的冲突确保数据完整性与一致性。然而本 OEP 的目标场景被明确限定为 KubeVirtKubeVirt 自身已经负责了卷在节点间的 flushing数据刷盘与 switching切换因此 Mayastor 无需再通过 reservations 做访问控制。原文档明确写道Considering this OEP is targeting KubeVirt specifically, then we may skip implementing access control through the reservations, on the premise that KubeVirt is already taking care of this by itself.鉴于该 OEP 专门针对 KubeVirt可以跳过基于预留的访问控制实现前提是 KubeVirt 自己已经处理好了这些。作为可选方向原文档也提到可以改造 csi-node在连接时携带 reservations 参数但需要仔细权衡且作者明确表示本次不做Im not planning on doing it for this。用户故事User StoriesStory 1作为用户我希望把 KubeVirt 虚拟机从一个节点热迁移到另一个节点我接受为了实现这一点必须使用块卷。Story 2作为用户我需要热迁移能够容忍卷目标volume-target的故障切换failover——即迁移过程中存储侧发生目标漂移时迁移仍能顺利完成。这两条故事决定了实现的底线既要打通多节点同时挂载又要让 HA 故障切换在共享挂载场景下保持稳定。实施细节自上而下的五处修改原文档按照 top-down自上而下的顺序列出了需要修改的组件这是理解整个功能落地路径的关键脉络扩展 Mayastor CSI对外宣告MultiNodeMultiWriter能力且仅对块模式卷生效对文件系统fs卷必须拒绝该能力since that cannot possibly work!因为那根本不可能行得通。Core agent 必须接受卷已被发布但发布到另一节点的重复发布请求即允许同一个卷被多次publish到不同节点而非直接拒绝。Core agent 在构建 NVMe-oF target 的访问控制列表ACL时必须汇总所有合法 initiator 的 NQNNVMe Qualified Name将各节点的 initiator 标识统一纳入 ACL使多节点同时接入成为可能。HA/Cluster agent 必须按节点per-node维度跟踪卷的失败 NQN 路径故障定位从卷级细化到节点-路径级。HA/Cluster agent 必须确保每个卷的RepublishVolume操作是原子的atomic每次成功的RepublishVolume之后所有节点都应尝试复用新产生的uri只要reuse_existing为 true每个节点重复执行RepublishVolume是允许的。第 5 点是整个方案中抗抖动anti-flapping的关键设计与后文风险与缓解一节直接呼应。多节点连接拓扑以下是原文档给出的连接拓扑示意mermaid 图展示了三个节点 控制面的完整形态关键点解读两个工作节点node-1、node-2上各自运行kubelet与csi-node并通过 csi-node 下发配置给各自的nvme-of-initiator两个 initiator 通过nvme-of同时连接到 node-3 上的io-engine即卷目标/nexus控制面由RestPublic API与CoreInternal API两层构成csi-controller通过 Public API 与 Rest 交互Core 通过 Internal API 直接管理 io-engine从拓扑可见数据通路是多对一两个 initiator → 同一个 io-engine nexus这正是MultiNodeMultiWriter的物理基础。发布Publish时序原文档给出了两次发布请求Node-1、Node-2的时序图注意其中的分支判断逻辑两个关键分支第一次发布Node-1alt First publishes implies volume target creation——首次发布触发卷目标nexus创建并把 Node-1 加入允许客户端列表第二次发布Node-2CSI Controller一侧必须校验mode is MultiNodeMultiWriter and access type is Blockalt Node-1 and Node-2 are both allowed——此时不需要重建 nexus只需把 Node-2 追加为允许客户端。这解释了为什么第二次发布不能走拒绝路径而是追加 initiator——这正是实施细节第 2、3 条在时序层面的体现。Public OpenAPI / Internal gRPC / Kubectl Plugin无需改动原文档明确标注Public OpenAPI无需改动No changes requiredInternal gRPC无需改动Kubectl Plugin无需改动。这进一步说明RWX 块卷能力完全是在现有 API 与协议之上通过行为扩展实现的接口面保持稳定对上层工具链如kubectl-mayastor插件仓库中 plugin/ 目录对应其 Rust 实现透明。测试计划Test Plan原文档指出测试该特性自然需要演练多挂载multi-attach场景即在不同节点上调度多于 1 个工作负载访问同一个块卷。此外必须覆盖拒绝文件系统卷的多挂载确认 fs 卷的MultiNodeMultiWriter请求被正确拒绝HA 特性测试确保在多个 initiator 同时尝试触发 failover时卷目标不会出现抖动/翻转flapping。与 ROX 文档的测试思路对照rox-filesystem.md 中采用 BDD 风格的 Behaviour specification行为规范组织测试用例涵盖 happy path、opt-out 保留、挂载选项、nexus 层强制、并发挂载、跨模式重发布、模式冲突拒绝等本 OEP 的测试计划留出了Behaviour specification小节位置原文档该处内容待补可作为后续补充测试用例的挂载点。风险与缓解Risks and Mitigations核心风险多路 failover 引发的自馈式抖动循环为了保证高可用当 initiator 到 target 的连接失败时Mayastor 会触发卷目标到其他节点的 failover。引入多挂载multi-attach后系统内会同时存在多条 initiator-target 连接一旦网络抖动这些连接可能同时或短时序内先后发起 failover 请求。原文档警告This could wreak havoc in the system, leading into a self-feeding loop of failovers.这可能在系统中引发混乱导致自我延续的 failover 循环。缓解方案必须从两方面加固 failover 逻辑对短时序内连续发生的 failover 具备抗性resistive to short-succession failovers——即要有防抖/去重机制强制 initiator 优先对新-已存在new-existing的 target 尝试重连具体来说如果前一次 failover 已经创建了新 target那么后续的 failover 请求应当去连接这个新-已存在的 target而不是再次触发创建更新的 target——否则第二次 failover 会破坏第一次 failover 的成果。这一设计与实施细节第 5 条原子RepublishVolumereuse_existing形成闭环HA agent 通过原子化的重发布与复用已存在 uri策略从机制上压制了 failover 风暴。毕业标准与实施历史Graduation Criteria原文档中标注为TODO尚未填写——说明该 OEP 仍处于早期推进阶段毕业条件待定。Implementation History记录显示 theSummaryandMotivationsections being merged signaling owner acceptanceSummary 与 Motivation 章节已合并标志所有者接受提案。补充事实据同仓库的 ROX 设计文档 记载RWX block 能力已作为experimental实验性功能随 v2.11.0 发布用于 KubeVirt 场景采用的就是本 OEP 描述的多 initiator NVMe-oF 挂载路径且该能力通过 StorageClass 参数rwx_block形式 opt-in 启用。这些记录交叉印证了本 OEP 的落地进展并提示读者该特性当前仍处于实验阶段其网络分区partition处理尚未完整后续 ROX 特性的毕业也依赖于多主机挂载路径从 experimental 走向 GA。缺陷Drawbacks原文档指出的主要缺陷是如果COContainer Orchestrator容器编排系统或external-attacher出现混淆在卷已被发布时误触发了一次重复的 publish 请求系统现在的行为是简单地追加一个新的 initiator而不是拒绝该请求。原文档作者认为这可能不是大问题但确实是一个值得记录的设计权衡——重复发布不再被当作错误处理而是被静默接受为多节点接入的合法操作。替代方案Alternatives原文档评估的唯一可行替代方案是在 Mayastor 卷之上叠加 NFS。但这存在明显缺陷NFS 会引入额外协议层延迟this does also add latency as compared to using block volumes directly性能不如直接使用块卷正如 ROX 文档进一步论证的NFS 这类协议中间层会破坏依赖直接 NVMe target 的场景如 GPU Direct Storage。从仓库后续演进看ROX 文档在 Alternatives 一节 同样把 NFS layered on an RWO volume 列为非首选方案并进一步否定了 每 pod 一个 RWO PV 克隆浪费存储、冷启动延迟与MULTI_NODE_SINGLE_WRITERK8s 没有对应 accessModes无法驱动 K8s 原生生命周期等路径——这与本 OEP 的判断一脉相承对 KubeVirt 这类需要原生 K8s 语义的工作负载NVMe-oF 直接共享块卷是最务实的技术路线。总结与延伸阅读OEP 4059 为 Mayastor 的 RWX 块卷能力勾勒了一条清晰的落地路径在 CSI 层宣告MultiNodeMultiWriter仅限块卷→ Core agent 接受跨节点重复发布并汇总多 initiator NQN → HA agent 按节点跟踪失败路径并以原子RepublishVolume配合reuse_existing抑制 failover 风暴。整套设计依托 Mayastor 已有的 NVMe-oF 数据通路无需改动 Public OpenAPI、Internal gRPC 与 kubectl 插件界面面保持最小侵入。有兴趣的读者可以继续深入以下仓库文档OEP 4059 原文RWX Block Volume Support in Mayastor for KubeVirt本文的主体依据OEP 4242ROX 文件系统卷支持RWX 块卷的姊妹提案复用同一多主机挂载路径并记录 v2.11.0 实验性发布状态Mayastor 加密与 TLS 相关设计 与 TLS共享卷通路上的安全加固方向Helm 图表中的 Mayastor 部署配置mayastor.csi.node.initContainers等部署参数入口Mayastor kubectl 插件实现kubectl-mayastor的命令行入口本 OEP 明确其无需改动。需要注意当前仓库镜像中mayastor/子模块目录为空本文对源码级调用链的描述均以仓库内设计文档的明确记载为依据RWX 块卷相关实现细节建议以 OpenEBS Mayastor 上游发布版本及实验性功能文档为准。赞分享云原生CLI【免费下载链接】openebsA popular widely deployed Open Source Container Native Storage platform for Stateful Persistent Applications on Kubernetes.项目地址https://gitcode.com/gh_mirrors/op/openebs点击查看免费下载相关推荐OpenEBS Mayastor 文件系统卷 ReadOnlyManyROX支持深度解析OEP 4242 技术方案、实现细节与 RWO→ROX 生命周期实践OpenEBS Mayastor 文件系统卷 ReadOnlyManyROX支持深度解析OEP 4242 技术方案、实现细节与 RWO→ROX 生命周期实云原生CLIKstone备份策略分钟级对象存储备份与实时Learner备份全攻略Kstone备份策略分钟级对象存储备份与实时Learner备份全攻略 Kstone是一个全方位的etcd管理平台提供集群管理、监控、备份、巡检等核心功能。其MySQL Docker高可用集群部署构建企业级数据库架构的终极指南MySQL Docker高可用集群部署构建企业级数据库架构的终极指南 MySQL Docker高可用集群部署是现代企业构建可靠数据库架构的关键技术。通过Doc数据库上一篇暗黑2存档编辑器 d2s-editor 手把手指南1 分钟把角色改到 99 级毕业下一篇大气层整合包首次启动与金手指配置完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考