方舟环境容器调度

方舟环境容器调度

主要功能

  • 恢复宿主机死机或者断网后上面需要调度的所有容器
  • 恢复非正常的容器状态到正常
  • 调度的容器能够支持vlan网络和Host模式
  • 调度容器本身通过Leader-Follower的模式保证高可用性
  • 调度容器支持cron定时任务(精确到秒级)
  • 查询哪个节点是Leader
  • 停止或者打开调度(方便容器维护、正常启停)

通过 ark-schedule 镜像启动调度

必须在swarm manager节点上以 docker 容器的方式来启动,下面的 -e 参数对应后面的 export 参数和作用注释

1
docker run -d --restart=always --name=ark-schedule -e ACS_CLUSTER_SECURITY_GROUP=false -e ACS_CLUSTER_SCHEME=tcp -e ACS_CLUSTER_ENDPOINT=11.239.155.112:3376 -e ACS_NETWORK_NAME=vlan701 -e ACS_CRONTAB="7 * * * * *" -e ACS_PORT=3375 -e ACS_ADVERTISE=11.239.155.112:3375 -e ACS_NETWORK_STORE_CLUSTER=zk://11.239.155.112:2181,11.239.155.103:2181,11.239.155.97:2181/Cluster -e affinity:container==swarm-manager --net=host reg.docker.alibaba-inc.com/ark/ark-schedule:0.6-20180530-68e7bed /ark-schedule/ark-schedule --debug start

如果需要调度容器本身高可以用,需要在不同的宿主机上启动多个 ark-schedule 容器, 同时可以给调度容器自己增加调度标签

环境变量参数说明

1
2
3
4
5
6
7
export ACS_CLUSTER_ENDPOINT=10.125.14.238:3376; //跟自己在同一台宿主机的swarm-manager
export ACS_NETWORK_NAME=vlan192; //方舟网络名称 docker network ls 看到vlan开头的名字
export ACS_NETWORK_STORE_CLUSTER=zk://10.125.26.108:2181,10.125.14.238:2181,10.125.1.45:2181/Cluster; //方舟zk集群,同部署的ark.properties中的
export ACS_CRONTAB="*/7 * * * * *"
export ACS_PORT="3375" //schedule 自身api暴露端口
export ACS_ADVERTISE="10.125.14.238:3375" //宿主机ip+自身api暴露端口 多个schedule容器唯一
./ark-schedule --debug start

ark-schedule 容器默认占用3375端口,如果要用别的端口需要通过 -e ACS_PORT 参数传入

-e ACS_CRONTAB="7 * * * * *" (秒 分 时 天 月 星期)

这个参数如果没有,那么需要外部来触发调度API(见下面)

ACS_ADVERTISE=”10.125.26.108:3375” 这个参数是多容器选举用的,每个容器用自己的IP+PORT来标识

容器日志主要在 /root/logs/ark-schedule-container-2017-12-12.log 中, 可以映射到宿主机上,查看更方便

镜像版本

0.1 带cron功能,自动定时扫描并恢复容器
0.2-election 有多个ark-schedule节点选举功能,抢到主的开始cron,没有抢到或者失去主的stop cron
0.3-election 在0.2的基础上修复了docker/libkv的bug,能够在弱网络、断网的条件下正常运行
0.4-switch 增加查询leader节点和cron是否开始的API,增加对Leader的cron启停的API
0.5-labels 增加对restart/recreate 标签的支持
0.6 去掉了对多个zk的支持,简化启动参数
0.7 修复了重复endpoint导致的容器的域名不通、inspect notfound(集群多个同名容器的时候)等各种问题

所有需要调度的容器增加调度标志标签

在docker run中增加一个标签: –label “ark.labels.schedule=haproxy”

详细命令:

1
sudo docker update --label-add="ark.labels.schedule=haproxy" --label-add="ark.enable_restart=true" --label-add="ark.enable_recreate=true" 容器名1 容器名2

上述命令不需要重启容器,但是要重新调snapshot API 做一次快照,让他们生效

ark-schedule容器在调度容器的时候,先检查快照中的容器,如果容器不见了或者状态不是up,又包含如上标签,就会重新在其它机器上把这个容器拉起来

  • ark.enable_restart
    是否允许通过重启来恢复容器(默认是true)。true为可以,false不可以

  • ark.enable_recreate
    是否允许将消失的容器在其他宿主机重建(默认是true)。true为可以,false不可以

API (如下ip:10.125.14.238 在现场换成客户物理机IP)

  1. 中间件部署完毕,并检查无误,调用: curl -v “http://10.125.14.238:3375/schedule/snapshot“ 对中间件做快照,将来会按快照的状态来进行恢复,执行一次就可以
  2. 手动恢复容器不见了,调用 curl -v “http://10.125.14.238:3375/schedule/snapshot/restore“ 会将所有异常容器恢复回来
  3. schedule 容器本身的健康检查接口 curl http://10.125.14.238:3375/schedule/leader http code 值是 200,说明schedule容器是健康的
  4. 查询哪个节点是Leader curl 以及是否是停止调度(维护时): “http://10.125.14.238:3375/schedule/leader
  5. 停止调度,先查询谁是leader,然后调: “http://leader-ip:3375/schedule/stop

维护状态

通过调度容器API停止调度,所有容器都不再被调度了,维护完毕再调snapshot、start API恢复调度。

如果只想对某个容器进行维护,其它容器还是希望被调度监控、调度可以通过下面的方式来实现:

docker update --label-rm="ark.labels.schedule=haproxy" 容器1 容器2 //还可以跟多个容器名
然后调 snapshot API让刚刚的update生效

运维完毕,恢复运维后的容器进入可以调度状态,具体命令如下:

docker update --label-add="ark.labels.schedule=haproxy" 容器1 容器2 //还可以跟多个容器名

然后调 snapshot API让刚刚的update生效

image.png

升级ark-schedule步骤:

下载并导入新镜像

下载镜像:http://fzpackages.oss-cn-shanghai.aliyuncs.com/ark%2Fpatch%2Fark-schedule-0.6-20180530-68e7bed.tgz
sudo docker load -i ark-schedule-0.6-20180530-68e7bed.tgz

停止原来的ark-schedule

停止两个crontab(新的ark-schedule自带crontab,每分钟执行一次调度)

停止两个ark-schedule容器

启动新的ark-schdule

在停止的两个ark-schedule的两台机器上启动两个新的ark-schedule容器,启动参数需要修改参考前面的描述(用现场环境信息替换下面的信息)

1
2
3
4
5
6
7
export ACS_CLUSTER_ENDPOINT=10.125.14.238:3376; //跟自己在同一台宿主机的swarm-manager
export ACS_NETWORK_NAME=vlan192; //方舟网络名称 docker network ls 看到vlan开头的名字
export ACS_NETWORK_STORE_CLUSTER=zk://10.125.26.108:2181,10.125.14.238:2181,10.125.1.45:2181/Cluster; //方舟zk集群,同部署的ark.properties中的
export ACS_CRONTAB="*/7 * * * * *" ----不需要改
export ACS_PORT="3375" //schedule 自身api暴露端口----不需要改
export ACS_ADVERTISE="10.125.14.238:3375" //宿主机ip+自身api暴露端口 多个schedule容器唯一
./ark-schedule --debug start //----不需要改

检查调度日志

检查两个ark-schedule 谁是主: curl http://ark-schedule所在的宿主机-ip:3375/schedule/leader

进到是主的ark-schedule容器中看日志:cat /root/logs/ark-schedule-2018-日期.log

参考资料

如何打标签 http://panama.alibaba-inc.com/qa/faq?id=1124