一般来说,pod 落到 node 上时,kubectl 会调用(一个默认) cni,但如果有多个 cni ,也只能用一个。
如果想用多个,就要引入 multus 代理(但是依然只有一个默认 CNI),可以通过 NAD 的方式使用其他的 CNI。
总结: 代理并没有解决 kubectl 默认最多只能使用一个 CNI 的问题,但是确实可以使用其他 CNI 了。
但是不同的 CNI 本身都是符合 CNI 的统一设计, 但必须要分一个默认和其他出来。
也很尴尬
multus 使用 默认 CNI 的逻辑
func findMasterPlugin(cniConfigDirPath string, remainingTries int) (string, error) {
if remainingTries == 0 {
return "", fmt.Errorf("could not find a plugin configuration in %s", cniConfigDirPath)
}
var cniPluginConfigs []string
files, err := os.ReadDir(cniConfigDirPath)
if err != nil {
return "", fmt.Errorf("error when listing the CNI plugin configurations: %w", err)
}
for _, file := range files {
if strings.HasPrefix(file.Name(), "00-multus") {
continue
}
fileExtension := filepath.Ext(file.Name())
if fileExtension == ".conf" || fileExtension == ".conflist" {
cniPluginConfigs = append(cniPluginConfigs, file.Name())
}
}
if len(cniPluginConfigs) == 0 {
time.Sleep(time.Second)
return findMasterPlugin(cniConfigDirPath, remainingTries-1)
}
sort.Strings(cniPluginConfigs)
return cniPluginConfigs[0], nil # 按照 linux 文件顺序使用第一个作为默认
}
kubectl 那里的逻辑也大致类似,默认 cni 的问题只是又转移到 multus (代理)了
问题总结
- kubectl 默认 cni 只有一个,不管是否使用 multus
- 如果集群中的 pod 只有一张网卡,如果要使用多个 cni,其实可以不用 multus,不同的节点下发不同的 cni 即可
- 如果 pod 需要多张网卡,目前只能使用 multus
- 只要 pod 使用多张网卡,就要接受 “默认网卡和其他网卡的使用方式是不同的”