配置 Multus 多网卡网络

本文介绍如何使用 Multus 将 ACP 分布式存储(Ceph)连接到专用容器网络,从而将 Ceph public 和 cluster 流量分配到不同的网络接口(NIC)。

概述

默认情况下,ACP Ceph 存储集群使用主机网络(provider: host)。从 Web 控制台创建存储集群时,也可以选择容器网络,将 Ceph 流量置于单个容器网络上(分配给 rook-ceph 命名空间的单个 NetworkAttachmentDefinition)。有关基本的单网络选项,请参阅创建标准存储服务。

Multus 多网卡网络扩展了容器网络模型,使你可以将两个 Ceph 网络角色映射到不同的网络:

  • public network — Ceph 客户端(CSI、原生应用)与集群之间的客户端流量。
  • cluster network — OSD 之间的内部流量,例如复制和恢复流量。

将这两个角色分配到不同的网卡可以增强隔离性,并避免大量复制/恢复流量与客户端 I/O 争用资源。

NOTE

所有流入和流出 OSD 的流量都使用 Multus 网络——这是主要的存储数据路径:RBD 客户端 I/O、CephFS 数据和元数据(MDS)、对象数据(RGW 在 OSD 上读取/写入对象),以及 OSD 复制流量。通过 Kubernetes Service 访问的端点——monitors(客户端使用 mon Service 获取集群映射)、manager 和 RGW S3 端点——通过默认网络提供服务;即使这些守护进程的 Pod 连接了 Multus 接口,它们面向 Service 的监听器仍使用默认网络。这是 Rook 的行为,并非配置错误。因此,Multus 隔离的是存储数据路径,而不是由 Service 提供服务的控制和入口端点。

两个管理界面

ACP 提供旧版和新版 Web 控制台,它们通过不同的资源管理 Ceph 存储。请在管理集群的资源上配置网络:

Web 控制台管理资源网络配置位置
新版 Web 控制台StorageCluster(由存储 operator 管理)StorageCluster.spec.ceph.network — operator 将其映射到底层的 CephCluster.spec.network
旧版 Web 控制台CephCluster(Rook,直接管理)CephCluster.spec.network

要确定哪个资源管理特定集群,请检查是否存在 StorageCluster:

kubectl get storagecluster -A
  • 如果集群存在 StorageCluster,则由新版控制台管理 — 请在 StorageCluster 上配置网络(operator 会还原对底层 CephCluster 的手动修改)。
  • 如果不存在 StorageCluster,则集群由旧版控制台作为 CephCluster 直接管理 — 请在 CephCluster 上配置网络。

这两种资源都公开相同的网络字段(provider、selectors、addressRanges)。以下各节提供了每种管理界面对应的清单。

网络角色与网络之间的映射通过 selectors 声明:

选择器键Ceph 角色后端网络
publicCeph public network作为 <namespace>/<nad-name> 引用的 NetworkAttachmentDefinition(NAD)
clusterCeph cluster(复制)网络作为 <namespace>/<nad-name> 引用的 NetworkAttachmentDefinition(NAD)

你可以仅指定 public,也可以同时指定 public 和 cluster。当 provider 为 multus 时,至少需要一个选择器。

限制和前提条件

配置 Multus 多网卡网络之前,请注意以下限制:

  • 仅限创建时配置

    • 必须在创建存储集群时配置 Multus 多网卡网络。不支持更改运行中集群的网络提供程序:应用新的网络模型需要 Ceph 将所有监视器故障转移,而且 API 不允许直接从一个非空提供程序切换到另一个非空提供程序(必须先将提供程序恢复为空值)。请将网络模型视为集群的固定属性。
  • 已安装 Multus CNI 插件

    • 集群必须使用 Kube-OVN 作为网络插件,并且必须安装 Multus CNI 插件。这是一次性集群范围设置。若要安装,请导航至管理员 > Marketplace > 集群插件,搜索 multus,然后安装 Alauda Container Platform Multi-Network。详情请参阅配置 Kube-OVN 网络以支持 Pod 多网络接口。
  • 单一 IP 地址族

    • Multus 网络必须使用单一 IP 地址族。IPv4 和 IPv6 均受支持,但 Multus 不支持双栈(同时使用 IPv4 和 IPv6)。若要使用 IPv6,请在网络块中设置 ipFamily: IPv6。
    • 这与创建标准存储服务中的基本容器网络选项不同;该选项不支持 IPv6。此限制仅适用于该单网络表单选项;此处介绍的 Multus 多网卡操作步骤支持 IPv6。
