通过salt cloud在云端批量部署计算节点
作者:杨冬 欢迎转载,也请保留这段声明。谢谢!
出处:https://andyyoung01.github.io/ 或 http://andyyoung01.16mb.com/
如果需要进行大数据处理,就需要有多个计算节点的支持。如何快速部署成百上千的计算节点便成为一个急需解决的问题。而公有云省去了我们架设物理服务器的工作,剩下的就是在公有云上如何快速部署大量计算节点的问题。通过salt cloud可以完美地解决此问题。
Salt cloud支持管理很多公有云,包括阿里云,AWS,GCE等,本文主要介绍如何借助Salt Cloud配置亚马逊弹性计算云(EC2)实例。
salt-cloud的安装
可以通过salt的bootstrap脚本进行安装。
上面的第1、2行命令通过salt的bootstrap脚本安装salt的v2016.3.3版本。此例子是在EC2的实例上运行的安装脚本,它使用的Linux发行版为Amazon Linux,其包管理器同Redhat系列发行版一样,也是yum。由于已经运行过bootstrap脚本,saltstack的安装源便加入了系统。第3行命令通过yum在此机器上安装了salt-master。最后将salt-master的服务启动。
salt-cloud的配置文件
/etc/salt/cloud
: 此文件是salt-cloud的基础配置文件。也可以通过将配置文件放置在/etc/salt/cloud.conf.d
文件夹内,文件名以conf作为扩展来实现对salt-cloud的配置。在此文件中包含salt-cloud的一些核心配置参数,例如pool_size,决定了当salt-cloud使用-P参数时,salt cloud操作的VMs的数量。此文件也可以包含一些关于minion的配置信息。或者是关于云供应商的一些配置参数。然而如果将所有配置信息放置在一个文件中,会导致配置文件过于庞大,难于维护,所以一些相关的配置分散到其它的配置文件中,使可读性和维护性更强。/etc/salt/cloud.providers
: 此文件包含云供应商相关的配置参数,如一些认证信息,密钥的名称和位置,可用区等。类似地,可以将配置文件放置在/etc/salt/cloud.providers.d
文件夹中,以conf作为文件名扩展。/etc/salt/cloud.profiles
: 此文件包含云供应商的更多的一些参数,主要包括用来配置云主机实例的一些参数。同样,/etc/salt/cloud.profiles.d
文件夹可以包含不同的配置文件。/etc/salt/cloud.map
: 此文件包含使用哪个profile的配置信息启动哪个实例。当使用多个云供应商时,可以对每个云供应商创建一个文件,这样就可以集中管理各个不同云供应商上的实例。
官方文档的位置为https://docs.saltstack.com/en/latest/topics/cloud/index.html#configuration。
AWS EC2配置实例
在了解了salt-cloud的安装和配置文件后,我们来实际应用一下。这个示例在aws的EC2实例上安装了salt-cloud,也安装了salt-master,通过salt-cloud批量部署4个计算节点,可用区a有2个节点,可用区b有2个节点。节点部署后,将自动在这些节点上安装salt-minion并且连接到刚才部署这些节点使用的salt-cloud节点的salt-master上。下面看一下几个配置文件中的内容:
上述文件第1行为provider的名称,其它配置文件可以根据此名称引用到这个provider。
第3、4行提供了用于访问AWS EC2的id和key。这个id和key可以在AWS的IAM控制台获取或设置。
第6、7行提供了用于登录新创建的minion的key的名称和文件位置。这个key是在AWS EC2的控制面板的密钥对页面生成的,生成后将密钥从AWS下载到本地的相应位置,并修改文件的权限为0400。
第9-14行指定了新建实例相关的参数,例如地点、可用区、实例大小等内容。
第16行指定了此配置文件所用的driver。旧版本的salt-cloud此字段为provider,新版本此字段修改为driver。这里是针对于AWS EC2进行的配置,所以指定的driver为EC2,配置文件中的很多配置选项都是EC2专有的。如果指定的是其它的driver,则配置文件中的内容针对于其它相应的公有云。
上述配置文件配置了三个profile。一个名为ec2_prod_common_app,一个针对于可用区a,另一个针对于可用区b。针对于可用区a或b的profile使用了extends
关键字,表明这个profile是扩展自ec2_prod_common_app的profile的,所有在common中配置的字段在a或b的profile中都可用,并且可以重写相同字段名称的配置。
下面逐行看一下该配置文件。第1、16、26行为三个profile的名称。在第一个profile中,第2行字段provider表明这个profile继承了上面配置的provider中的各项配置。
第3-8行配置了新建的minion中minion配置文件的内容和grains配置文件的内容。
第9行tag的内容指定了AWS中EC2节点包含的标签信息,使用这些信息更容易在AWS众多的资源中进行定位。
第10行指定了AWS EC2中的image id,根据此id,可以确定创建minion时所用的操作系统镜像。
第11行指定了创建minion后需要运行的脚本,此脚本的一般位置在/usr/lib/python2.6/site-packages/salt/cloud/deploy/,它用于在minion上安装部署salt相关的可执行程序。
第12行确保在安装后salt的各种模块如grains、pillars等从master同步到minions上。
第14行指明是使用公有ip地址还是使用私有ip地址来传输部署脚本。如果salt-cloud命令是运行在EC2节点内则使用private_ips,如果是运行在EC2节点之外则使用public_ips。
再来看两个针对于不同可用区配置的profile。
第17、27行的可用区覆盖了之前在provider中配置的可用区,针对于这两个profile使用不同的可用区。
剩下的配置主要用来配置minion上的网络接口。AssociatePublicIpAddress
字段指定了当minions启动后,是否为其分配公有ip地址。如果指定为True,就为其指定了公有ip,可以在EC2之外访问到该实例。SubnetId
指定了该网络接口所在的VPC的id,其值可以通过AWS VPC控制台获取或设置。SecurityGroupId
指定了该网络接口所在的安全组id,其值可以通过EC2控制台的安全组里获取或设置。
上面的map文件指定了哪个minions使用哪个profile下的配置。
上面的配置都完成后,可以通过下面的命令来创建minions:
[root@ip-172-31-17-221 salt]# salt-cloud -m /etc/salt/cloud.maps.d/aws.map -P
The following virtual machines are set to be created:
app01
app02
Proceed? [N/y] y
... proceeding
[ERROR ] Public IP not detected. If private IP is meant for bootstrap you must specify "ssh_interface: private_ips" in your profile.
[ERROR ] Public IP not detected. If private IP is meant for bootstrap you must specify "ssh_interface: private_ips" in your profile.
app01:
----------
amiLaunchIndex:
0
architecture:
x86_64
...
app02:
----------
amiLaunchIndex:
0
architecture:
x86_64
...
创建完成后,测试一下是否可以连接到这些新创建的minions上:
[root@ip-172-31-17-221 salt]# salt \* test.ping
app01:
True
app02:
True
app03:
True
app04:
True
到此,完成了AWS EC2的批量创建。如果需要更多的minions,只需要编辑map文件加入更多得主机。
可以通过下面的命令删除新创建的minions:
可见,通过salt-cloud可以在公有云上快速批量部署计算节点。如果通过传统的物理服务器来部署包含几十个节点的集群,通常需要不少的时间,而通过salt cloud工具,部署包含几十台上百台节点的集群基本上不到半天就可以完成。