multus 的两种模式: daemon vs shim

35 阅读5分钟

image.png

image.png

image.png

一、文件整体功能总结

这份 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"
    }
  • 核心变化
    1. 名称从 multus-daemon-config 改为 multus-cni-config,更贴合“CNI 配置”的定位;
    2. 配置内容从“守护进程参数”改为“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)
  • 关键设计点
    1. 70-multus.conf 命名:Kubelet 加载 CNI 配置时按字母序,70- 确保 Multus 配置优先于其他 CNI 配置加载;
    2. --multus-conf-file=auto:自动检测并加载 /host/etc/cni/net.d 下的 Multus 配置;
    3. privileged: true:仍需特权模式,因为要修改主机网络配置;
    4. mountPropagation: Bidirectional:初始化容器安装的二进制文件能同步到主机。

三、核心差异总结(对比上一版)

维度上一版(thick 模式)本次(thin 模式)
部署模式全功能守护进程模式轻量 CNI 插件模式
核心配置守护进程参数(daemon-config)CNI 配置文件(指定 Flannel 为默认)
权限范围更宽泛(list/watch Pod)更精简(仅 get/update Pod)
挂载目录多(包含 hostroot/run/netns 等)少(仅 CNI 核心目录)
适用场景复杂多网络场景(需守护进程)基础多网络场景(依赖默认 CNI)

四、总结

这份 YAML 是轻量版 Multus 部署配置,核心特点如下:

  1. 模式轻量化:采用 thin 模式部署,移除厚模式的守护进程和冗余挂载,仅保留核心 CNI 插件功能;
  2. 默认网络明确:ConfigMap 中直接指定 Flannel 作为底层默认 CNI,无需额外配置;
  3. 配置优先级:将 Multus 配置文件命名为 70-multus.conf,确保 Kubelet 优先加载;
  4. 权限最小化:缩减 ClusterRole 权限,仅保留必要的 Pod 操作权限,符合安全最佳实践。

关键点回顾

  1. 本次配置是 Multus 的 thin 轻量模式,核心依赖 Flannel 作为默认网络,适合基础多网络场景;
  2. 70-multus.conf 的命名是关键设计,确保 Multus 配置优先加载;
  3. 相比 thick 模式,thin 模式更精简、资源占用更少,但功能也更基础(无守护进程的高级特性)。