diff --git a/client/client.go b/client/client.go index 714c57c25..036e6e5ac 100644 --- a/client/client.go +++ b/client/client.go @@ -720,7 +720,6 @@ func (c *Client) SandboxStore() sandbox.Store { // SandboxController returns the underlying sandbox controller client func (c *Client) SandboxController(name string) sandbox.Controller { - // default sandboxer is shim if c.sandboxers != nil { return c.sandboxers[name] } diff --git a/client/services.go b/client/services.go index 3ca357eb3..03da25246 100644 --- a/client/services.go +++ b/client/services.go @@ -218,9 +218,6 @@ func WithInMemoryServices(ic *plugin.InitContext) Opt { srv.SnapshotsService: func(s interface{}) ServicesOpt { return WithSnapshotters(s.(map[string]snapshots.Snapshotter)) }, - srv.SandboxControllersService: func(s interface{}) ServicesOpt { - return WithSandboxers(s.(map[string]sandbox.Controller)) - }, srv.ContainersService: func(s interface{}) ServicesOpt { return WithContainerClient(s.(containersapi.ContainersClient)) }, @@ -251,3 +248,16 @@ func WithInMemoryServices(ic *plugin.InitContext) Opt { return nil } } + +func WithSandboxersService(ic *plugin.InitContext) ClientOpt { + return func(c *clientOpts) error { + sandboxesPlugin, err := ic.GetByID(plugins.SandboxesServicePlugin, srv.SandboxControllersService) + if err != nil { + return err + } + + sbs := sandboxesPlugin.(map[string]sandbox.Controller) + c.services.sandboxers = sbs + return nil + } +} diff --git a/pkg/cri/cri.go b/pkg/cri/cri.go index e85547e68..8544230fb 100644 --- a/pkg/cri/cri.go +++ b/pkg/cri/cri.go @@ -92,6 +92,7 @@ func initCRIService(ic *plugin.InitContext) (interface{}, error) { containerd.WithDefaultNamespace(constants.K8sContainerdNamespace), containerd.WithDefaultPlatform(platforms.Default()), containerd.WithInMemoryServices(ic), + containerd.WithSandboxersService(ic), ) if err != nil { return nil, fmt.Errorf("failed to create containerd client: %w", err) diff --git a/pkg/cri/server/podsandbox/controller.go b/pkg/cri/server/podsandbox/controller.go index 45b3faf7d..ff3de7a0f 100644 --- a/pkg/cri/server/podsandbox/controller.go +++ b/pkg/cri/server/podsandbox/controller.go @@ -29,6 +29,7 @@ import ( "github.com/containerd/containerd/v2/errdefs" "github.com/containerd/containerd/v2/oci" criconfig "github.com/containerd/containerd/v2/pkg/cri/config" + "github.com/containerd/containerd/v2/pkg/cri/constants" imagestore "github.com/containerd/containerd/v2/pkg/cri/store/image" sandboxstore "github.com/containerd/containerd/v2/pkg/cri/store/sandbox" ctrdutil "github.com/containerd/containerd/v2/pkg/cri/util" @@ -43,13 +44,25 @@ import ( func init() { registry.Register(&plugin.Registration{ - Type: plugins.SandboxControllerPlugin, - ID: "podsandbox", - Requires: []plugin.Type{}, + Type: plugins.SandboxControllerPlugin, + ID: "podsandbox", + Requires: []plugin.Type{ + plugins.EventPlugin, + plugins.ServicePlugin, + }, InitFn: func(ic *plugin.InitContext) (interface{}, error) { - // register the global controller to containerd plugin manager, - // the global controller will be initialized when cri plugin is initializing - return &Controller{}, nil + c := Controller{} + client, err := containerd.New( + "", + containerd.WithDefaultNamespace(constants.K8sContainerdNamespace), + containerd.WithDefaultPlatform(platforms.Default()), + containerd.WithInMemoryServices(ic), + ) + if err != nil { + return nil, fmt.Errorf("unable to load CRI service base dependencies: %w", err) + } + c.client = client + return &c, nil }, }) } @@ -90,7 +103,6 @@ type Controller struct { func (c *Controller) Init( config criconfig.Config, - client *containerd.Client, sandboxStore *sandboxstore.Store, os osinterface.OS, cri CRIService, @@ -98,7 +110,6 @@ func (c *Controller) Init( baseOCISpecs map[string]*oci.Spec, ) { c.cri = cri - c.client = client c.config = config c.sandboxStore = sandboxStore c.os = os diff --git a/pkg/cri/server/service.go b/pkg/cri/server/service.go index 070c81be4..10c8a3882 100644 --- a/pkg/cri/server/service.go +++ b/pkg/cri/server/service.go @@ -218,7 +218,7 @@ func NewCRIService(config criconfig.Config, client *containerd.Client, nri *nri. } // Initialize pod sandbox controller - sbControllers[string(criconfig.ModePodSandbox)].(*podsandbox.Controller).Init(config, client, c.sandboxStore, c.os, c, c.imageService, c.baseOCISpecs) + sbControllers[string(criconfig.ModePodSandbox)].(*podsandbox.Controller).Init(config, c.sandboxStore, c.os, c, c.imageService, c.baseOCISpecs) c.nri = nri diff --git a/plugins/types.go b/plugins/types.go index 1ac4a2737..eea2095bc 100644 --- a/plugins/types.go +++ b/plugins/types.go @@ -67,6 +67,8 @@ const ( ImageVerifierPlugin plugin.Type = "io.containerd.image-verifier.v1" // WarningPlugin implements a warning service WarningPlugin plugin.Type = "io.containerd.warning.v1" + // SandboxesServicePlugin implements sandboxes service + SandboxesServicePlugin plugin.Type = "io.containerd.service.sandboxes.v1" ) const ( diff --git a/services/sandbox/controller_service.go b/services/sandbox/controller_service.go index dd8cc352e..8ef2736e7 100644 --- a/services/sandbox/controller_service.go +++ b/services/sandbox/controller_service.go @@ -42,11 +42,11 @@ func init() { Type: plugins.GRPCPlugin, ID: "sandbox-controllers", Requires: []plugin.Type{ - plugins.ServicePlugin, + plugins.SandboxesServicePlugin, plugins.EventPlugin, }, InitFn: func(ic *plugin.InitContext) (interface{}, error) { - i, err := ic.GetByID(plugins.ServicePlugin, services.SandboxControllersService) + i, err := ic.GetByID(plugins.SandboxesServicePlugin, services.SandboxControllersService) if err != nil { return nil, err } diff --git a/services/sandbox/sandboxers.go b/services/sandbox/sandboxers.go index 85db67018..df09a800a 100644 --- a/services/sandbox/sandboxers.go +++ b/services/sandbox/sandboxers.go @@ -26,7 +26,7 @@ import ( func init() { registry.Register(&plugin.Registration{ - Type: plugins.ServicePlugin, + Type: plugins.SandboxesServicePlugin, ID: services.SandboxControllersService, Requires: []plugin.Type{ plugins.SandboxControllerPlugin,