kubelet cni 调用

1 阅读1分钟

image.png

一般来说,pod 落到 node 上时,kubectl 会调用(一个默认) cni,但如果有多个 cni ,也只能用一个。

如果想用多个,就要引入 multus 代理(但是依然只有一个默认 CNI),可以通过 NAD 的方式使用其他的 CNI。

image.png

总结: 代理并没有解决 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 (代理)了

问题总结

  1. kubectl 默认 cni 只有一个,不管是否使用 multus
  2. 如果集群中的 pod 只有一张网卡,如果要使用多个 cni,其实可以不用 multus,不同的节点下发不同的 cni 即可
  3. 如果 pod 需要多张网卡,目前只能使用 multus
  4. 只要 pod 使用多张网卡,就要接受 “默认网卡和其他网卡的使用方式是不同的”