配置 Multus 多 NIC 网络
本文介绍如何使用 Multus 将 ACP 分布式存储(Ceph)连接到专用容器网络,从而将 Ceph public 和 cluster 流量分离到不同的网络接口(NIC)上。
目录
概述两个管理界面限制和前提条件在集群创建时配置多 NIC 网络验证(新版控制台)检查 StorageCluster 网络设置检查实际生效的 CephCluster 网络设置检查 Ceph Pod 是否已挂载到网络检查工作负载挂载故障排查建议概述
默认情况下,ACP Ceph 存储集群使用主机网络(provider: host)。在 Web 控制台中创建存储集群时,也可以选择 Container Network,将 Ceph 流量放到单一容器网络中(分配给 rook-ceph 命名空间的一个 NetworkAttachmentDefinition)。有关基础单网络选项,请参见 创建标准存储服务。
Multus 多 NIC 网络在容器网络模型的基础上进行了扩展,使你可以将两个 Ceph 网络角色映射到不同的网络上:
- public network — Ceph 客户端(CSI、应用)与集群之间的客户端流量。
- cluster network — OSD 之间的内部流量,例如复制和恢复。
将这些角色分离到不同的 NIC 上可以提高隔离性,并避免大量的复制/恢复流量与客户端 I/O 争用。
所有到 OSD 和来自 OSD 的流量都使用 Multus 网络——这就是大部分存储数据路径:RBD 客户端 I/O、CephFS 数据和元数据(MDS)、对象数据(RGW 在 OSD 上读写对象),以及 OSD 复制。通过 Kubernetes Service 到达的端点——monitors(客户端使用 mon Service 获取集群映射)、manager 以及 RGW S3 endpoint——都通过默认网络提供服务;这些 daemon 即使已为其 Pod 挂载了 Multus 接口,仍会保持其面向 Service 的监听端口在默认网络上。这是 Rook 的行为,不是配置错误。因此,Multus 隔离的是存储数据路径,而不是由 Service 承载的控制面和入口端点。
两个管理界面
ACP 提供旧版和新版 Web 控制台,它们通过不同的资源管理 Ceph 存储。请在管理你的集群的资源上配置网络:
要确定某个集群由哪个资源管理,请检查是否存在 StorageCluster:
- 如果你的集群存在
StorageCluster,则由新版控制台管理——请在 StorageCluster 上配置网络(operator 会撤销对底层CephCluster的手动编辑)。 - 如果不存在
StorageCluster,则该集群由旧版控制台直接作为 CephCluster 管理——请在CephCluster上配置网络。
这两个资源暴露相同的网络字段(provider、selectors、addressRanges)。以下各节分别给出了两个管理界面的 manifest。
网络角色到网络的映射通过 selectors 声明:
你可以只指定 public,也可以同时指定 public 和 cluster。当 provider 为 multus 时,至少需要一个 selector。
限制和前提条件
在配置 Multus 多 NIC 网络之前,请注意以下限制:
-
仅支持创建时配置
- 必须在创建存储集群时配置 Multus 多 NIC 网络。不支持在运行中的集群上更改网络 provider:Ceph 必须对所有 monitor 执行故障切换才能应用新的网络模型,而且 API 不允许将一个非空 provider 直接切换到另一个非空 provider(必须先将 provider 恢复为空值)。请将网络模型视为集群的固定属性。
-
已安装 Multus CNI plugin
- 集群必须使用 Kube-OVN 作为网络 plugin,并且必须安装 Multus CNI plugin。这是一次性的、集群级别的设置。安装方法:进入 Administrator > Marketplace > Cluster Plugins,搜索
multus,然后安装 Alauda Container Platform Networking for Multus。详情请参见 配置 Kube-OVN 网络以支持 Pod 多网络接口。
- 集群必须使用 Kube-OVN 作为网络 plugin,并且必须安装 Multus CNI plugin。这是一次性的、集群级别的设置。安装方法:进入 Administrator > Marketplace > Cluster Plugins,搜索
-
单一 IP family
- Multus 网络必须使用单一 IP family。支持 IPv4 和 IPv6,但 Multus 不支持双栈(IPv4 和 IPv6 同时使用)。如需使用 IPv6,请在 network block 中设置
ipFamily: IPv6。 - 这与 创建标准存储服务 中的基础 Container Network 选项不同,后者不支持 IPv6。该限制仅适用于单网络表单选项;本文描述的 Multus 多 NIC 操作步骤支持 IPv6。
- Multus 网络必须使用单一 IP family。支持 IPv4 和 IPv6,但 Multus 不支持双栈(IPv4 和 IPv6 同时使用)。如需使用 IPv6,请在 network block 中设置
Multus 会将存储数据路径(OSD 流量)迁移到专用 NIC,但不会改变工作负载使用存储的方式:应用 Pod 不需要加入 Multus 网络。 客户端通过默认网络(经由 mon Service)访问 monitor,而在每个 node 上以 host networking 运行的 Ceph CSI driver 负责到 OSD 的数据路径。因此,真正的要求是存储 node 能够路由到 underlay network,而不是工作负载 Pod 必须挂载到该网络。请在部署前规划好网络角色、NAD 和 node 路由。
在集群创建时配置多 NIC 网络
多 NIC 设置不能在向导的表单字段中表达,但 Create Cluster 向导提供了 YAML mode。推荐的流程是:先像平常一样完成向导,让其自动填充 manifest,然后切换到 YAML mode,仅编辑网络部分,最后在 YAML mode 中提交。这样可以避免手工编写整个 manifest。
YAML mode 中显示的 manifest 取决于你的控制台(参见 两个管理界面):新版控制台显示 StorageCluster,旧版控制台显示 CephCluster。请编辑对应路径上的 network block。
创建 Multus 网络
若要在接近主机速度的条件下将存储流量放到专用物理 NIC 上,请使用 Kube-OVN Underlay 网络,而不是 overlay 网络。Underlay 会将专用物理 NIC 直接桥接到存储网络,不产生封装开销。
Underlay 需要先准备物理网络:每个 storage node 都需要一个专用 NIC(不承载 SSH 等其他流量),并且必须配置上游交换机端口/VLAN 和网关。然后创建一个 bridge network(ProviderNetwork)和一个 VLAN(Vlan),让存储子网挂载到其上。有关物理前提条件以及如何创建 bridge network 和 VLAN,请参见 准备 Kube-OVN Underlay 物理网络 和 配置子网。
对于要隔离的每个 Ceph 网络角色,在 rook-ceph 命名空间中创建一个 NetworkAttachmentDefinition 和一个对应的 underlay 子网。下面的示例创建 public 网络;如果你也想隔离复制流量,请使用不同的名称以及不同的 CIDR/VLAN 再创建 cluster 网络。
创建 NetworkAttachmentDefinition。provider 字段必须使用 <name>.<namespace>.ovn 格式:
创建为该网络提供地址的 underlay Kube-OVN subnet。将 vlan 设置为你准备好的 Vlan,使用与物理网络匹配的 cidrBlock/gateway,并让 provider 与 NetworkAttachmentDefinition 中的值一致:
应用这两个资源,然后确认 NetworkAttachmentDefinition 已存在:
在后续步骤中设置的 selectors 会以 <namespace>/<name> 形式引用这些 NAD,例如 rook-ceph/ceph-public-net。
打开 Create Cluster 向导
按照 创建标准存储服务 中的说明开始创建分布式存储集群。在 Create Cluster 步骤中,像平常一样配置 device classes、storage devices 和 component placement,这样向导会填充其余 manifest。
切换到 YAML mode
将向导从表单模式切换到 YAML mode。manifest 已根据你的选择自动填充。
编辑网络部分
在 manifest 中添加或替换 network block。设置 provider: multus,并配置将 Ceph public/cluster 角色映射到你的 NAD 的 selectors。
-
新版 Web 控制台 — manifest 是
StorageCluster;编辑spec.ceph.network: -
旧版 Web 控制台 — manifest 是
CephCluster;编辑spec.network(字段相同,但没有spec.ceph包装层):
如果你只需要将客户端流量迁移到专用网络,请仅保留 public selector,省略 cluster。
使用与 selectors 同级的 addressRanges block 明确设置 CIDR 范围。Rook 会尝试自动检测已挂载网络的 CIDR,但在 Kube-OVN underlay 网络上此检测并不可靠,可能会失败,使集群卡在“Configuring Ceph Mons”。指定 addressRanges 可以避免此问题:
使用你创建的 underlay 子网的 CIDR(如果没有将 cluster network 分离出来,只需要 public)。
如果 StorageCluster 一直处于 Progressing,并且底层 CephCluster 报告 failed to discover network CIDRs for multus,请添加或修正 addressRanges。
从 YAML mode 提交
保持在 YAML mode 下提交向导(点击 Create Cluster)。在提交之前不要切回表单模式,因为那样可能不会保留网络字段。
在新版控制台中,请在这里的 StorageCluster 中配置网络,而不要在之后去编辑 CephCluster。当集群由 StorageCluster 管理时,spec.network 是一个受管字段,对 CephCluster 的手动编辑会被 operator 恢复。
验证
存储集群创建完成后,请分别从 ACP 侧和 Ceph 侧验证网络配置。
(新版控制台)检查 StorageCluster 网络设置
如果你的集群由 StorageCluster 管理,请确认所需配置。Ceph StorageCluster 在 rook-ceph 命名空间中的名称始终为 ceph-cluster(这两项都由 admission 强制保证):
输出应包含预期的 provider 和 selectors:
检查实际生效的 CephCluster 网络设置
此检查适用于两个控制台,因为 CephCluster 是 Rook 实际作用的资源:
provider 和 selectors 应与配置一致。在新版控制台中,它们还应与管理该集群的 StorageCluster 一致。
检查 Ceph Pod 是否已挂载到网络
确认 Ceph daemon Pod(例如 MON 和 OSD)带有 Multus 网络挂载注解,并报告了预期的接口:
每个 OSD Pod 都应引用 public 网络,以及(如果已配置)cluster 网络。
检查工作负载挂载
创建或重启一个测试工作负载,使其挂载 CephFS PVC 和 RBD PVC,然后验证:
- Pod 能成功启动
- 文件系统可以正常读写
- CSI 或工作负载日志中没有出现与挂载相关的错误
故障排查建议
如果启用 Multus 后存储集群未能变为健康状态,请先检查以下项目:
- NAD 不存在 — selector 引用的
NetworkAttachmentDefinition在rook-ceph命名空间中不存在,或者<namespace>/<nad-name>引用拼写错误。 - 缺少 selector — 已设置
provider: multus,但未定义public或clusterselector。至少需要一个 selector。 - CIDR 检测失败 — Rook 无法自动检测网络范围。请显式指定
addressRanges。 - IP 不足 — NAD 背后的 IPAM 池(例如已配置的 CIDR 或 address range)没有可供新 Ceph Pod 使用的空闲地址。
- node 无法访问 underlay — Ceph CSI driver 以 host networking 运行,因此每个 node(而不是工作负载 Pod)都必须能够路由到 underlay 网络上的 OSD 地址。如果挂载卡住,请检查 node 的 Kube-OVN underlay 路由,以及 node 是否可以访问 OSD 地址。
如果集群无法恢复,请使用修正后的网络配置重新创建。由于无法在运行中的集群上切换网络模型,网络配置错误通常需要通过重新创建存储集群来解决,而不是就地 patch。