一、文件整体功能总结
这份 YAML 是 Multus CNI 的轻量版(thin)快速部署配置,相比上一版更聚焦于“自动配置 + 集成 Flannel 作为默认网络”,核心目标仍是在 Kubernetes 集群中部署 Multus,让 Pod 支持多网络接口,但采用了更轻量化的部署方式(thin 模式),并明确指定 Flannel 作为底层默认 CNI 插件。
二、分模块详细解析
这份配置包含 7 个核心资源,整体逻辑和上一版一致,但核心配置(ConfigMap、DaemonSet)有显著调整,逐模块解析如下:
1. CustomResourceDefinition (CRD) - 自定义资源定义
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: network-attachment-definitions.k8s.cni.cncf.io
# ... 省略部分内容
- 作用:和上一版完全一致,定义
NetworkAttachmentDefinition(简称net-attach-def)CRD,用于配置 Pod 的辅助网络。 - 关键不变点:
spec.config字段依然是存储 JSON 格式的 CNI 配置字符串,是 Multus 多网络的核心配置入口。
2. ClusterRole - 集群角色
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: multus
rules:
- apiGroups: ["k8s.cni.cncf.io"]
resources: ['*']
verbs: ['*']
- apiGroups: [""]
resources: [pods, pods/status]
verbs: [get, update] # 对比上一版:移除了 list、watch
- apiGroups: ["", "events.k8s.io"]
resources: [events]
verbs: [create, patch, update]
- 核心变化:相比上一版,对 Pod 资源的权限从
get/list/update/watch缩减为get/update,更贴合 thin 模式下 Multus 的轻量化定位(无需持续监听 Pod 列表,仅需按需获取/更新 Pod 状态)。 - 核心作用:保留对
NetworkAttachmentDefinition的全量操作权限,以及事件创建/更新权限,满足多网络配置的基础需求。
3. ClusterRoleBinding + ServiceAccount - 权限绑定
这两个资源和上一版完全一致:
- 创建
kube-system命名空间下的multus服务账户; - 将
multus集群角色绑定到该服务账户,确保 Multus 组件拥有上述权限。
4. ConfigMap - 核心配置(关键改动模块)
kind: ConfigMap
apiVersion: v1
metadata:
name: multus-cni-config # 上一版名称:multus-daemon-config
namespace: kube-system
data:
cni-conf.json: |
{
"name": "multus-cni-network",
"type": "multus",
"capabilities": { "portMappings": true },
"delegates": [ # 核心:指定默认底层 CNI 插件为 Flannel
{
"cniVersion": "0.3.1",
"name": "default-cni-network",
"plugins": [
{
"type": "flannel",
"name": "flannel.1",
"delegate": {
"isDefaultGateway": true, # Flannel 作为默认网关
"hairpinMode": true
}
},
{
"type": "portmap",
"capabilities": { "portMappings": true }
}
]
}
],
"kubeconfig": "/etc/cni/net.d/multus.d/multus.kubeconfig"
}
- 核心变化:
- 名称从
multus-daemon-config改为multus-cni-config,更贴合“CNI 配置”的定位; - 配置内容从“守护进程参数”改为“Multus 核心 CNI 配置”,明确指定底层默认网络为 Flannel;
- 名称从
- 关键字段解析:
type: multus:声明这是 Multus CNI 的配置文件;delegates:Multus 的“委托插件”配置,即 Multus 会将默认网络的处理委托给 Flannel:type: flannel:指定底层默认 CNI 为 Flannel;isDefaultGateway: true:Flannel 网络作为 Pod 的默认网关;hairpinMode: true:启用发夹模式,允许 Pod 访问自身的 Service;
portmap插件:支持 Pod 端口映射(如hostPort功能);kubeconfig:Multus 访问 Kubernetes API Server 的配置文件路径。
5. DaemonSet - 守护进程集(核心部署模块,关键改动)
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: kube-multus-ds
namespace: kube-system
spec:
template:
spec:
hostNetwork: true
tolerations: [ ... ]
serviceAccountName: multus
initContainers: # 初始化容器:安装 thin 模式二进制
- name: install-multus-binary
image: ghcr.io/k8snetworkplumbingwg/multus-cni:snapshot
command: ["/install_multus"]
args: ["--type", "thin"] # 上一版:-t thick
volumeMounts:
- name: cnibin
mountPath: /host/opt/cni/bin
mountPropagation: Bidirectional
containers: # 主容器:运行 thin 模式 Multus
- name: kube-multus
image: ghcr.io/k8snetworkplumbingwg/multus-cni:snapshot
command: ["/thin_entrypoint"] # 上一版:/usr/src/multus-cni/bin/multus-daemon
args:
- "--multus-conf-file=auto" # 自动加载配置
- "--multus-autoconfig-dir=/host/etc/cni/net.d"
- "--cni-conf-dir=/host/etc/cni/net.d"
securityContext: { privileged: true }
volumeMounts:
- name: cni
mountPath: /host/etc/cni/net.d
- name: cnibin
mountPath: /host/opt/cni/bin
- name: multus-cfg # 挂载 ConfigMap 中的 CNI 配置
mountPath: /tmp/multus-conf
volumes:
- name: multus-cfg # 关联上面的 ConfigMap
configMap:
name: multus-cni-config
items:
- key: cni-conf.json
path: 70-multus.conf # 配置文件命名为 70-multus.conf(确保优先加载)
- 核心变化(thin 模式 vs 上一版 thick 模式):
对比项 上一版(thick) 本次(thin) 镜像启动命令 multus-daemon(守护进程)thin_entrypoint(轻量入口)安装类型 --type thick--type thin配置方式 守护进程配置(daemon-config) CNI 配置文件(cni-conf.json) 挂载项 多目录挂载(hostroot/run/netns等) 仅核心目录(cni/cnibin/config) - 关键设计点:
70-multus.conf命名:Kubelet 加载 CNI 配置时按字母序,70-确保 Multus 配置优先于其他 CNI 配置加载;--multus-conf-file=auto:自动检测并加载/host/etc/cni/net.d下的 Multus 配置;privileged: true:仍需特权模式,因为要修改主机网络配置;mountPropagation: Bidirectional:初始化容器安装的二进制文件能同步到主机。
三、核心差异总结(对比上一版)
| 维度 | 上一版(thick 模式) | 本次(thin 模式) |
|---|---|---|
| 部署模式 | 全功能守护进程模式 | 轻量 CNI 插件模式 |
| 核心配置 | 守护进程参数(daemon-config) | CNI 配置文件(指定 Flannel 为默认) |
| 权限范围 | 更宽泛(list/watch Pod) | 更精简(仅 get/update Pod) |
| 挂载目录 | 多(包含 hostroot/run/netns 等) | 少(仅 CNI 核心目录) |
| 适用场景 | 复杂多网络场景(需守护进程) | 基础多网络场景(依赖默认 CNI) |
四、总结
这份 YAML 是轻量版 Multus 部署配置,核心特点如下:
- 模式轻量化:采用 thin 模式部署,移除厚模式的守护进程和冗余挂载,仅保留核心 CNI 插件功能;
- 默认网络明确:ConfigMap 中直接指定 Flannel 作为底层默认 CNI,无需额外配置;
- 配置优先级:将 Multus 配置文件命名为
70-multus.conf,确保 Kubelet 优先加载; - 权限最小化:缩减 ClusterRole 权限,仅保留必要的 Pod 操作权限,符合安全最佳实践。
关键点回顾
- 本次配置是 Multus 的 thin 轻量模式,核心依赖 Flannel 作为默认网络,适合基础多网络场景;
70-multus.conf的命名是关键设计,确保 Multus 配置优先加载;- 相比 thick 模式,thin 模式更精简、资源占用更少,但功能也更基础(无守护进程的高级特性)。