云上集群自动伸缩

自动伸缩机理

AIP支持与公有云API的集成实现根据集群中作业量自动伸缩云上AIP集群的大小。云上最小集群为一台主机,即master。作业直接在master上提交, 当AIP调度器定期查看等到作业,当等待作业到一定数量后触发集群扩容机制,即运行一个外部可配置的命令。这个外部可配置的命令可以调用云的API或命令行启动新的云主机, 云主机启动时的脚本把自己添加到已有的AIP集群中,作业就可以被调度到新的云主机上。

当云主机上没有作业运行一段时间后,AIP触发外部可配置的命令,通过调用云API或命令行把云主机删除,并从集群中移除该主机。

备注

云上AIP集群的自动伸缩不能使用云自身的自动伸缩功能,因为云的自动伸缩功能无法知道等待作业以及AIP的作业调度逻辑,另外在作业结束后自动去除主机时也会因为无法判断哪些主机可以去除而导致作业失败, 或者过于频繁地启停动态主机,导致作业调度效率低下。集群自动伸缩是作业调度的一部分,必须由调度器决策什么时候、哪些主机可以添加和移除。

配置云上自动伸缩的步骤如下:

  1. 部署和配置master

  2. 制作计算主机镜像

  3. 开发AIP自动伸缩脚本

AIP动态集群基础

AIP的动态集群基于AIP可以通过命令动态添加和删除集群主机。动态的主机不配置在AIP的基础配置文件 cb.yaml 中,而是通过增删动态主机命令 caddhostcrmhost 实现加入和退出集群。

安全控制

为了安全,cb.yaml 中参数allowed_dynamic_cidrs定义允许加入集群的IP地址CIDR,若不定义,则不允许动态主机加入集群。例子:

allowed_dynamic_cidrs:
- 10.210.0.0/16
- 10.211.2.0/24
- 10.211.3.3/32
- 10.211.3.4/32

动态主机AIP服务设置

动态主机由于不定义在 cb.yaml 中,需要禁止AIP的daemon cbls在启动时检查自己是否配置在cb.yaml中,aip服务启动cbls时需要增加参数-D。这个参数可以通过以下任意一种方式实现:

  1. 在运行设置计算节点AIP的host-setup命令时,增加参数–dynamic,如:/share/skyformai_shared/host-setup –dynamic;

  2. 或者:在/lib/systemd/system/aip.service里的第8行尾部添加-D参数,如:ExecStart=/cubetop/etc/aip.systemd -D。

添加动态主机到集群中

AIP的管理员或者root通过命令 caddhost 把主机动态添加的集群中。在一般的公有云中,由于AIP的集群主机是以主机名,而不是IP地址为调度单元的,如果VPC中没有缺省的DNS,在添加主机时,务必同时告诉AIP该主机的IP地址, 这个信息会被master的cbls接受,从而集群中所有的AIP服务都可以通过master cbls获得动态主机的IP地址。例子:

caddhost -a $(hostname -i) $(hostname -s)   # 用命令hostname获取当前主机的IP地址和主机名,添加到AIP集群

如果需要添加主机标签资源,以便作业调度时调度到该类主机,只要是标签资源(参考 cb.yaml中的resources参数)在master上已经定义,就可以在caddhost中使用,例子:

caddhost -R CENTOS7 -a 10.10.2.4 node01

如果添加的主机上的最大作业槽与CPU核数不同,也可以通过-M参数定义主机的最大作业槽。

从集群中移除动态主机

AIP的管理员或者root通过命令 crmhost 把主机从集群中移除。例子:

crmhost $(hostname -s)            # 把本主机从AIP集群中移除

如果不执行该命令,当主机上的AIP服务与master失联超过cb.yaml中定义的dynamic_host_timeout分钟后(缺省5分钟),主机会被自动从集群中移除。移除后的主机即时AIP服务于master的联系恢复也不会被自动加入到集群中, 必须再用caddhost命令才可加入集群。

云上部署和配置master

固定IP地址

云上master主机需要有一个固定的IP地址,以便动态计算主机镜像中配置master的主机名和IP地址。如果有些公有云不允许云主机由固定的IP地址,每次master主机销毁和重开通后,就必须修改计算主机镜像, 或者在动态计算主机开通后自动更新上面的master主机IP地址,然后才能加入到AIP集群中。

小技巧

可以把master放到一个云的自动伸缩组(autoscaling group)里,并配置组的伸缩最小和最大都为1,万一主机故障,可以通过云的自动伸缩组自动恢复。

