From f6232793b49730435aa7fbc689c717efd35e0b28 Mon Sep 17 00:00:00 2001 From: Fei Su Date: Tue, 8 Nov 2022 14:23:59 +0800 Subject: [PATCH] can set up the network serially by CNI plugins Signed-off-by: Fei Su --- pkg/cri/config/config.go | 3 +++ pkg/cri/config/config_unix.go | 9 +++++---- pkg/cri/config/config_windows.go | 9 +++++---- pkg/cri/server/sandbox_run.go | 8 +++++++- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/pkg/cri/config/config.go b/pkg/cri/config/config.go index 8860559c1..ccb925f3e 100644 --- a/pkg/cri/config/config.go +++ b/pkg/cri/config/config.go @@ -143,6 +143,9 @@ type CniConfig struct { // be loaded from the cni config directory by go-cni. Set the value to 0 to // load all config files (no arbitrary limit). The legacy default value is 1. NetworkPluginMaxConfNum int `toml:"max_conf_num" json:"maxConfNum"` + // NetworkPluginSetupSerially is a boolean flag to specify whether containerd sets up networks serially + // if there are multiple CNI plugin config files existing and NetworkPluginMaxConfNum is larger than 1. + NetworkPluginSetupSerially bool `toml:"setup_serially" json:"setupSerially"` // NetworkPluginConfTemplate is the file path of golang template used to generate // cni config. // When it is set, containerd will get cidr(s) from kubelet to replace {{.PodCIDR}}, diff --git a/pkg/cri/config/config_unix.go b/pkg/cri/config/config_unix.go index c664143bf..dad45de2c 100644 --- a/pkg/cri/config/config_unix.go +++ b/pkg/cri/config/config_unix.go @@ -66,10 +66,11 @@ func DefaultConfig() PluginConfig { tree, _ := toml.Load(defaultRuncV2Opts) return PluginConfig{ CniConfig: CniConfig{ - NetworkPluginBinDir: "/opt/cni/bin", - NetworkPluginConfDir: "/etc/cni/net.d", - NetworkPluginMaxConfNum: 1, // only one CNI plugin config file will be loaded - NetworkPluginConfTemplate: "", + NetworkPluginBinDir: "/opt/cni/bin", + NetworkPluginConfDir: "/etc/cni/net.d", + NetworkPluginMaxConfNum: 1, // only one CNI plugin config file will be loaded + NetworkPluginSetupSerially: false, + NetworkPluginConfTemplate: "", }, ContainerdConfig: ContainerdConfig{ Snapshotter: containerd.DefaultSnapshotter, diff --git a/pkg/cri/config/config_windows.go b/pkg/cri/config/config_windows.go index 4e47af510..55db40328 100644 --- a/pkg/cri/config/config_windows.go +++ b/pkg/cri/config/config_windows.go @@ -29,10 +29,11 @@ import ( func DefaultConfig() PluginConfig { return PluginConfig{ CniConfig: CniConfig{ - NetworkPluginBinDir: filepath.Join(os.Getenv("ProgramFiles"), "containerd", "cni", "bin"), - NetworkPluginConfDir: filepath.Join(os.Getenv("ProgramFiles"), "containerd", "cni", "conf"), - NetworkPluginMaxConfNum: 1, - NetworkPluginConfTemplate: "", + NetworkPluginBinDir: filepath.Join(os.Getenv("ProgramFiles"), "containerd", "cni", "bin"), + NetworkPluginConfDir: filepath.Join(os.Getenv("ProgramFiles"), "containerd", "cni", "conf"), + NetworkPluginMaxConfNum: 1, + NetworkPluginSetupSerially: false, + NetworkPluginConfTemplate: "", }, ContainerdConfig: ContainerdConfig{ Snapshotter: containerd.DefaultSnapshotter, diff --git a/pkg/cri/server/sandbox_run.go b/pkg/cri/server/sandbox_run.go index f2f4408f3..9543c034e 100644 --- a/pkg/cri/server/sandbox_run.go +++ b/pkg/cri/server/sandbox_run.go @@ -425,6 +425,8 @@ func (c *criService) setupPodNetwork(ctx context.Context, sandbox *sandboxstore. config = sandbox.Config path = sandbox.NetNSPath netPlugin = c.getNetworkPlugin(sandbox.RuntimeHandler) + err error + result *cni.Result ) if netPlugin == nil { return errors.New("cni config not initialized") @@ -435,7 +437,11 @@ func (c *criService) setupPodNetwork(ctx context.Context, sandbox *sandboxstore. return fmt.Errorf("get cni namespace options: %w", err) } log.G(ctx).WithField("podsandboxid", id).Debugf("begin cni setup") - result, err := netPlugin.Setup(ctx, id, path, opts...) + if c.config.CniConfig.NetworkPluginSetupSerially { + result, err = netPlugin.SetupSerially(ctx, id, path, opts...) + } else { + result, err = netPlugin.Setup(ctx, id, path, opts...) + } if err != nil { return err }