WARNING

Multus 会将存储数据路径(OSD 流量)移至专用网卡,但不会改变工作负载使用存储的方式:应用 Pod 无需加入 Multus 网络。客户端通过默认网络(经由 mon Service)访问监视器,而 Ceph CSI 驱动程序在每个节点上以主机网络模式运行,负责处理到 OSD 的数据路径。因此,真正的要求是存储节点能够路由到底层网络,而不是工作负载 Pod 已连接到该网络。请在部署前规划网络角色、NAD 和节点路由。

在创建集群时配置多网卡网络

向导的表单字段无法表达多网卡设置,但创建集群向导提供了 YAML 模式。建议的操作流程是:照常完成向导,让它自动填充清单;然后切换到 YAML 模式,仅编辑网络部分,并在 YAML 模式下提交。这样就无需手动编写整个清单。

YAML 模式中显示的清单取决于所使用的控制台(请参阅两个管理界面):新控制台显示 StorageCluster,旧版控制台显示 CephCluster。请在对应路径编辑网络块。

创建 Multus 网络

若要以接近主机的速度通过专用物理网卡传输存储流量,请使用 Kube-OVN Underlay 网络,而非 Overlay 网络。Underlay 会将专用物理网卡直接桥接到存储网络,不产生封装开销。

Underlay 要求预先准备物理网络:每个存储节点都需要专用网卡(不能承载 SSH 等其他流量),并且必须配置上游交换机端口/VLAN 和网关。然后创建一个桥接网络(ProviderNetwork)和一个 VLAN(Vlan),供存储子网接入。有关物理环境的前提条件以及如何创建桥接网络和 VLAN,请参阅准备 Kube-OVN Underlay 物理网络和配置子网。

对于要隔离的每个 Ceph 网络角色,请在 rook-ceph 命名空间中创建一个 NetworkAttachmentDefinition,并创建一个后端 Underlay 子网。以下示例创建公共网络;如果还要隔离复制流量,请使用不同的名称和不同的 CIDR/VLAN,为集群网络重复此操作。

创建 NetworkAttachmentDefinition。provider 字段必须使用 <name>.<namespace>.ovn 格式:

apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
  name: ceph-public-net
  namespace: rook-ceph
spec:
  config: |-
    {
      "cniVersion": "0.3.0",
      "type": "kube-ovn",
      "server_socket": "/run/openvswitch/kube-ovn-daemon.sock",
      "provider": "ceph-public-net.rook-ceph.ovn"
    }

创建提供该网络所需地址的 Underlay Kube-OVN 子网。将 vlan 设置为已准备好的 Vlan,使用与物理网络匹配的 cidrBlock/gateway,并使 provider 与 NetworkAttachmentDefinition 中的值一致:

apiVersion: kubeovn.io/v1
kind: Subnet
metadata:
  name: ceph-public-net
spec:
  protocol: IPv4
  cidrBlock: 192.168.10.0/24
  gateway: 192.168.10.1
  vlan: ceph-public-vlan
  provider: ceph-public-net.rook-ceph.ovn

应用这两个资源,然后确认 NetworkAttachmentDefinition 已存在:

kubectl get net-attach-def -n rook-ceph

后续步骤中设置的 selectors 会以 <namespace>/<name> 格式引用这些 NAD,例如 rook-ceph/ceph-public-net。

打开创建集群向导

按照创建标准存储服务中的说明,开始创建分布式存储集群。在创建集群步骤中,照常配置设备类别、存储设备和组件放置方式,让向导填充清单的其余部分。

切换到 YAML 模式

将向导从表单模式切换为 YAML 模式。清单已根据你的选择填充完毕。

编辑网络部分

在清单中添加或替换网络块。设置 provider: multus 和 selectors,将 Ceph 公共/集群角色映射到你的 NAD。

  • 新 Web 控制台 — 清单为 StorageCluster;编辑 spec.ceph.network:

    spec:
      ceph:
        network:
          provider: multus
          selectors:
            public: rook-ceph/ceph-public-net
            cluster: rook-ceph/ceph-cluster-net
  • 旧版 Web 控制台 — 清单为 CephCluster;编辑 spec.network(字段相同,但不包含 spec.ceph 封装):

    spec:
      network:
        provider: multus
        selectors:
          public: rook-ceph/ceph-public-net
          cluster: rook-ceph/ceph-cluster-net

