Multus 和 SR-IOV

使用Multus

Multus CNI 是一个 CNI 插件,能够将多个网络接口附加到 Pod 上。Multus 并不替代 CNI 插件,而是作为 CNI 插件的多路复用器。在某些使用场景中,Multus 非常有用,特别是当 Pod 网络密集并需要额外的网络接口以支持数据平面加速技术(如 SR-IOV)时。

Multus 不能单独部署。它始终需要至少一个满足 Kubernetes 集群网络要求的传统 CNI 插件。该 CNI 插件成为 Multus 的默认插件,并将用于为所有 Pod 提供主要接口。

要启用 Multus,请在 multus 配置文件的键中将 cni 指定为第一个列表项,后面跟上您希望与 Multus 一起使用的插件名称(如果您将提供自己的默认插件,则为 none)。请注意,Multus 必须始终位于列表的第一位。例如,要将 Multus 与 Canal 一起用作主要 CNI 插件:

# /etc/rancher/rke2/config.yaml
cni:
- multus
- canal

有关 Multus 的更多信息,请参阅 multus-cni 文档。

将 Multus 与 Cilium 一起使用

版本门控

从 2025 年 11 月的版本开始,不需要禁用 exclusive 标志:v1.31.14+rke2r1、v1.32.10+rke2r1、v1.33.6+rke2r1 和 v1.34.2+rke2r1。

要将 Cilium 与 Multus 一起使用,需要禁用 exclusive 配置。 您可以使用以下 HelmChartConfig 来实现:

# /var/lib/rancher/rke2/server/manifests/rke2-cilium-config.yaml
---
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
  name: rke2-cilium
  namespace: kube-system
spec:
  valuesContent: |-
    cni:
      exclusive: false

将 Multus 与 containernetworking 插件一起使用

任何 CNI 插件都可以作为 Multus 的次要 CNI 插件,用于提供附加的网络接口到 Pod。然而,最常用的次要 CNI 插件是由 Kubernetes ContainerNetworking 团队维护的 CNI 插件(如 bridge、host-device、macvlan 等)。Kubernetes ContainerNetworking 团队的插件在安装 Multus 时会自动部署。有关这些插件的更多信息,请参阅 ContainerNetworking Plugins 文档。

要使用这些插件中的任何一个,需要创建一个适当的 NetworkAttachmentDefinition 对象,以定义次要网络的配置。然后通过 Pod 注释引用该定义,Multus 将使用它为该 Pod 提供额外的接口。使用`macvlan` CNI插件与Multus的示例可在 multus-cni仓库中找到。

Multus IPAM插件选项

  • host-local

  • Multus DHCP守护程序

  • Whereabouts

host-local IPAM插件从一组地址范围中分配IP地址。它将状态存储在主机文件系统上,因此确保单个主机上的IP地址唯一性。因此,我们不建议在多节点集群中使用它。此IPAM插件不需要额外的部署。有关更多信息: https://www.cni.dev/plugins/current/ipam/host-local/.

Multus 提供了一个可选的守护程序集,用于部署运行 DHCP IPAM 插件 所需的 DHCP 守护程序。您可以使用以下HelmChartConfig来实现:

# /var/lib/rancher/rke2/server/manifests/rke2-multus-config.yaml
---
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
  name: rke2-multus
  namespace: kube-system
spec:
  valuesContent: |-
    manifests:
      dhcpDaemonSet: true

这将配置 Multus 的 chart 以部署 DHCP 守护程序集。此功能从2024-01版本开始可用(v1.29.1+rke2r1,v1.28.6+rke2r1,v1.27.10+rke2r1,v1.26.13+rke2r1)。

您应该在启动RKE2之前编写此文件。

Whereabouts是一个IP地址管理(IPAM)CNI插件,负责在整个集群中分配IP地址。RKE2包括使用Whereabouts与Multus管理通过Multus创建的附加接口的IP地址的选项。为此,您需要使用HelmChartConfig来配置Multus CNI以使用Whereabouts。

您可以使用以下 HelmChartConfig 来实现:

# /var/lib/rancher/rke2/server/manifests/rke2-multus-config.yaml
---
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
  name: rke2-multus
  namespace: kube-system
spec:
  valuesContent: |-
    rke2-whereabouts:
      enabled: true

这将配置Multus的图表以将`rke2-whereabouts`作为依赖项。

您应该在启动RKE2之前编写此文件。

启用Multus动态网络控制器

使用Multus "厚插件"的一个用例是部署 动态网络控制器。通过以下HelmChartConfig完成此操作:

# /var/lib/rancher/rke2/server/manifests/rke2-multus-config.yaml
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
  name: rke2-multus
  namespace: kube-system
spec:
  valuesContent: |-
    thickPlugin:
      enabled: true
    dynamicNetworksController:
      enabled: true

动态网络控制器只能在"厚插件"模式下与Multus一起部署。

使用Multus与SR-IOV

使用SR-IOV CNI与Multus可以帮助数据平面加速用例,为Pod提供一个额外的接口,能够实现非常高的吞吐量。SR-IOV并不适用于所有环境,并且有几个要求必须满足,以将节点视为SR-IOV兼容:

  • 物理NIC必须支持SR-IOV(例如,通过检查 /sys/class/net/$NIC/device/sriov_totalvfs)

  • 主机操作系统必须激活IOMMU虚拟化

  • 主机操作系统包含能够执行 SR-IOV 的驱动程序(例如 i40e、vfio-pci 等)

SR-IOV CNI 插件不能作为 Multus 的默认 CNI 插件使用;它必须与 Multus 和传统 CNI 插件一起部署。SR-IOV CNI helm 图表可以在 rancher-charts Helm 仓库中找到。有关更多信息,请参见 Rancher Helm Charts 文档

安装 SR-IOV CNI 图表后,将部署 SR-IOV 操作员。然后,用户必须通过使用 feature.node.kubernetes.io/network-sriov.capable=true 对集群中的节点进行标记,以指定哪些节点支持 SR-IOV:

kubectl label node $NODE-NAME feature.node.kubernetes.io/network-sriov.capable=true

一旦标记,sriov-network-config Daemonset 将在节点上部署一个 pod,以收集有关网络接口的信息。该信息可以通过 sriovnetworknodestates 自定义资源定义获得。在部署后几分钟内,每个节点将有一个 sriovnetworknodestates 资源,资源名称为节点的名称。

来自 rancher-charts 的 SR-IOV CNI 图表现在包括 node-feature-discovery 图表作为自动依赖项。该图表部署一个小的 Daemonset,自动根据检测到的节点能力标记每个节点。这适用于硬件和软件功能。特别是,当 node-feature-discovery 检测到兼容节点时,可以自动添加标签 feature.node.kubernetes.io/network-sriov.capable=true。有关更多信息,请参见 NFD 文档

然而,最新版本的 SR-IOV 操作员 还包括受支持硬件的白名单,因此 SR-IOV 实际上只会在 该列表上的 NIC 可用。如果您想使用不在列表上的 NIC 的 SR-IOV CNI,您需要自己更新 supported-nic-ids configMap。

有关如何使用 SR-IOV 操作员 的更多信息,请参阅 SR-IOV 操作员