容器发布的分组调度实现

背景

分组发布,分组发完会暂停

Etcd 关键路径

cmdKey /cronsun/cmd/NODEID/JOBID:

原始发布信息

groupKey /cronsun/containergroup/NODEID/JOBID/GROUPSTRING

分组的调度,GROUPSTRING 命名格式:包含 GROUPID-IDC-NUM,数据是状态

stageKey /cronsun/containerdeploy/NODEID/JOBID/HOSTNAME:

整体发布和每台机器的调度,/cronsun/containerdeploy/NODEID/JOBID 保存整体任务状态,HOSTNAME 保存每个容器状态

logKey /cronsun/containerlog/NODEID/JOBID/HOSTNAME

记录日志

过程

1、监听 cmdKey;

2、从 cmdKey 获取发布信息,修改 stageKey 整体发布和 groupKey 的一个分组设置成 Running,开始发布;

3、监听 groupKey,(通过内部 channel 传递)获取 Running 的分组,写入分组机器 Running 状态到 stageKey(有机房间并发和机房内并发控制);

4、客户端监听 stageKey,获取本机 Running 状态,开始执行。

5、客户端执行完成,上报 stageKey;

6、监听 stageKey,分组是否执行成功;

7、如果执行成功,设置 stageKey 整体发布为 Pause;

8、等待 continue 的指令;

9、通过修改 stageKey 和 groupKey 实现继续的指令(stageKey 整体发布和 groupKey 的一个分组设置成 Running);

10、回到 3。

核心逻辑描述

/cronsun/containerdeploy/NODEID/JOBID 和 /cronsun/containercmd/NODEID/JOBID/GROUPSTRING 被设置成 Running 状态后,调用 K8S 分布分组,当分组容器被发布完成后,回调 API,写入 /cronsun/containerdeploy/NODEID/JOBID/HOSTNAME,调度器判断成功的数量是否等于分组的数量,如果是,则设置暂停,如果不是,则标记失败。

发布一个分组的逻辑:
创建一个新的 Deployment,命名格式:ServiceName-timestamp,并获取当前以 ServiceName 开头的 Deployment:[ServiceName-t1、ServiceName-t2],ServiceName-timestamp 每发布一个分组,就从 [ServiceName-t1、ServiceName-t2] 减去这个分组的数量,最终删除 [ServiceName-t1、ServiceName-t2]。