Skip to content

沙箱在节点上的一生

当 CubeMaster 选中一个节点后,会通过 gRPC 调用 Cubelet 的 RunCubeSandbox 接口。这篇文章拆解沙箱从创建到销毁在节点上的完整生命周期。


1. 全景生命周期


2. 创建流程:RunCubeSandbox

2.1 入口:gRPC 服务

Cubelet 作为 containerd 的子服务运行,通过 gRPC 暴露 CubeboxMgr 接口:

2.2 local.Create() 的核心步骤

Cubelet/services/cubebox/cube_container_create.goCreate() 方法是创建沙箱的核心:

2.3 关键步骤详解

步骤 1:准备 rootfs

go
// cube_container_create.go
func (l *local) prepareRootfs(ctx context.Context, sandbox *Sandbox, container *Container) error {
    // 1. 从 storage 层获取快照
    // 2. 如果是模板快照,创建 overlay 可写层
    // 3. 挂载到指定路径
}

步骤 2:构建 OCI spec

go
specOpts := []oci.SpecCreator{
    oci.WithProcessArgs(cmd...),
    oci.WithEnv(envs),
    oci.WithCgroupDir(cgroupPath),
    oci.WithCapabilities(caps),
    // ...
}

步骤 3:创建 containerd 容器

go
container, err := client.NewContainer(ctx, containerID,
    containerd.WithSnapshot(snapshotID),
    containerd.WithNewSpec(specOpts...),
)

步骤 4:启动容器

go
task, err := container.NewTask(ctx, cio.NewCreator(cioOpts...))
err = task.Start(ctx)

3. 插件调用链:workflow engine

Cubelet 使用工作流引擎编排创建过程中的各个插件:

详见工作流引擎:Cubelet 如何编排插件


4. 沙箱状态管理

4.1 Sandbox 对象

go
// Cubelet/pkg/store/cubebox/
type CubeBox struct {
    ID           string
    Status       SandboxStatus
    Containers   map[string]*Container
    NetworkConfig *NetworkConfig
    CreateTime   time.Time
    Labels       map[string]string
    Annotations  map[string]string
}

4.2 状态转换


5. 销毁流程:DestroySandbox

Cubelet/services/cubebox/destroy.goDestroy() 方法负责清理沙箱:

销毁步骤

步骤代码位置说明
停止 taskdestroy.gotask.Kill() 发送 SIGKILL
删除 containerdestroy.gocontainer.Delete()
清理 rootfsstorage/删除 overlay 可写层
清理网络network/移除 TAP 设备
删除记录cubeboxManger.Delete()从本地存储删除
释放存储storage/归还快照到池中

6. 容器级操作

除了沙箱级的创建/销毁,Cubelet 还支持容器级操作:


7. 定时清理:dead container cleaner

Cubelet 有一个后台清理器,定期清理已销毁的沙箱:

go
// service.go
func (s *service) startCleaner() {
    ticker := time.NewTicker(cleanerHeartBeat)
    for range ticker.C {
        s.cleanDeadContainers()
    }
}

清理策略:

  • 超过 deadContainerTTL(默认 1 小时)的已销毁沙箱会被彻底清理
  • 清理包括:删除 rootfs、释放存储、清理元数据

8. 完整生命周期时序


延伸阅读