Skip to content

Multus CNI — 設定參考

本文提供 Multus CNI 所有設定參數的完整說明,所有內容皆引用真實原始碼路徑。

原始碼位置

設定型別定義位於 pkg/types/types.gopkg/types/conf.gopkg/server/types.go

相關章節

CNI 設定(NetConf)

NetConfpkg/types/types.go)是 Multus 的主設定結構,以 JSON 格式寫入 CNI 設定目錄(/etc/cni/net.d/)。

完整設定範例

json
{
  "name": "multus-cni-network",
  "type": "multus",
  "cniVersion": "0.3.1",
  "confDir": "/etc/cni/multus/net.d",
  "cniDir": "/var/lib/cni/multus",
  "binDir": "/opt/cni/bin",
  "kubeconfig": "/etc/cni/net.d/multus.d/multus.kubeconfig",
  "logFile": "/var/log/multus.log",
  "logLevel": "verbose",
  "logToStderr": false,
  "readinessindicatorfile": "/run/flannel/subnet.env",
  "namespaceIsolation": false,
  "globalNamespaces": "kube-system,default",
  "systemNamespaces": ["kube-system"],
  "multusNamespace": "kube-system",
  "retryDeleteOnError": false,
  "clusterNetwork": "flannel-conf",
  "defaultNetworks": []
}

NetConf 欄位說明

路徑設定

欄位JSON 鍵預設值說明
ConfDirconfDir/etc/cni/multus/net.dCNI 設定檔目錄(從這裡讀取 .conf/.conflist
CNIDircniDir/var/lib/cni/multusScratch 快取目錄(儲存 ADD 時的委派設定)
BinDirbinDir/opt/cni/bin委派 CNI Binary 搜尋目錄
Kubeconfigkubeconfig""kubeconfig 路徑(用於 Thin Plugin 向 API Server 認證)

日誌設定

欄位JSON 鍵預設值說明
LogFilelogFile""日誌輸出檔案路徑(空白表示不輸出至檔案)
LogLevellogLevel"panic"日誌等級:panicerrorverbosedebug
LogToStderrlogToStderrfalse是否同時輸出日誌至標準錯誤輸出
LogOptionslogOptionsnull進階日誌選項(lumberjack 日誌輪替設定)

網路來源設定

欄位JSON 鍵說明
RawDelegatesdelegates直接在設定中嵌入委派 CNI 設定的 JSON 陣列(與 clusterNetwork 互斥)
ClusterNetworkclusterNetwork預設網路的 NAD 名稱或 CNI 設定檔名(從 CRD、目錄或檔案讀取)
DefaultNetworksdefaultNetworks所有 Pod 都會自動附加的網路清單(NAD 名稱陣列)

互斥設定

delegatesclusterNetwork+defaultNetworks 不能同時設定。

  • 使用 delegates 時,直接在設定中指定委派設定,不查詢 Kubernetes API
  • 使用 clusterNetwork 時,從 Kubernetes CRD 或設定目錄讀取

命名空間設定

欄位JSON 鍵預設值說明
NamespaceIsolationnamespaceIsolationfalse啟用命名空間隔離,限制 Pod 只能使用相同命名空間的 NAD
RawNonIsolatedNamespacesglobalNamespaces""逗號分隔的命名空間清單,這些命名空間的 NAD 可被任意 Pod 引用
SystemNamespacessystemNamespaces["kube-system"]系統命名空間清單,這些命名空間的 Pod 不套用 defaultNetworks
MultusNamespacemultusNamespace"kube-system"Multus 自身使用的命名空間(用於讀取 clusterNetwork/defaultNetworks

其他設定

欄位JSON 鍵預設值說明
ReadinessIndicatorFilereadinessindicatorfile""就緒指示檔路徑,Multus 等待此檔案存在後才處理 CNI 請求
RetryDeleteOnErrorretryDeleteOnErrorfalse委派 DEL 失敗時,是否繼續嘗試下一個委派外掛
AuxiliaryCNIChainNameauxiliaryCNIChainName""輔助 CNI 鏈名稱
RuntimeConfigruntimeConfignullCNI RuntimeConfig(PortMaps、Bandwidth、IPs 等)

RuntimeConfig

RuntimeConfigpkg/types/types.go)在 CNI ADD 時提供執行期額外設定:

欄位JSON 鍵說明
PortMapsportMappings連接埠對映設定陣列
Bandwidthbandwidth頻寬限制設定(入/出向速率與突發值)
IPsips要求的 IP 位址清單
Macmac要求的 MAC 位址
InfinibandGUIDinfinibandGUID要求的 InfiniBand GUID
DeviceIDdeviceIDSR-IOV 裝置 ID
CNIDeviceInfoFileCNIDeviceInfoFileCNI 裝置資訊檔案路徑(用於傳遞裝置詳細資訊)

PortMapEntry

欄位JSON 鍵說明
HostPorthostPort宿主機連接埠(1-65535)
ContainerPortcontainerPort容器連接埠(1-65535)
Protocolprotocol協定:tcpudp(預設 tcp
HostIPhostIP宿主機繫結 IP(可選)

BandwidthEntry

欄位JSON 鍵說明
IngressRateingressRate入向速率限制(bps)
IngressBurstingressBurst入向突發大小(bytes)
EgressRateegressRate出向速率限制(bps)
EgressBurstegressBurst出向突發大小(bytes)

委派設定(DelegateNetConf)

DelegateNetConfpkg/types/types.go)代表單一委派網路的設定,由 Multus 從 NAD 轉換而來:

欄位JSON 鍵說明
IfnameRequestifnameRequest要求的介面名稱(覆蓋自動產生的 net{N} 名稱)
MacRequestmacRequest要求的 MAC 位址
InfinibandGUIDRequestinfinibandGUIDRequest要求的 InfiniBand GUID
IPRequestipRequest要求的 IP 位址清單
GatewayRequestdefault-route預設路由閘道 IP 清單
DeviceIDdeviceIDSR-IOV 裝置 ID(來自 kubelet checkpoint)
ResourceNameresourceNameSR-IOV 資源名稱
MasterPlugin內部是否為主要(預設)網路外掛
ConfListPlugin內部是否為 conflist 格式(多外掛鏈)

Pod 網路選擇(NetworkSelectionElement)

NetworkSelectionElementpkg/types/types.go)代表 Pod Annotation 中的單一網路附加描述符,符合 Kubernetes Network CRD De-facto Standard。

