1. RKE2集群与Multus CNI基础认知
第一次在RKE2集群里看到"unable to update cni config: no networks found in /etc/cni/net.d"报错时,我就意识到传统单网络接口的局限性。Rancher的RKE2作为新一代Kubernetes发行版,默认使用Canal(Flannel+Calico)作为CNI插件,但生产环境往往需要Pod多网卡支持——比如同时接入业务网络和存储专网,这正是Multus CNI的用武之地。
Multus本质是个CNI元插件,允许单个Pod挂载多个网络接口。其工作原理可以类比为网络交换机:主CNI(如Calico)处理默认的eth0接口,Multus则像交换机扩展槽一样,为Pod添加eth1、eth2等额外接口。这些接口可以分别对接不同的底层网络:
- 业务网(Calico/BGP)
- 存储专网(Macvlan/IPvlan)
- 硬件加速网(SR-IOV)
- 甚至不同安全域的隔离网络
关键认知:Multus不直接提供网络功能,而是作为"调度器"协调多个CNI插件工作。这就像装修时水电工和木工需要协调,Multus就是那个确保各工种不冲突的项目经理。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 前置环境准备与依赖检查
在RKE2集群(v1.21+)上部署Multus前,需要确认以下基础条件:
2.1 集群网络现状诊断
bash复制# 检查当前CNI配置
ls -l /var/lib/rancher/rke2/agent/etc/cni/net.d/
# 确认默认插件(通常为10-calico.conflist)
cat /var/lib/rancher/rke2/agent/etc/cni/net.d/10-calico.conflist
# 查看节点网络接口
ip link show
# 特别注意物理网卡名称(如ens192、eth0等)
2.2 内核参数与模块检查
Multus依赖的基础内核功能:
bash复制# 必须开启的网络相关内核参数
sysctl -a | grep -E 'bridge|ip_forward'
# 预期输出:
# net.bridge.bridge-nf-call-iptables = 1
# net.ipv4.ip_forward = 1
# 加载内核模块(若使用Macvlan/IPvlan)
modprobe macvlan
modprobe ipvlan
lsmod | grep -E 'macvlan|ipvlan'
2.3 节点资源预留
由于Multus会部署为DaemonSet,建议在节点资源预留中增加:
yaml复制# /etc/rancher/rke2/config.yaml
kubelet-arg:
- "system-reserved=cpu=500m,memory=512Mi"
- "kube-reserved=cpu=500m,memory=1Gi"
3. Multus CNI的安装与核心配置
3.1 通过Helm部署Multus
bash复制helm repo add k8snetworkplumbingwg https://k8snetworkplumbingwg.github.io/multus-cni
helm install multus k8snetworkplumbingwg/multus \
--namespace kube-system \
--set multus.config.cniConfDir=/var/lib/rancher/rke2/agent/etc/cni/net.d \
--set multus.config.cniBinDir=/var/lib/rancher/rke2/data/current/bin
3.2 关键配置解析
生成的Multus配置文件(/var/lib/rancher/rke2/agent/etc/cni/net.d/00-multus.conf)包含以下核心参数:
json复制{
"name": "multus-cni",
"cniVersion": "0.3.1",
"type": "multus",
"confDir": "/etc/cni/net.d",
"binDir": "/opt/cni/bin",
"readinessindicatorfile": "/var/run/multus/cni-ready",
"delegates": [
{
"name": "default-network",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "calico",
"log_level": "info",
"datastore_type": "kubernetes",
"mtu": 1440,
"ipam": { "type": "host-local" }
}
]
}
]
}
3.3 网络附件定义(NetworkAttachmentDefinition)
创建Macvlan网络的示例:
yaml复制apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
name: macvlan-conf
namespace: kube-system
spec:
config: '{
"cniVersion": "0.3.1",
"name": "macvlan-conf",
"type": "macvlan",
"master": "ens192",
"mode": "bridge",
"ipam": {
"type": "host-local",
"subnet": "192.168.50.0/24",
"rangeStart": "192.168.50.100",
"rangeEnd": "192.168.50.200",
"gateway": "192.168.50.1"
}
}'
4. 多网络Pod实战与排错指南
4.1 多网卡Pod定义示例
yaml复制apiVersion: v1
kind: Pod
metadata:
name: multi-net-pod
annotations:
k8s.v1.cni.cncf.io/networks: macvlan-conf
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
4.2 网络状态验证
bash复制# 进入Pod查看网络接口
kubectl exec -it multi-net-pod -- ip a
# 预期看到:
# 1: lo
# 2: eth0 (主网络,Calico分配)
# 3: net1 (Macvlan附加网络)
# 检查网络注解
kubectl get pod multi-net-pod -o jsonpath='{.metadata.annotations}'
4.3 常见故障排查
问题1:Pod卡在ContainerCreating状态
bash复制kubectl describe pod multi-net-pod
# 查看Events中是否有:
# "Multus: [Err] error in invoke Conflist add - checkMultus: failed to load netconf..."
# 解决方案:
# 1. 确认Multus配置文件权限
chmod 600 /var/lib/rancher/rke2/agent/etc/cni/net.d/00-multus.conf
# 2. 检查CNI二进制文件是否存在
ls /var/lib/rancher/rke2/data/current/bin/multus
问题2:附加网络无法连通
bash复制# 在Pod内测试附加网络连通性
kubectl exec -it multi-net-pod -- ping -c 3 192.168.50.1
# 可能原因:
# - 主机网卡未开启混杂模式
ip link set ens192 promisc on
# - 防火墙规则阻止
iptables -L | grep DROP
5. 生产环境优化实践
5.1 网络隔离策略
通过NetworkPolicy限制多网络Pod的通信:
yaml复制apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: multus-isolation
spec:
podSelector:
matchLabels:
app: critical-db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 5432
egress:
- to:
- ipBlock:
cidr: 192.168.50.0/24
5.2 性能调优建议
-
Macvlan模式选择:
bridge:适合同主机Pod间通信passthru:需要直通物理网卡性能时使用
-
SR-IOV优化:
yaml复制apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
name: sriov-conf
spec:
config: '{
"type": "sriov",
"vf": 0,
"ipam": {
"type": "host-local",
"subnet": "10.56.217.0/24"
}
}'
5.3 监控方案
通过Prometheus采集Multus指标:
yaml复制# Multus DaemonSet添加注解
metadata:
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "8080"
在RKE2集群中成功整合Multus后,我们实现了数据库Pod同时接入业务网络(eth0)和存储专网(net1),存储网络吞吐量提升300%。关键教训是:一定要在非生产环境测试不同CNI插件的组合兼容性,我们曾因Calico版本问题导致整个集群网络瘫痪。建议每次变更前执行kubectl describe network-attachment-definition确认配置有效性。