部署单机AIP集群

参考 安装AIP 安装单机的AIP集群。安装时可以把root设成admin,以避免对用户cadmin的依赖。./install –admin=root。

配置cb.yaml里的cluster: allowed_dynamic_cidrs。这个参数的值可以使用VPC里的subnet (子网)CIDR。

配置集群伸缩参数

集群自动伸缩参数为 cb.yaml 中的scale部分,缺省这部分的参数是关闭的。

基本的参数为:

  • scale_pend_time: 这个参数定义AIP调度器是否开启集群自动伸缩功能。这个参数定义当队列中作业等待时间超过多少分钟后,自动触发添加云主机的动作。

  • scale_max_slots: 定义集群最大规模,最大可扩到多少个CPU和(作业槽)。

  • scale_up_action: 开通新的云主机的可执行命令的绝对路径。命令接受一个参数:需要扩展的作业槽数。命令需要根据这个参数计算开通多少台新的云主机。开通后需要把开通的主机的实例ID、实例主机名、和IP地址记录下来, 以便被scale_down_action使用。命令无需运行caddhost把主机添加到集群中,caddhost命令可由计算主机镜像中的启动自动化脚本完成。

  • scale_down_action: 销毁云主机的可执行命令的绝对路径。命令接受需要销毁的主机名,可以是一个或多个,多个主机名作为多个命令行参数。命令需要通过查找scale_up_action命令生成的实例数据文件查到实例ID, 调用云命令或API销毁这些实例,并运行crmhost命令把主机从AIP集群中移除。

其他参数参考 cb.yaml 中的scale部分说明。

制作计算主机镜像

制作步骤:

  1. 开通一个云主机实例,下载解压AIP文件。

  2. 在AIP解压包的目录中,编辑一个hosts文件,里面放入master_ip master_hostname。

  3. 配置本机的IP地址:在/etc/hosts中去除”127.0.0.1 主机名”的行,增加“IP地址 主机名”。

  4. 运行./install –noint –admin=root

  5. 运行./host-setup –dynamic 观察主机加入了集群。

  6. 配置文件系统挂载。

  7. 配置用户认证系统、以及其他操作系统参数。

  8. 生成镜像。

  9. 销毁主机。

警告

如果动态计算主机与master共享AIP的安装和数据(/opt/skyformai/work),为了避免动态主机对集群的数据干扰, 必须在/opt/skyformai/etc/cb.yaml的cluster部分,增加参数:master_list,列出master的主机名。

云主机销毁后,等一段时间(缺省5分钟左右)AIP集群中该主机会被自动删除。

开发AIP自动伸缩脚本

开发两个脚本。

scale_up_action

脚本的逻辑为:

  • 根据命令行的参数(需要的作业槽数)计算需要开通的实例数。

  • 调用云命令开通这些实例。

  • 获得已开通实例的ID和主机名,放到本地的一个小的数据库里(可以是文本文件或者sqlite文件)

  • 开通云主机时,云主机上自动运行的脚本完成设置主机名、修改/etc/hosts、用caddhost把自己加到AIP集群中。例子:

    ip=$(hostname -I | awk '{print $1}'         # 获得本机IP地址
    hostname="ip-$(echo $ip | sed 's/\./-/g')"  # 主机名对应于IP地址,格式为ip-111-111-111-111
    hostnamectl set-hostname $hostname          # 设置自己的主机名
    sed -i /127.0.0.1/d /etc/hosts              # 删除 /etc/hosts里的127.0.0.1的行
    echo $ip $hostname >> /etc/hosts            # 在/etc/hosts中增加修改后的主机名和自己的IP地址
    systemctl stop aip                          # 停止AIP服务
    caddhost -a $ip $hostname                   # 加入AIP集群
    systemctl start aip                         # 重启AIP服务,使其用新改的主机名
    

    小技巧

    在AWS上,以上的脚本可以配置成launch template里的user data,或者开通云主机时的user data。其他公有云应该有类似的参数配置。

scale_down_action

脚本的逻辑为:

  • 根据命令行的参数(主机名),从本地小的数据库查到实例ID。

  • 运行crmhost把主机名从AIP集群中去除。

  • 调用云命令销毁这些实例。

限制

  1. 有些作业由于资源不足可能在增加云主机后还是不能运行,如作业请求了GPU,但新增的云主机中不含GPU。

  2. 队列中若制定了主机名,则该队列中的等待作业不会触发集群扩容,因为队列中的主机是固定的。