diff --git a/pkg/opts/task.go b/pkg/opts/task.go new file mode 100644 index 000000000..f2753b559 --- /dev/null +++ b/pkg/opts/task.go @@ -0,0 +1,22 @@ +package opts + +import ( + "context" + + "github.com/containerd/containerd" + "github.com/containerd/containerd/linux/runcopts" +) + +// WithContainerdShimCgroup returns function that sets the containerd +// shim cgroup path +func WithContainerdShimCgroup(path string) containerd.NewTaskOpts { + return func(_ context.Context, _ *containerd.Client, r *containerd.TaskInfo) error { + r.Options = &runcopts.CreateOptions{ + ShimCgroup: path, + } + return nil + } +} + +//TODO: Since Options is an interface different WithXXX will be needed to set different +// combinations of CreateOptions. diff --git a/pkg/server/container_start.go b/pkg/server/container_start.go index e2fb5b871..82e527d3a 100644 --- a/pkg/server/container_start.go +++ b/pkg/server/container_start.go @@ -26,6 +26,7 @@ import ( "golang.org/x/net/context" "k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime" + customopts "github.com/kubernetes-incubator/cri-containerd/pkg/opts" cio "github.com/kubernetes-incubator/cri-containerd/pkg/server/io" containerstore "github.com/kubernetes-incubator/cri-containerd/pkg/store/container" ) @@ -127,7 +128,12 @@ func (c *criContainerdService) startContainer(ctx context.Context, return cntr.IO, nil } - task, err := container.NewTask(ctx, ioCreation) + var taskOpts []containerd.NewTaskOpts + cgroup := sandbox.Config.GetLinux().GetCgroupParent() + if cgroup != "" { + taskOpts = append(taskOpts, customopts.WithContainerdShimCgroup(cgroup)) + } + task, err := container.NewTask(ctx, ioCreation, taskOpts...) if err != nil { return fmt.Errorf("failed to create containerd task: %v", err) } diff --git a/pkg/server/sandbox_run.go b/pkg/server/sandbox_run.go index 9dc853d2e..ee72e1680 100644 --- a/pkg/server/sandbox_run.go +++ b/pkg/server/sandbox_run.go @@ -33,6 +33,7 @@ import ( "golang.org/x/sys/unix" "k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime" + customopts "github.com/kubernetes-incubator/cri-containerd/pkg/opts" sandboxstore "github.com/kubernetes-incubator/cri-containerd/pkg/store/sandbox" "github.com/kubernetes-incubator/cri-containerd/pkg/util" ) @@ -198,8 +199,12 @@ func (c *criContainerdService) RunPodSandbox(ctx context.Context, r *runtime.Run // Create sandbox task in containerd. glog.V(5).Infof("Create sandbox container (id=%q, name=%q).", id, name) + var taskOpts []containerd.NewTaskOpts + if cgroup := sandbox.Config.GetLinux().GetCgroupParent(); cgroup != "" { + taskOpts = append(taskOpts, customopts.WithContainerdShimCgroup(cgroup)) + } // We don't need stdio for sandbox container. - task, err := container.NewTask(ctx, containerd.NullIO) + task, err := container.NewTask(ctx, containerd.NullIO, taskOpts...) if err != nil { return nil, fmt.Errorf("failed to create task for sandbox %q: %v", id, err) }