进程启动与服务注册
CubeMaster 是 CubeSandbox 的控制面核心,负责沙箱调度、模板管理和节点管理。这篇文章从 main() 函数开始,拆解进程启动的每一步。
1. 启动全景图
2. coreInit:初始化全局组件
coreInit() 在 CubeMaster/cmd/cubemaster/app/main.go 中定义,按顺序初始化 10 个子系统:
各子系统职责
| 子系统 | 包路径 | 职责 |
|---|---|---|
log | pkg/base/log | 日志框架初始化,支持动态日志级别 |
errorcode | pkg/errorcode | 错误码 → 是否可重试的映射表 |
task | pkg/task | 定时任务(清理过期沙箱等) |
grpcconn | pkg/cubelet/grpcconn | 到 Cubelet 的 gRPC 连接池 |
nodemeta | pkg/nodemeta | 节点元数据(IP、资源量等) |
localcache | pkg/localcache | 本地缓存(节点并发数等) |
instancecache | pkg/instancecache | 实例缓存(沙箱 → 节点映射) |
templatecenter | pkg/templatecenter | 模板中心客户端 |
scheduler | pkg/scheduler | 调度器,注册选择器链 |
sandbox | pkg/service/sandbox | 沙箱服务(创建、删除等) |
降级模式
如果 OssDBConfig 或 InstanceDBConfig 缺失,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.go 的 New() 创建 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 | /notify | CubeAPI / 内部 | 节点变更通知、健康检查 |
| cube | /cube | CubeAPI | 沙箱 CRUD、模板管理 |
| inner | /inner | 内部调试 | 节点查询、假创建、状态查询 |
| meta | /meta | Cubelet | 节点注册、状态上报、就绪检查 |
全局中间件
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. 完整启动时序
延伸阅读
- 创建沙箱时 CubeMaster 做了哪些事 — 创建沙箱的完整流程
- 调度器如何选择节点 — 5 阶段选择器链