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
- 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
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
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 时,必须在 NetworkAttachmentDefinition 的 ipam
配置中将 configuration_path
设置为 /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 租约。有关更多信息,请查看 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
manifests:
dhcpDaemonSet: true
使用 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"
有关其他信息和示例,请参阅上游文档。