sandbox: podsandbox init its own client

To break the cyclic dependency of cri plugin and podsandbox plugin,
we define a new plugin type of SandboxesServicePlugin and when cri init
it's own client, it will add the all the controllers by get them from
the SandboxesServicePlugin.
when podsandbox controller init it's client, it will not Require the
SandboxesServicePlugin.

Signed-off-by: Abel Feng <fshb1988@gmail.com>
This commit is contained in:
Abel Feng 2023-10-19 21:06:18 +08:00
parent 7deb68fbf4
commit 0cf48bab2c
8 changed files with 39 additions and 16 deletions

View File

@ -720,7 +720,6 @@ func (c *Client) SandboxStore() sandbox.Store {
// SandboxController returns the underlying sandbox controller client // SandboxController returns the underlying sandbox controller client
func (c *Client) SandboxController(name string) sandbox.Controller { func (c *Client) SandboxController(name string) sandbox.Controller {
// default sandboxer is shim
if c.sandboxers != nil { if c.sandboxers != nil {
return c.sandboxers[name] return c.sandboxers[name]
} }

View File

@ -218,9 +218,6 @@ func WithInMemoryServices(ic *plugin.InitContext) Opt {
srv.SnapshotsService: func(s interface{}) ServicesOpt { srv.SnapshotsService: func(s interface{}) ServicesOpt {
return WithSnapshotters(s.(map[string]snapshots.Snapshotter)) 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 { srv.ContainersService: func(s interface{}) ServicesOpt {
return WithContainerClient(s.(containersapi.ContainersClient)) return WithContainerClient(s.(containersapi.ContainersClient))
}, },
@ -251,3 +248,16 @@ func WithInMemoryServices(ic *plugin.InitContext) Opt {
return nil 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
}
}

View File

@ -92,6 +92,7 @@ func initCRIService(ic *plugin.InitContext) (interface{}, error) {
containerd.WithDefaultNamespace(constants.K8sContainerdNamespace), containerd.WithDefaultNamespace(constants.K8sContainerdNamespace),
containerd.WithDefaultPlatform(platforms.Default()), containerd.WithDefaultPlatform(platforms.Default()),
containerd.WithInMemoryServices(ic), containerd.WithInMemoryServices(ic),
containerd.WithSandboxersService(ic),
) )
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to create containerd client: %w", err) return nil, fmt.Errorf("failed to create containerd client: %w", err)

View File

@ -29,6 +29,7 @@ import (
"github.com/containerd/containerd/v2/errdefs" "github.com/containerd/containerd/v2/errdefs"
"github.com/containerd/containerd/v2/oci" "github.com/containerd/containerd/v2/oci"
criconfig "github.com/containerd/containerd/v2/pkg/cri/config" 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" imagestore "github.com/containerd/containerd/v2/pkg/cri/store/image"
sandboxstore "github.com/containerd/containerd/v2/pkg/cri/store/sandbox" sandboxstore "github.com/containerd/containerd/v2/pkg/cri/store/sandbox"
ctrdutil "github.com/containerd/containerd/v2/pkg/cri/util" ctrdutil "github.com/containerd/containerd/v2/pkg/cri/util"
@ -43,13 +44,25 @@ import (
func init() { func init() {
registry.Register(&plugin.Registration{ registry.Register(&plugin.Registration{
Type: plugins.SandboxControllerPlugin, Type: plugins.SandboxControllerPlugin,
ID: "podsandbox", ID: "podsandbox",
Requires: []plugin.Type{}, Requires: []plugin.Type{
plugins.EventPlugin,
plugins.ServicePlugin,
},
InitFn: func(ic *plugin.InitContext) (interface{}, error) { InitFn: func(ic *plugin.InitContext) (interface{}, error) {
// register the global controller to containerd plugin manager, c := Controller{}
// the global controller will be initialized when cri plugin is initializing client, err := containerd.New(
return &Controller{}, nil "",
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( func (c *Controller) Init(
config criconfig.Config, config criconfig.Config,
client *containerd.Client,
sandboxStore *sandboxstore.Store, sandboxStore *sandboxstore.Store,
os osinterface.OS, os osinterface.OS,
cri CRIService, cri CRIService,
@ -98,7 +110,6 @@ func (c *Controller) Init(
baseOCISpecs map[string]*oci.Spec, baseOCISpecs map[string]*oci.Spec,
) { ) {
c.cri = cri c.cri = cri
c.client = client
c.config = config c.config = config
c.sandboxStore = sandboxStore c.sandboxStore = sandboxStore
c.os = os c.os = os

View File

@ -218,7 +218,7 @@ func NewCRIService(config criconfig.Config, client *containerd.Client, nri *nri.
} }
// Initialize pod sandbox controller // 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 c.nri = nri

View File

@ -67,6 +67,8 @@ const (
ImageVerifierPlugin plugin.Type = "io.containerd.image-verifier.v1" ImageVerifierPlugin plugin.Type = "io.containerd.image-verifier.v1"
// WarningPlugin implements a warning service // WarningPlugin implements a warning service
WarningPlugin plugin.Type = "io.containerd.warning.v1" WarningPlugin plugin.Type = "io.containerd.warning.v1"
// SandboxesServicePlugin implements sandboxes service
SandboxesServicePlugin plugin.Type = "io.containerd.service.sandboxes.v1"
) )
const ( const (

View File

@ -42,11 +42,11 @@ func init() {
Type: plugins.GRPCPlugin, Type: plugins.GRPCPlugin,
ID: "sandbox-controllers", ID: "sandbox-controllers",
Requires: []plugin.Type{ Requires: []plugin.Type{
plugins.ServicePlugin, plugins.SandboxesServicePlugin,
plugins.EventPlugin, plugins.EventPlugin,
}, },
InitFn: func(ic *plugin.InitContext) (interface{}, error) { 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 { if err != nil {
return nil, err return nil, err
} }

View File

@ -26,7 +26,7 @@ import (
func init() { func init() {
registry.Register(&plugin.Registration{ registry.Register(&plugin.Registration{
Type: plugins.ServicePlugin, Type: plugins.SandboxesServicePlugin,
ID: services.SandboxControllersService, ID: services.SandboxControllersService,
Requires: []plugin.Type{ Requires: []plugin.Type{
plugins.SandboxControllerPlugin, plugins.SandboxControllerPlugin,