JSON 格式完整範例

json
[
  {
    "name": "sriov-net",
    "namespace": "kube-system",
    "interface": "net1",
    "ips": ["10.56.217.171/24", "2001:db8::1/64"],
    "mac": "20:04:0f:f1:88:01",
    "infiniband-guid": "c2:b0:57:49:47:f1:a0:26",
    "portMappings": [
      {"hostPort": 8080, "containerPort": 80, "protocol": "tcp"}
    ],
    "bandwidth": {
      "ingressRate": 1000000,
      "ingressBurst": 1000000,
      "egressRate": 1000000,
      "egressBurst": 1000000
    },
    "deviceID": "0000:00:1f.6",
    "cni-args": {"foo": "bar"},
    "default-route": ["10.56.217.1"]
  }
]

NetworkSelectionElement 欄位說明

欄位JSON 鍵必填說明
NamenameNetworkAttachmentDefinition 名稱
NamespacenamespaceNAD 所在命名空間(預設為 Pod 的命名空間)
IPRequestips要求的 IP 位址清單(傳遞給委派外掛的 IPAM)
MacRequestmac要求的 MAC 位址
InfinibandGUIDRequestinfiniband-guid要求的 InfiniBand GUID
InterfaceRequestinterface要求的介面名稱(覆蓋自動的 net{N}
PortMappingsRequestportMappings連接埠對映設定
BandwidthRequestbandwidth頻寬限制設定
DeviceIDdeviceIDSR-IOV 裝置 ID
CNIArgscni-args傳遞給委派外掛的額外 CNI 參數
GatewayRequestdefault-routePod 的預設閘道 IP 清單

Daemon 設定(ControllerNetConf)

ControllerNetConfpkg/server/types.go)是 Thick Plugin 的 multus-daemon 設定結構,預設讀取自 /etc/cni/net.d/multus.d/daemon-config.json

完整設定範例

json
{
  "chrootDir": "/hostroot",
  "logFile": "/var/log/multus-daemon.log",
  "logLevel": "verbose",
  "logToStderr": true,
  "socketDir": "/run/multus",
  "metricsPort": 9091,
  "perNodeCertificate": {
    "enabled": true,
    "bootstrapKubeconfig": "/etc/kubernetes/bootstrap.kubeconfig",
    "certDir": "/var/lib/multus/certs",
    "certDuration": "24h"
  }
}

ControllerNetConf 欄位說明

欄位JSON 鍵預設值說明
ChrootDirchrootDir""Chroot 目錄路徑,呼叫委派 CNI Binary 前先 chroot 至此目錄
LogFilelogFile""日誌輸出檔案路徑
LogLevellogLevel"panic"日誌等級:panicerrorverbosedebug
LogToStderrlogToStderrfalse是否輸出日誌至 stderr
SocketDirsocketDir"/run/multus/"Unix Socket 目錄路徑(multus.sock 建立於此)
MetricsPortmetricsPortnullPrometheus 指標 HTTP 伺服器埠號(未設定則不啟動)
PerNodeCertificateperNodeCertificatenull每節點 TLS 憑證設定

PerNodeCertificate 欄位說明

欄位JSON 鍵說明
Enabledenabled是否啟用每節點 TLS 憑證自動管理
BootstrapKubeconfigbootstrapKubeconfig用於首次憑證申請的 Bootstrap kubeconfig 路徑
CertDircertDir憑證儲存目錄路徑
CertDurationcertDuration憑證有效期限(預設 "10m",格式為 Go duration string)

K8sArgs — CNI_ARGS 解析

K8sArgspkg/types/types.go)定義從 CNI_ARGS 環境變數解析出的 Kubernetes 特有資訊:

欄位CNI_ARGS 鍵說明
K8S_POD_NAMEK8S_POD_NAMEPod 名稱
K8S_POD_NAMESPACEK8S_POD_NAMESPACEPod 命名空間
K8S_POD_INFRA_CONTAINER_IDK8S_POD_INFRA_CONTAINER_IDPause 容器 ID
K8S_POD_UIDK8S_POD_UIDPod UID

設定自動生成模式

當 Thick Plugin 使用 multus-config-file: auto 選項啟動時,config.Managerpkg/server/config/)根據以下規則自動產生 Multus CNI 設定:

Multus 設定自動生成流程

自動生成的設定確保 Multus 的 CNI 設定(以 00- 前綴)優先於其他 CNI 設定,從而成為叢集的主 CNI 外掛。

基於 Apache 2.0 授權