OpenStack Heat AutoScaling详解及实例代码
OpenStackHeatAutoScaling
一、背景
Openstack的Heat是在H版之后加入的组件,旨在创建一套业务流程,更轻松的管理一个集群。集群内的虚拟机可以作为一个整体,统一的为客户提供服务。Heat中把功能定义成资源,在Heat中会用到Nova,Neutron,Ceilometer等组件,这些都可以看成是资源,通过模板文件来描述,模板文件可以是yaml格式,也可以是json格式,一般是yaml格式。
AutoScaling的概念最早出现在AWS,AutoScaling是一项Web服务,目的是根据用户定义的策略,时间表的运行状态检查启动或终止虚拟机,达到自动伸缩。
Openstack里的AutoScale是由Heat和Ceilometer模块一起配合完成的。Ceilometer负责收集处理性能数据,一旦达到Heat模版里定义的阀值,就发告警信息给heat-engine,由heat-engine调动Heat模版里定义的其它的OpenStack资源实现autoscale。
二、HeatAutoScalingResources
实现AutoScaling功能涉及到的资源如下:
1.AWS::AutoScaling::AutoScalingGroup
伸缩组是具有相同应用场景的实例的集合,定义了组内实例数的最大值和最小值,冷却时间等等。
注:冷却时间是指一个伸缩活动后的一段锁定时间,在这个时间内不能进行其他的伸缩活动。
语法如下:
{
"Type":"AWS::AutoScaling::AutoScalingGroup",
"Properties":{
"AvailabilityZones":[String,...],
"Cooldown":String,
"DesiredCapacity":String,
"HealthCheckGracePeriod":Integer,
"HealthCheckType":String,
"InstanceId":String,
"LaunchConfigurationName":String,
"LoadBalancerNames":[String,...],
"MaxSize":String,
"MetricsCollection":[MetricsCollection,...]
"MinSize":String,
"NotificationConfigurations":[NotificationConfigurations,...],
"PlacementGroup":String,
"Tags":[AutoScalingTag,...,],
"TargetGroupARNs":[String,...],
"TerminationPolicies":[String,...,],
"VPCZoneIdentifier":[String,...]
}
}
2.AWS::AutoScaling::LaunchConfiguration
伸缩配置定义了用于弹性伸缩的实例的配置。由AutoScalingGroup用于配置组内的实例。
语法如下:
{
"Type":"AWS::AutoScaling::LaunchConfiguration",
"Properties":{
"AssociatePublicIpAddress":Boolean,
"BlockDeviceMappings":[BlockDeviceMapping,...],
"ClassicLinkVPCId":String,
"ClassicLinkVPCSecurityGroups":[String,...],
"EbsOptimized":Boolean,
"IamInstanceProfile":String,
"ImageId":String,
"InstanceId":String,
"InstanceMonitoring":Boolean,
"InstanceType":String,
"KernelId":String,
"KeyName":String,
"PlacementTenancy":String,
"RamDiskId":String,
"SecurityGroups":[SecurityGroup,...],
"SpotPrice":String,
"UserData":String
}
}
3.AWS::AutoScaling::ScalingPolicy
为autoscalegroup添加伸缩的策略,定义了具体的扩展或者收缩的操作,以及伸缩的数量。
语法如下:
{
"Type":"AWS::AutoScaling::ScalingPolicy",
"Properties":{
"AdjustmentType":String,
"AutoScalingGroupName":String,
"Cooldown":String,
"EstimatedInstanceWarmup":Integer,
"MetricAggregationType":String,
"MinAdjustmentMagnitude":Integer,
"PolicyType":String,
"ScalingAdjustment":Integer,
"StepAdjustments":[StepAdjustments,...]
}
}
此外,Heat中AutoScaling还需配合OS::Ceilometer::Alarm使用,由Alarm监控实例的运行状况,一旦超过阈值,则会产生告警。
三、HeatAutoScalingTemplate
下面是一个简单的例子:
heat_template_version:2013-05-23
description:Heattemplateforautoscaling
parameters:#定义一些变量
flavor:
type:string
default:m1.small
image:
type:string
default:1a2b3c4f-1a2b-3c4f-5d6e-4130ff5203de
availability_zone:
type:string
default:nova
alarm_scaleout_threshold:#阈值
type:number
default:80
alarm_scalein_threshold:#阈值
type:number
default:20
resources:
neutron_network:
type:OS::Neutron::Net
properties:
name:{get_param:"OS::stack_name"}
neutron_subnet:
type:OS::Neutron::Subnet
properties:
name:{get_param:"OS::stack_name"}
network_id:{get_resource:neutron_network}
cidr:'192.168.111.0/24'
gateway_ip:'192.168.111.1'
allocation_pools:
-start:'192.168.111.2'
end:'192.168.111.254'
neutron_router:
type:OS::Neutron::Router
properties:
name:{get_param:"OS::stack_name"}
add_router_interface:
type:OS::Neutron::RouterInterface
properties:
router_id:{get_resource:neutron_router}
subnet_id:{get_resource:neutron_subnet}
nova_server_security_group:
type:OS::Neutron::SecurityGroup
properties:
description:'securitygroupforVM'
name:{get_param:"OS::stack_name"}
rules:[
{direction:'ingress',
remote_ip_prefix:'0.0.0.0/0',
port_range_min:0,
port_range_max:30000,
ethertype:IPv4,
protocol:'tcp'},
{direction:'egress',
remote_ip_prefix:'0.0.0.0/0',
port_range_min:0,
port_range_max:65535,
ethertype:'IPv4',
protocol:'tcp'},
{direction:'egress',
remote_ip_prefix:'0.0.0.0/0',
port_range_min:0,
port_range_max:65535,
ethertype:'IPv4',
protocol:'udp'},
{direction:'ingress',
remote_ip_prefix:'0.0.0.0/0',
port_range_min:null,
port_range_max:null,
ethertype:'IPv4',
protocol:'icmp'},
{direction:egress,
remote_ip_prefix:'0.0.0.0/0',
port_range_min:null,
port_range_max:null,
ethertype:'IPv4',
protocol:'icmp'}
]
launch_config:#Scalegroup中的实例的配置
type:AWS::AutoScaling::LaunchConfiguration
properties:
ImageId:{get_param:image}#实例使用的image
InstanceType:{get_param:flavor}#实例使用的flavor
SecurityGroups:[get_resource:nova_server_security_group]
UserData:|#实例启动时运行的脚本
#!/bin/bash
passwdroot<<EOD
123456
123456
EOD
server_group:#伸缩组
type:AWS::AutoScaling::AutoScalingGroup
properties:
AvailabilityZones:[]
Cooldown:'60'#冷却时间
LaunchConfigurationName:{get_resource:launch_config}#组中实例的配置
MinSize:'1'#最小实例数
MaxSize:'4'#最大实例数
VPCZoneIdentifier:[get_resource:neutron_subnet]
scaleout_policy:#向上扩展的策略
type:AWS::AutoScaling::ScalingPolicy
properties:
AdjustmentType:ChangeInCapacity
#heat支持三种调整方式:change_in_capacity(new=current+adjustment),#exact_capacity(new=adjustment),percent_change_in_capacity(在current的基#础上上按照adjustment的百分比调整)
AutoScalingGroupName:{get_resource:server_group}
ScalingAdjustment:'1'#每次的调整量,即增加一个实例
scalein_policy:#向下收缩的策略
type:AWS::AutoScaling::ScalingPolicy
properties:
AdjustmentType:ChangeInCapacity
AutoScalingGroupName:{get_resource:server_group}
ScalingAdjustment:'-1'#每次的调整量,即减少一个实例
neutron_port:
type:OS::Neutron::Port
properties:
network_id:{get_resource:neutron_network}
fixed_ips:
-subnet_id:{get_resource:neutron_subnet}
security_groups:[{get_resource:nova_server_security_group}]
alarm_scaleout:#定义一个ceilometeralarm
type:OS::Ceilometer::Alarm
properties:
description:Scale-upiftheaverageCPU>80%for10minute
meter_name:cpu_util#监控虚拟机的cpu_util
statistic:avg#statistic的计算方法为avg即平均值法
period:600#统计周期
evaluation_periods:1#连续几个周期才算有效
repeat_actions:true
threshold:{get_param:alarm_scaleout_threshold}#cpu_util的阈值
alarm_actions:#该告警在alarm状态时的action。
-{get_attr:[scaleout_policy,AlarmUrl]}
matching_metadata:{'metadata.user_metadata.groupname':{get_resource:'server_group'}}
comparison_operator:gt#检测值和阈值的比较方式为gt即大于
alarm_scalein:
type:OS::Ceilometer::Alarm
properties:
description:Scale-downiftheaverageCPU<20%for10minutes
meter_name:cpu_util
statistic:avg
period:600
evaluation_periods:1
repeat_actions:true
threshold:{get_param:alarm_scalein_threshold}
alarm_actions:
-{get_attr:[scalein_policy,AlarmUrl]}
matching_metadata:{'metadata.user_metadata.groupname':{get_resource:'server_group'}}
comparison_operator:lt#检测值和阈值的比较方式为lt即小于
outputs:
scale_in_url:
value:{get_attr:[scalein_policy,AlarmUrl]}
scale_out_url:
value:{get_attr:[scaleout_policy,AlarmUrl]}
这个stack的功能是监控实例的CPU使用率,当CPU使用率大于80%时,将会启动一个新的实例,当CPU使用率小于20%,将会减少一个实例。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!