跳至主要内容

Multus 和 IPAM 插件

Multus CNI 是一种 CNI 插件,可以为 Pod 附加多个网络接口。Multus 不会替换 CNI 插件,而是充当 CNI 插件多路复用器。Multus 在某些用例中很有用,尤其是在 Pod 网络密集型且需要支持数据平面加速技术的额外网络接口(例如 SR-IOV)时。

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

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

版本限制

截至 2024 年 10 月发布的版本(v1.28.15+k3s1、v1.29.10+k3s1、v1.30.6+k3s1、v1.31.2+k3s1),K3s 使用固定的 CNI 二进制文件路径。

K3s 在 $DATA_DIR/data/cni 中查找 CNI 插件二进制文件。默认情况下,此路径为 /var/lib/rancher/k3s/data/cni。其他 CNI 插件应安装到此位置。

在 2024 年 10 月发布的版本之前,CNI 二进制文件是 K3s 用户空间捆绑包的一部分,位于 $DATA_DIR/data/$HASH/bin 中,其中哈希值对于每个 K3s 版本都是唯一的。这使得部署其他 CNI 插件变得困难,因为路径在每次升级 K3s 时都会发生变化。如果要将 Multus 部署到较旧版本的 K3s,则应使用 /var/lib/rancher/k3s/data/current/bin/ 作为 CNI bin 目录,但请注意,每次升级 K3s 时都需要重新部署插件。

使用 IPAM 插件部署

需要一个 IP 地址管理器 (IPAM) 插件来为 Multus 创建的额外接口分配 IP 地址。可以安装一个或多个 IPAM;下面的示例分别展示了单个 IPAM 插件的使用,但可以根据需要将它们组合起来。

下面的 helm 部署示例将部署一个 DaemonSet 来创建 Multus Pod,以将所需的 CNI 二进制文件安装到 /var/lib/rancher/k3s/data/cni/ 中,并将 Multus CNI 配置安装到 /var/lib/rancher/k3s/agent/etc/cni/net.d 中。

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

要使用 host-local 插件,请使用以下配置部署 Multus

apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
name: multus
namespace: kube-system
spec:
repo: https://rke2-charts.rancher.io
chart: rke2-multus
targetNamespace: kube-system
valuesContent: |-
config:
fullnameOverride: multus
cni_conf:
confDir: /var/lib/rancher/k3s/agent/etc/cni/net.d
binDir: /var/lib/rancher/k3s/data/cni/
kubeconfig: /var/lib/rancher/k3s/agent/etc/cni/net.d/multus.d/multus.kubeconfig

使用 Multus

部署 Multus 后,您可以创建 NetworkAttachmentDefinition 资源,并在 Pod 规范中引用这些资源以附加其他接口。例如,使用上面的 whereabouts 示例,您可以使用 k8s.v1.cni.cncf.io/networks 注解在 Pod 上创建 eth1 接口

apiVersion: apps/v1
kind: Deployment
metadata:
name: multus-demo
labels:
app: multus-demo
spec:
replicas: 1
selector:
matchLabels:
app: multus-demo
template:
metadata:
annotations:
k8s.v1.cni.cncf.io/networks: macvlan-whereabouts@eth1
labels:
app: multus-demo
spec:
containers:
- name: shell
image: docker.io/rancher/mirrored-library-busybox:1.36.1
imagePullPolicy: IfNotPresent
command:
- sleep
- "3600"

有关其他信息和示例,请参阅上游文档。