Senlin服务为构建自动缩放解决方案提供了丰富的解决方案。

目录

  1. Autoscaling using Ceilometer/Aodh
    1. 创建VM集群
    2. 创建Receiver
    3. 创建Aodh告警
    4. 在集群节点上运行工作负载
    5. 验证集群扩展
  2. Autoscaling with Heat
    1. 示例模板
    2. 部署步骤
  • Operations
    CLUSTER_SCALE_OUTCLUSTER_SCALE_IN操作是用于扩展集群的最简单的命令形式。另一方面,CLUSTER_RESIZE操作提供了更多选项来控制详细的集群扩展行为。这些操作都可以在有或没有策略附加到集群的情况下执行。

  • Policies

    • senlin.policy.scaling,可用于微调集群扩展操作。
    • senlin.policy.deletion,可用于控制如何从集群中删除节点。
    • senlin.policy.affinity,可用于控制如何强制执行节点亲和力或反亲和力。
    • senlin.policy.region_placement,可用于在多个区域扩展集群。
    • senlin.policy.zone_placement,可用于强制实现跨可用区的节点分布。
  • Receivers
    Receiver提供了一个通道,可以从该通道向其发送来自外部监视软件或服务的信号或警报,从而可以自动执行缩放操作。

Autoscaling using Ceilometer/Aodh

创建VM集群

sample_server.yaml:

1
2
3
4
5
6
7
8
9
type: os.nova.server
version: 1.0
properties:
name: my_server
flavor: micro-1
image: CentOS-7.3-64bit-ec2-user
key_name: oskey
networks:
- network: private

请注意,此规范文件假定有一个名为oskey的有效密钥对,并且有一个名为private的网络。可能需要根据环境设置更改这些值。

创建配置文件。

1
openstack cluster profile create --spec-file sample_server.yaml my_proflie

创建集群。

1
openstack cluster create --profile my_profile --desired-capacity 2 my_cluster

这将创建一个在开始时创建2个节点的集群。为了方便起见,将集群ID设为环境变量。

1
export MYCLUSTER_ID=10c80bfe-41af-41f7-b9b1-9c81c9e5d21f

查看每个节点分配的IP地址。

1
openstack cluster node show --details

创建Receiver

下一步是为集群创建Receiver,以触发集群上的操作。通常为特定目的创建一个Receiver,因此出于不同的目的,可能需要创建多个Receiver。

创建一个Receiver,用于在每次触发该集群时将指定集群扩展两个节点。

1
openstack cluster receiver create --action CLUSTER_SCALE_OUT --params count=2 --cluster my_cluster my_receiver

目前,Receiver显示的所有属性值都是只读的。创建Receiver后,无法更改其值。

对于Action参数,有很多选择:

  • CLUSTER_SCALE_OUT
  • CLUSTER_SCALE_IN
  • CLUSTER_RESIZE
  • CLUSTER_CHECK
  • CLUSTER_UPDATE
  • CLUSTER_DELETE
  • CLUSTER_ADD_NODES
  • CLUSTER_DEL_NODES
  • NODE_CREATE
  • NODE_DELETE
  • NODE_UPDATE
  • NODE_CHECK
  • NODE_RECOVER

创建Receiver后,您可以检查其channel属性值以了解如何触发该Receiver。对于类型为webhook的Receiver(目前是默认和唯一受支持的类型),这意味着将检查alarm_url的值。为了方便起见,将该值导出到环境变量。

1
export ALRM_URL="http://node1:8778/v1/webhooks/ba...5a/trigger?V=1&count=2"

与上面的示例类似,可以为不同种类的集群操作或具有不同参数值的同一集群操作创建其他接收器。

创建Aodh告警

创建集群并准备好接收外部信号后,便可以继续使用部署的软件/服务来创建告警。以下命令使用aodh警报服务创建阈值警报,以便:

  • aodh将评估指定集群中的CPU利用率(即cpu_util)指标;
  • aodh将使用给定时间段(即此处的60秒)内的平均值计算CPU利用率;
  • aodh将在每个周期结束时进行评估;
  • aodh不会重复触发警报操作;
  • aodh将基于指定的元数据进行度量标准聚合。
1
2
3
4
5
6
7
aodh alarm create \
--type gnocchi_resources_threshold --name cpu-high \
--metric cpu_util --threshold 70 --comparison-operator gt \
--description 'instance running hot' --evaluation-periods 1 \
--aggregation-method mean --alarm-action $ALRM_URL \
--granularity 600 --repeat-actions False \
--query metadata.user_metadata.cluster_id=$MYCLUSTER_ID

为了让aodh知道senlin注入到每个创建的每个VM服务器中的cluster_id元数据,可能需要在/etc/ceilometer/ceilometer.conf文件中添加以下行:

1
reserved_metadata_keys = cluster_id

还要注意,为确保每60秒至少评估一次CPU利用率的指标,需要在文件/etc/ceilometer/pipeline.yaml中更改cpu_source的interval值。可以将其从默认值600更改为60:

1
2
3
4
5
6
7
sources:
<other stuff ...>
- name: cpu_source
interval: 600 <- change this to 60
meters:
- "cpu"
<other stuff ...>

在集群节点上运行工作负载

在高CPU工作量下检查集群扩展的效果。现在,可以登录到每个集群节点并在其中运行一些高CPU的工作,以提高CPU利用率。例如:

1
2
ssh cirros@10.0.0.9
cat /dev/zero > /dev/null

当集群中的所有节点的CPU压力提高时,可以检查每个节点上的CPU利用率,最后继续下一步。

验证集群扩展

