Skip to content

进程启动与服务注册

CubeMaster 是 CubeSandbox 的控制面核心,负责沙箱调度、模板管理和节点管理。这篇文章从 main() 函数开始,拆解进程启动的每一步。


1. 启动全景图


2. coreInit:初始化全局组件

coreInit()CubeMaster/cmd/cubemaster/app/main.go 中定义,按顺序初始化 10 个子系统:

各子系统职责

子系统包路径职责
logpkg/base/log日志框架初始化,支持动态日志级别
errorcodepkg/errorcode错误码 → 是否可重试的映射表
taskpkg/task定时任务(清理过期沙箱等)
grpcconnpkg/cubelet/grpcconn到 Cubelet 的 gRPC 连接池
nodemetapkg/nodemeta节点元数据(IP、资源量等)
localcachepkg/localcache本地缓存(节点并发数等)
instancecachepkg/instancecache实例缓存(沙箱 → 节点映射)
templatecenterpkg/templatecenter模板中心客户端
schedulerpkg/scheduler调度器,注册选择器链
sandboxpkg/service/sandbox沙箱服务(创建、删除等)

降级模式

如果 OssDBConfigInstanceDBConfig 缺失,CubeMaster 进入降级模式:

go
if cfg.OssDBConfig == nil || cfg.InstanceDBConfig == nil {
    log.Warnf("run in degraded mode: skip localcache/instancecache/scheduler/sandbox init")
    return nil
}

降级模式下,调度器和沙箱服务不会初始化,CubeMaster 只能处理查询类请求。


3. server.New:创建 HTTP 服务

CubeMaster/pkg/server/server.goNew() 创建 HTTP 服务器:

超时配置

go
s := &internalHttp{
    Server: &http.Server{
        Addr:         fmt.Sprintf("0.0.0.0:%d", cfg.Common.HttpPort),
        ReadTimeout:  time.Second * time.Duration(cfg.Common.ReadTimeout),
        WriteTimeout: time.Second * time.Duration(cfg.Common.WriteTimeout),
        IdleTimeout:  time.Second * time.Duration(cfg.Common.IdleTimeout),
        Handler:      router,
    },
}

4. registerHandlers:路由注册

registerHandlers() 注册了 4 组路由:

路由组职责

路由组前缀调用方职责
notify/notifyCubeAPI / 内部节点变更通知、健康检查
cube/cubeCubeAPI沙箱 CRUD、模板管理
inner/inner内部调试节点查询、假创建、状态查询
meta/metaCubelet节点注册、状态上报、就绪检查

全局中间件

go
r.Use(middleware.MiddlewareLogging)

所有请求都经过日志中间件,记录请求方法、路径、耗时。


5. 信号处理与优雅退出

handleSignals

go
func handleSignals(ctx context.Context, signals chan os.Signal, serverC chan *server.Server, cancel context.CancelFunc) <-chan struct{} {
    done := make(chan struct{})
    go func() {
        defer close(done)
        select {
        case <-ctx.Done():
        case sig := <-signals:
            log.Errorf("received signal: %v", sig)
            cancel()
            graceFullStop()
        }
    }()
    return done
}

6. Debug 端点

CubeMaster 在启动后还会开启一个 debug HTTP 端点(默认 cfg.Common.Debug.Address):

go
m.Handle("/debug/vars", expvar.Handler())
m.Handle("/debug/pprof/", http.HandlerFunc(pprof.Index))
m.Handle("/debug/pprof/profile", http.HandlerFunc(pprof.Profile))
m.Handle("/debug/loglevel", http.HandlerFunc(setLogLevel))

可以通过 /debug/loglevel?level=DEBUG 动态调整日志级别。


7. 完整启动时序


延伸阅读