containerd 源码分析:创建 container(三)

文接 containerd 源码分析:创建 container(二) 启动 task 上节介绍了创建 task,task 创建之后将返回 response 给 ctr。接着,ctr 调用 task.Start 启动容器。 1// containerd/client/task.go 2func (t *task) Start(ctx context.Context) error { 3 r, err := t.client.TaskService().Start(ctx, &tasks.StartRequest{ 4 ContainerID: t.id, 5 }) 6 if err != nil { 7 ... 8 } 9 t.pid = r.Pid 10 return nil 11} 12 13// containerd/api/services/tasks/v1/tasks_grpc.pb.go 14func (c *tasksClient) Start(ctx context.Context, in *StartRequest, opts ...grpc.CallOption) (*StartResponse, error) { 15 out := new(StartResponse) 16 err := c.cc.Invoke(ctx, "/containerd.services.tasks.v1.Tasks/Start", in, out, opts...) 17 if err != nil { 18 return nil, err 19 } 20 return out, nil 21} ctr 调用 contaienrd 的 /containerd.services.tasks.v1.Tasks/Start 接口创建 task。进入 containerd 查看提供该服务的插件: ...

2024-06-04 · xhy

containerd 源码分析:创建 container(二)

文接 containerd 源码分析:创建 container(一) 创建容器进程 创建 container 成功后,接着创建 task, task 将根据 container metadata 创建容器进程。 创建 task 进入 tasks.Newtask 创建 task: 1// containerd/cmd/ctr/commands/tasks/tasks_unix.go 2func NewTask(ctx gocontext.Context, client *containerd.Client, container containerd.Container, checkpoint string, con console.Console, nullIO bool, logURI string, ioOpts []cio.Opt, opts ...containerd.NewTaskOpts) (containerd.Task, error) { 3 ... 4 t, err := container.NewTask(ctx, ioCreator, opts...) 5 if err != nil { 6 return nil, err 7 } 8 ... 9} 10 11// containerd/client/container.go 12func (c *container) NewTask(ctx context.Context, ioCreate cio.Creator, opts ...NewTaskOpts) (_ Task, err error) { 13 ... 14 t := &task{ 15 client: c.client, 16 io: i, 17 id: c.id, 18 c: c, 19 } 20 ... 21 response, err := c.client.TaskService().Create(ctx, request) 22 if err != nil { 23 return nil, errdefs.FromGRPC(err) 24 } 25 t.pid = response.Pid 26 return t, nil 27} 类似创建 container,这里调用 container.client.TaskService().Create 创建 task: ...

2024-06-04 · xhy

containerd 源码分析:创建 container(一)

前言 Kubernetes:kubelet 源码分析之 pod 创建流程 介绍了 kubelet 创建 pod 的流程,containerd 源码分析:kubelet 和 containerd 交互 介绍了 kubelet 通过 cri 接口和 containerd 交互的过程,containerd 源码分析:启动注册流程 介绍了 containerd 作为高级容器运行时的启动流程。通过这三篇文章熟悉了 kubelet 和 containerd 的行为,对于 containerd 如何通过 OCI 接口创建容器 container 并没有涉及。 ...

2024-06-04 · xhy

containerd 源码分析:kubelet 和 containerd 交互

前言 Kubernetes:kubelet 源码分析之创建 pod 流程 介绍了 kubelet 创建 pod 的流程,其中介绍了 kubelet 调用 runtime cri 接口创建 pod。containerd 源码分析:启动注册流程 介绍了 containerd 作为一种行业标准的高级运行时的启动注册流程。那么,kubelet 是怎么和 containerd 交互的呢? 本文会带着这个问题分析 kubelet 和 containerd 的交互。 ...

2024-05-22 · xhy

containerd 源码分析:启动注册流程

前言 containerd 是一个行业标准的容器运行时,其强调简单性、健壮性和可移植性。本文将从 containerd 的代码结构入手,查看 containerd 的启动注册流程。 启动注册流程 containerd 首先以调试模式运行 containerd: 1// containerd/cmd/containerd/main.go 2package main 3 4import ( 5 ... 6 _ "github.com/containerd/containerd/v2/cmd/containerd/builtins" 7) 8 9... 10func main() { 11 app := command.App() 12 if err := app.Run(os.Args); err != nil { 13 fmt.Fprintf(os.Stderr, "containerd: %s\n", err) 14 os.Exit(1) 15 } 16} 在启动 containerd 时,导入匿名包 github.com/containerd/containerd/v2/cmd/containerd/builtins 注册插件。 ...

2024-05-21 · xhy