在启动集群节点上的CPU工作负载一段时间后,集群已自动扩展。将创建两个新节点并将其添加到集群。可以通过运行以下命令来验证:

1
openstack cluster show $MYCLUSTER_ID

可以使用以下命令来检查是否触发并执行了预期的操作:

1
openstack cluster action list --filters target=$MYCLUSTER_ID

Autoscaling with Heat

Heat中有Senlin资源类型,可以轻松实现功能全面的自动缩放解决方案的部署。

示例模板

在senlin目录下的heat-template项目中有一个示例模板,用于通过Heat创建Senlin弹性负载平衡集群。

下面的资源定义了一个security_group,用于连接到创建的负载均衡集群。

1
2
3
4
5
6
7
8
9
10
11
security_group:
type: OS::Neutron::SecurityGroup
properties:
rules:
- protocol: icmp
- protocol: tcp
port_range_min: 22
port_range_max: 22
- protocol: tcp
port_range_min: 80
port_range_max: 80

以下资源定义了用于创建目标集群的配置文件。

1
2
3
4
5
6
7
8
9
10
11
12
profile:
type: OS::Senlin::Profile
properties:
type: os.nova.server-1.0
properties:
flavor: {get_param: flavor}
image: {get_param: image}
key_name: {get_param: key_name}
networks:
- network: {get_param: network}
security_groups:
- {get_resource: security_group}

下面的资源定义了创建至少有两个节点的Senlin集群。

1
2
3
4
5
6
cluster:
type: OS::Senlin::Cluster
properties:
desired_capacity: 2
min_size: 2
profile: {get_resource: profile}

下面的两个资源定义了附加到已创建集群的scale_in_policy和scale_out_policy。事件的属性用于定义策略起作用的客观动作。将调整属性的类型设置为CHANGE_IN_CAPACITY时,集群在scale_out时将增加节点数,在scale_in时将减少节点数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
scale_in_policy:
type: OS::Senlin::Policy
properties:
type: senlin.policy.scaling-1.0
bindings:
- cluster: {get_resource: cluster}
properties:
event: CLUSTER_SCALE_IN
adjustment:
type: CHANGE_IN_CAPACITY
number: 1

scale_out_policy:
type: OS::Senlin::Policy
properties:
type: senlin.policy.scaling-1.0
bindings:
- cluster: {get_resource: cluster}
properties:
event: CLUSTER_SCALE_OUT
adjustment:
type: CHANGE_IN_CAPACITY
number: 1

下面的资源定义了要附加到目标集群的lb_policy。将策略附加到集群后,Senlin将通过调用neutron LBaas V2 API来自动创建负载均衡,pool和health_monitor,以实现负载平衡。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
lb_policy:
type: OS::Senlin::Policy
properties:
type: senlin.policy.loadbalance-1.0
bindings:
- cluster: {get_resource: cluster}
properties:
pool:
protocol: HTTP
protocol_port: 80
subnet: {get_param: pool_subnet}
lb_method: ROUND_ROBIN
vip:
subnet: {get_param: vip_subnet}
protocol: HTTP
protocol_port: 80
health_monitor:
type: HTTP
delay: 10
timeout: 5
max_retries: 4

以下两个资源定义了发生特定警报或事件时要触发的接收器(Receiver)。

1
2
3
4
5
6
7
8
9
10
11
12
13
receiver_scale_out:
type: OS::Senlin::Receiver
properties:
cluster: {get_resource: cluster}
action: CLUSTER_SCALE_OUT
type: webhook

receiver_scale_in:
type: OS::Senlin::Receiver
properties:
cluster: {get_resource: cluster}
action: CLUSTER_SCALE_IN
type: webhook

以下资源定义了在收缩集群时选择要删除的候选节点的策略。

1
2
3
4
5
6
7
8
9
10
11
deletion_policy:
type: OS::Senlin::Policy
properties:
type: senlin.policy.deletion-1.0
bindings:
- cluster: {get_resource: cluster}
properties:
criteria: YOUNGEST_FIRST
destroy_after_deletion: True
grace_period: 20
reduce_desired_capacity: False

下面的两个资源定义了分别触发以上两个接收器的警报。使用LoadBalancer的平均传入字节速率作为触发缩放操作的指标。

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
scale_in_alarm:
type: OS::Ceilometer::Alarm
properties:
description: trigger when bandwidth overflow
meter_name: network.services.lb.incoming.bytes.rate
statistic: avg
period: 180
evaluation_periods: 1
threshold: 12000
repeat_actions: True
alarm_actions:
- {get_attr: [receiver_scale_in, channel, alarm_url]}
comparison_operator: le
query:
metadata.user_metadata.cluster_id: {get_resource: cluster}

scale_out_alarm:
type: OS::Ceilometer::Alarm
properties:
description: trigger when bandwidth insufficient
meter_name: network.services.lb.incoming.bytes.rate
statistic: avg
period: 60
evaluation_periods: 1
threshold: 28000
repeat_actions: True
alarm_actions:
- {get_attr: [receiver_scale_out, channel, alarm_url]}
comparison_operator: ge
query:
metadata.user_metadata.cluster_id: {get_resource: cluster}

部署步骤

在部署之前,请确保已在环境中安装并配置了neutron LBaas v2和ceilometer/Aodh。
第一步是使用以下命令生成密钥对:

1
openstack keypair create heat_key

第二步是创建Heat模板,方法是从Heat模板下载模板文件。

第三步是使用以下命令创建Heat Stack。

1
openstack stack create test -t ./ex_aslb.yaml --parameter "key_name=heat_key"