通过salt cloud在云端批量部署计算节点

目录
  1. salt-cloud的安装
  2. salt-cloud的配置文件
  3. AWS EC2配置实例

作者:杨冬 欢迎转载,也请保留这段声明。谢谢!
出处:https://andyyoung01.github.io/http://andyyoung01.16mb.com/

如果需要进行大数据处理,就需要有多个计算节点的支持。如何快速部署成百上千的计算节点便成为一个急需解决的问题。而公有云省去了我们架设物理服务器的工作,剩下的就是在公有云上如何快速部署大量计算节点的问题。通过salt cloud可以完美地解决此问题。

Salt cloud支持管理很多公有云,包括阿里云,AWS,GCE等,本文主要介绍如何借助Salt Cloud配置亚马逊弹性计算云(EC2)实例。

salt-cloud的安装

可以通过salt的bootstrap脚本进行安装。

1
2
3
4
[ec2-user@ip-172-31-17-221 ~]$ curl -o bootstrap_salt.sh -L https://bootstrap.saltstack.com
[ec2-user@ip-172-31-17-221 ~]$ sudo sh bootstrap_salt.sh git v2016.3.3
[ec2-user@ip-172-31-17-221 ~]$ sudo yum install salt-master
[ec2-user@ip-172-31-17-221 ~]$ sudo service salt-master start

上面的第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上。下面看一下几个配置文件中的内容:

/etc/salt/cloud.providers.d/aws.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ec2_us_west_2:
id: <access_key>
key: <secret_key>
keyname: common
private_key: /etc/salt/key/common.pem
location: us-west-2
availability_zone: us-west-2b
size: t2.micro
del_root_vol_on_destroy: True
ssh_username: ec2-user
rename_on_destroy: True
driver: ec2

上述文件第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,则配置文件中的内容针对于其它相应的公有云。

/etc/salt/cloud.profiles.d/aws-profile.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
ec2_prod_common_app:
provider: ec2_us_west_2
minion:
master: ip-172-31-17-221.us-west-2.compute.internal
environment: production
grains:
server_type: app
environment: production
tag: {'Environment': 'Production', 'Role': 'Application'}
image: ami-b04e92d0
script: bootstrap-salt
sync_after_install: all
ssh_interface: private_ips
ec2_prod_app_us-west-2b:
availability_zone: us-west-2b
network_interfaces:
- DeviceIndex: 0
AssociatePublicIpAddress: True
SubnetId: subnet-91bc18e7
SecurityGroupId:
- sg-8da950eb
extends: ec2_prod_common_app
ec2_prod_app_us-west-2a:
availability_zone: us-west-2a
network_interfaces:
- DeviceIndex: 0
AssociatePublicIpAddress: True
SubnetId: subnet-9422a0f0
SecurityGroupId:
- sg-8da950eb
extends: ec2_prod_common_app

上述配置文件配置了三个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控制台的安全组里获取或设置。

/etc/salt/cloud.map/aws.map
1
2
3
4
5
6
ec2_prod_app_us-west-2a:
- app01
- app03
ec2_prod_app_us-west-2b:
- app02
- app04

上面的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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@ip-172-31-17-221 salt]# salt-cloud -m /etc/salt/cloud.maps.d/aws.map -d
The following virtual machines are set to be destroyed:
ec2_us_west_2:
ec2:
app01
app02
Proceed? [N/y] y
... proceeding
ec2_us_west_2:
----------
ec2:
----------
app01:
----------
...
app02:
----------
...

可见,通过salt-cloud可以在公有云上快速批量部署计算节点。如果通过传统的物理服务器来部署包含几十个节点的集群,通常需要不少的时间,而通过salt cloud工具,部署包含几十台上百台节点的集群基本上不到半天就可以完成。