如果只需要将客户端流量迁移到专用网络,请仅保留 public 选择器,并省略 cluster。

在与 selectors 同级的位置添加 addressRanges 块,明确指定 CIDR 范围。Rook 会尝试自动检测所接入网络的 CIDR,但在 Kube-OVN Underlay 网络上,此检测并不可靠,可能会失败,导致集群卡在“Configuring Ceph Mons”状态。指定 addressRanges 可避免此问题:

addressRanges:
  public:
    - 10.176.0.0/16
  cluster:
    - 10.176.0.0/16

使用已创建的 Underlay 子网的 CIDR(如果没有单独隔离集群网络,则只需 public)。

TIP

如果 StorageCluster 一直处于 Progressing 状态,且底层 CephCluster 报告 failed to discover network CIDRs for multus,请添加或更正 addressRanges。

在 YAML 模式下提交

保持在 YAML 模式下提交向导(点击创建集群)。提交前不要切回表单模式,否则网络字段可能无法保留。

WARNING

在新控制台中,请在此处的 StorageCluster 中配置网络,不要事后编辑 CephCluster。当集群由 StorageCluster 管理时,spec.network 是受管理的字段,对 CephCluster 的手动编辑会被 operator 还原。

验证

创建存储集群后,从 ACP 和 Ceph 两侧验证网络配置。

(新控制台)检查 StorageCluster 网络设置

如果集群由 StorageCluster 管理,请确认所需的配置。Ceph StorageCluster 在 rook-ceph 命名空间中始终命名为 ceph-cluster(两者均由准入机制强制执行):

kubectl get storagecluster ceph-cluster -n rook-ceph -o yaml

输出应包含预期的 provider 和选择器:

spec:
  ceph:
    network:
      provider: multus
      selectors:
        public: rook-ceph/ceph-public-net
        cluster: rook-ceph/ceph-cluster-net

检查生效的 CephCluster 网络设置

此检查适用于两个控制台,因为 CephCluster 是 Rook 实际操作的资源:

kubectl get cephcluster ceph-cluster -n rook-ceph -o jsonpath='{.spec.network}' | jq

provider 和 selectors 应与配置的内容一致。在新控制台中,它们还应与管理该资源的 StorageCluster 一致。

检查 Ceph Pod 是否已连接到网络

确认 Ceph 守护进程 Pod(例如 MON 和 OSD)带有 Multus 网络连接注解,并报告预期的接口:

kubectl get pod -n rook-ceph -l app=rook-ceph-osd \
  -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.metadata.annotations.k8s\.v1\.cni\.cncf\.io/networks}{"\n"}{end}'

每个 OSD Pod 都应引用 public 网络,以及(如果已配置)cluster 网络。

检查工作负载挂载

创建或重启一个同时挂载 CephFS PVC 和 RBD PVC 的测试工作负载,然后验证:

  • Pod 是否成功启动
  • 文件系统是否可读写
  • CSI 或工作负载日志中是否未出现与挂载相关的错误

故障排除建议

如果启用 Multus 后存储集群无法变为健康状态,请先检查以下项目:

  1. NAD 不存在 — 选择器引用的 NetworkAttachmentDefinition 在 rook-ceph 命名空间中缺失,或者 <namespace>/<nad-name> 引用拼写错误。
  2. 缺少选择器 — 已设置 provider: multus,但未定义 public 或 cluster 选择器。至少需要一个选择器。
  3. CIDR 检测失败 — Rook 无法自动检测网络范围。请显式指定 addressRanges。
  4. IP 耗尽 — 为 NAD 提供支持的 IPAM 池(例如配置的 CIDR 或地址范围)没有可供新 Ceph Pod 使用的空闲地址。
  5. 节点无法访问 Underlay — Ceph CSI driver 使用主机网络运行,因此每个节点(而不是工作负载 Pod)都必须能够通过 Underlay 网络路由到 OSD 地址。如果挂载卡住,请验证节点的 Kube-OVN Underlay 路由,并确认节点可以访问 OSD 地址。

如果集群无法恢复,请使用修正后的网络配置重新创建集群。由于运行中的集群无法切换网络模型,因此应通过重新创建存储集群来解决网络配置错误,而不是在原集群上直接修补。