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 月的版本开始,不需要禁用 |
要将 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 资源,资源名称为节点的名称。
|
来自 |
然而,最新版本的 SR-IOV 操作员 还包括受支持硬件的白名单,因此 SR-IOV 实际上只会在 该列表上的 NIC 可用。如果您想使用不在列表上的 NIC 的 SR-IOV CNI,您需要自己更新 supported-nic-ids configMap。
有关如何使用 SR-IOV 操作员 的更多信息,请参阅 SR-IOV 操作员。