本文档采用自动化机器翻译技术翻译。 尽管我们力求提供准确的译文,但不对翻译内容的完整性、准确性或可靠性作出任何保证。 若出现任何内容不一致情况,请以原始 英文 版本为准,且原始英文版本为权威文本。

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。

版本门控

K3s 从 2024 年 10 月的版本开始使用固定的 CNI 二进制路径:v1.28.15+k3s1,v1.29.10+k3s1,v1.30.6+k3s1,v1.31.2+k3s1。

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 时路径都会改变。

如果要在较旧版本的 K3s 上部署 Multus,您应使用 /var/lib/rancher/k3s/data/current/bin/ 作为 CNI 路径,但要预期每次 K3s 升级时都需要重新部署插件。

使用 IPAM 插件进行部署

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

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

  • host-local

  • Whereabouts

  • Multus DHCP守护程序

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
          # Comment the following line when using rke2-multus < v4.2.202
          multusAutoconfigDir: /var/lib/rancher/k3s/agent/etc/cni/net.d

Whereabouts是一个IP地址管理(IPAM)CNI插件,负责在整个集群中分配IP地址。

要使用Whereabouts IPAM插件,请使用以下配置部署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
          # Comment the following line when using rke2-multus < v4.2.202
          multusAutoconfigDir: /var/lib/rancher/k3s/agent/etc/cni/net.d
    rke2-whereabouts:
      fullnameOverride: whereabouts
      enabled: true
      cniConf:
        confDir: /var/lib/rancher/k3s/agent/etc/cni/net.d
        binDir: /var/lib/rancher/k3s/data/cni/

在K3s上使用whereabouts时,configuration_path`必须在NetworkAttachmentDefinition的`ipam`配置中设置为/var/lib/rancher/k3s/agent/etc/cni/net.d/whereabouts.d/whereabouts.conf`。

例如,当使用whereabouts作为IPAM与macvlan插件时:

apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
  name: macvlan-whereabouts
spec:
  config: |-
    {
      "cniVersion": "1.0.0",
      "type": "macvlan",
      "master": "eth0",
      "mode": "bridge",
      "ipam": {
        "type": "whereabouts",
        "range": "172.17.0.0/24",
        "gateway": "172.17.0.1",
        "configuration_path": "/var/lib/rancher/k3s/agent/etc/cni/net.d/whereabouts.d/whereabouts.conf"
      }
    }

当网络上已经有一个DHCP服务器运行时,可以部署DHCP IPAM插件。此 DaemonSet 负责定期续订 DHCP 租约。有关更多信息,请查看https://www.cni.dev/plugins/current/ipam/dhcp/[DHCP IPAM插件]的官方文档。

要使用DHCP插件,请使用以下配置部署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
          # Comment the following line when using rke2-multus < v4.2.202
          multusAutoconfigDir: /var/lib/rancher/k3s/agent/etc/cni/net.d
    manifests:
      dhcpDaemonSet: true

使用Multus

一旦部署了 Multus,您可以创建 NetworkAttachmentDefinition 资源,并在 Pod 规格中引用这些资源以附加额外的接口。 例如,使用上面的 Whereabouts 示例,您可以在 Pod 上使用 k8s.v1.cni.cncf.io/networks 注释创建一个 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"

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