OpenStack Heat AutoScaling详解及实例代码

OpenStack Heat AutoScaling

一、背景

Openstack的Heat是在H版之后加入的组件,旨在创建一套业务流程,更轻松的管理一个集群。集群内的虚拟机可以作为一个整体,统一的为客户提供服务。Heat中把功能定义成资源,在Heat中会用到Nova,Neutron,Ceilometer等组件,这些都可以看成是资源,通过模板文件来描述,模板文件可以是yaml格式,也可以是json格式,一般是yaml格式。
AutoScaling的概念最早出现在AWS,AutoScaling是一项Web服务,目的是根据用户定义的策略,时间表的运行状态检查启动或终止虚拟机,达到自动伸缩。

Openstack里的Auto Scale是由Heat和Ceilometer模块一起配合完成的。Ceilometer负责收集处理性能数据,一旦达到Heat模版里定义的阀值,就发告警信息给heat-engine,由heat-engine调动Heat模版里定义的其它的OpenStack资源实现auto scale。

二、Heat AutoScaling Resources

实现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" : [ Auto Scaling Tag, ..., ],
  "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

为auto scale group添加伸缩的策略,定义了具体的扩展或者收缩的操作,以及伸缩的数量。

语法如下:

{
  "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监控实例的运行状况,一旦超过阈值,则会产生告警。

三、 Heat AutoScaling Template

下面是一个简单的例子:

heat_template_version: 2013-05-23
description: Heat template for autoscaling
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: 'security group for VM'
   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:#Scale group中的实例的配置
  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
     passwd root << 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: #定义一个 ceilometer alarm
  type: OS::Ceilometer::Alarm
  properties:
   description: Scale-up if the average CPU > 80% for 10 minute
   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-down if the average CPU < 20% for 10 minutes
   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%,将会减少一个实例。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

时间: 2016-12-02

Openstack 创建项目和虚拟机详细介绍

Openstack 创建项目和虚拟机                    最新学习Openstack 的知识,因为在公司新项目中使用,于是在网上学习如何创建项目,这里记录下,希望也能帮助到大家. 正规教程:Running an Instance 创建项目 1. 点击左边的 Identity–>Projects,并点击面板右上方创建项目 2. 创建一个属于你的项目并且在配额中调整你所需要的资源 创建用户 1. 点击左边的 Identity–>Users,并点击面板右上方创建用户 2. 设置密码

openstack 重启的服务命令整理总结

openstack重启的服务命令集合 最近公司项目需要使用Openstack   由于Openstack 重启服务命令比较多,于是就在网上找了下资料,整理下来,希望能帮助到读者! 重启openstack的整个服务 openstack-service restart 1. 重启dashboard service httpd  restart service memcached restart 2. 重启 ceilometer 2.1 cinder service mongod restart 2.

一步一步教你安装openstack(图文)

openstack,安装的门槛比较高,而且相当麻烦,很多的安装文档作者省了不少安装步骤.这对初学的人带来了很大的麻烦,也许作者轻易节省一步,就会创成后面的安装失败.而且初学者由于对openstack不是很了解,错误无法排查,因此很多人都在中途放弃对openstack的学习.其实有一个安装工具可以快速的安装openstack,不需要了解openstack各个组件的之间的关系,只需鼠标轻轻一点,就可以完成对openstack的安装:而且还有诸多功能,如对openstack健康检查,查看节点日志等.

Openstack 使用migrate进行数据库升级实现方案详细介绍

Openstack 使用migrate进行数据库升级实现方案详细介绍 OpenStack中随着版本的切换,新版本加入一些数据库表或者增加字段等是必然的事情,如何比较容易的进行这些数据库升级的适配和管理,这里就要用到oslo_db中的migrate了,这里以为M版本的heat为例,讲解一下migrate管理db的原理. 我们使用migrate需要用到的主要包含以下两部分:1.versions里面的为版本号+数据库适配脚本:2.migrate.cfg为migrate需要用到的配置文件,两部分的命名是

CentOS 一键安装Openstack详细介绍

 CentOS 一键安装Openstack 最近再看Openstack相关知识,一直想试试安装一下,可是参考了很多资料,并不如人意.由于一直用的Linux版本为CentOS,大部分Openstack安装都要求在Ubuntu上进行.我也不知到什么原因,并不喜欢Ubuntu,可能是觉得太花哨了,而且总提示更新什么的,好了,废话不多说. 找到一个网站,国外的,  http://openstack.redhat.com/Main_Page,进入到quickstart页面中,简单翻译如下: 用到的工具是一

OpenStack 创建windows镜像实现步骤

 OpenStack 创建windows镜像 创建windows镜像 创建一个img文件 kvm-img create -f qcow2 win7.qcow2 30G 下载virtio驱动 wget http://alt.fedoraproject.org/pub/alt/virtio-win/archives/virtio-win-0.1-59/virtio-win-0.1-59.iso wget http://www.linuxwind.org/download/virtio-win-1.1

OpenStack之虚机热迁移的代码详细解析

话说虚机迁移分为冷迁移以及热迁移,所谓热迁移用度娘的话说即是:热迁移(Live Migration,又叫动态迁移.实时迁移),即虚机保存/恢复(Save/Restore):将整个虚拟机的运行状态完整保存下来,同时可以快速的恢复到原有硬件平台甚至是不同硬件平台上.恢复以后,虚机仍旧平滑运行,用户不会察觉到任何差异.OpenStack的虚机迁移是基于Libvirt实现的,下面来看看Openstack虚机热迁移的具体代码实现. 首先,由API入口进入到nova/api/openstack/comput

OpenStack 工作流workflows使用原理详细介绍

Workflows 工作流是复杂的forms(表单)和tabs,每一个workflow必须包含 Workflow,Step 和 Action 下面举例讲解workflow用法: 接下来的例子讲解了数据是如何从urls.views.workflows.templates之间互相传递的 在 urls.py中, 定义了一个参数. 例如. resource_class_id. RESOURCE_CLASS = r'^(?P<resource_class_id>[^/]+)/%s$' urlpatter

Openstack 网络知识资料详细介绍及总结

Openstack 网络知识资料总结: Openstack 概念 我刚听说要去做 openstack 开发的时候,蛮激动的啊.虽然我不知道 openstack 是什么东西,但是我知道这个东西和云计算有关.云计算这东西,听着就高大上,各大互联网公司都有投人进去搞,所以大方向上是必须肯定的.于是我按捺不住了,想在自己的主机上部署 openstack,来体验下这个是什么东西.经过一顿折腾之后,终于在虚拟机里面用 devstack 把 openstack 给部署出来了(部署过程中,最坑的就是国内的防火墙

OpenStack Ceilometer用MongoDB解决占用磁盘空间过大问题

OpenStack Ceilometer用MongoDB解决占用磁盘空间过大问题 背景:Ceilometer使用MongoDB作为数据库,不断进行采样,导致数据量膨胀,占用过多的磁盘空间. 知识背景 1.数据库文件类型 1.1. journal 日志文件 跟一些传统数据库不同,MongoDB的日志文件只是用来在系统出现宕机时候恢复尚未来得及同步到硬盘的内存数据.日志文件会存放在一个分开的目录下面.启动时候MongoDB会自动预先创建3个每个为1G的日志文件(初始为空). 1.2. namespa

Openstack 节点维护详细讲解

OpenStack 简介 OpenStack 是一个开源的 IaaS 实现,它由一些相互关联的子项目组成,主要包括计算.存储.网络.由于以 Apache 协议发布,自 2010 年项目成立以来,超过 200 个公司加入了 OpenStack 项目,其中包括 AT&T.AMD.Cisco.Dell.IBM.Intel.Red Hat 等.目前参与 OpenStack 项目的开发人员有 17,000+,来自 139 个国家,这一数字还在不断增长中. OpenStack 兼容一部分 AWS 接口,同时

Xcode使用教程详细讲解(全)

Xcode使用教程详细讲解是本文要介绍的内容,Xcode是一个款强大的IDE开发环境,就像你在写Windows程序时需要VS2005一样 需要要Xcode为你写Mac程序提供环境.因此,如果你要成为Mac 程序的开发者,灵活运用Xcode工具是你必须做的第一步. 1)我们写程序时常常在源文件的头部添加copyright声明以及公司名称等等:而Xcode在创建文件时已经帮我们做了绝大部分工作,我们可能需要修改一下公司名称,因为xcode给不知道我们公司名称,它不可能预知一切,所以需要我们自己通过设

MySQL/Postgrsql 详细讲解如何用ODBC接口访问MySQL指南

详细讲解如何用ODBC接口访问MySQL指南 MySQL的ODBC接口实现是通过安装MyODBC驱动,这个驱动程序是跨平台的.如果在Linux等Unix体系操作系统下使用,需要先安装Iodbc这些第三方ODBC标准支援平台. 简单的ASP示例代码:   复制代码 代码如下: <%   dim sql,mysql   set sql = server.createobject("adodb.connection")   mysql="driver={mysql odbc 

pandas中ix的使用详细讲解

在上一篇博客中,我们已经仔细讲解了iloc和loc,只是简单了提到了ix.这是因为相比于前2者,ix更复杂,也更让人迷惑. 因此,本篇博客通过例子的解释试图来描述清楚ix,尤其是与iloc和loc的联系. 首先,再次介绍这三种方法的概述: loc gets rows (or columns) with particular labels from the index. loc从索引中获取具有特定标签的行(或列). iloc gets rows (or columns) at particular

详细讲解JS节点知识

注意大小写一定不能弄错. 属性: Attributes 存储节点的属性列表(只读) childNodes 存储节点的子节点列表(只读) dataType 返回此节点的数据类型 Definition 以DTD或XML模式给出的节点的定义(只读) Doctype 指定文档类型节点(只读) documentElement 返回文档的根元素(可读写) firstChild 返回当前节点的第一个子节点(只读) Implementation 返回XMLDOMImplementation对象 lastChil

OpenStack之日志详细介绍

OpenStack日志                 最近做项目用到OpenStack,由于刚刚开始使用,有很多错误,然后查询日志,抽空把日志系统的资料整理下来,大家可以看下. 日志对于一个稳定的系统来说相当重要,对于OpenStack这样一个大型的系统,日志当然也是必不可少,理解Openstack系统的日志对于保证OpenStack环境稳定非常重要.对于出现系统错误,查看日志是一个很好的习惯. OpenStack通过生成大量日志信息来帮助排查系统安装运行期间出现的问题,接下来介绍几个常见服务

PHP分页详细讲解(有实例)

1.前言分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之一.对于web编程的老手来说,编写这种代码实在是和呼吸一样自然,但是对于初学者来说,常常对这个问题摸不着头绪,因此特地撰写此文对这个问题进行详细的讲解,力求让看完这篇文章的朋友在看完以后对于分页显示的原理和实现方法有所了解.本文适合初学者阅读,所有示例代码均使用php编写.2.原理所谓分页显示,也就是将数据库中的结果集人为的分成一段一段的来显示,这里需要两个初始的参数:每页多少条记录($PageSize)?

PHP分页显示制作详细讲解

1.前言 分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之一.对于web编程的老手来说,编写这种代码实在是和呼吸一样自然,但是对于初学者来说,常常对这个问题摸不着头绪,因此特地撰写此文对这个问题进行详细的讲解,力求让看完这篇文章的朋友在看完以后对于分页显示的原理和实现方法有所了解.本文适合初学者阅读,所有示例代码均使用php编写. 2.原理 所谓分页显示,也就是将数据库中的结果集人为的分成一段一段的来显示,这里需要两个初始的参数: 每页多少条记录($PageSi

PHP应用分页显示制作详细讲解

1.前言 分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之一.对于web编程的老手来说,编写这种代码实在是和呼吸一样自然,但是对于初学者来说,常常对这个问题摸不着头绪,因此特地撰写此文对这个问题进行详细的讲解,力求让看完这篇文章的朋友在看完以后对于分页显示的原理和实现方法有所了解.本文适合初学者阅读,所有示例代码均使用php编写. 2.原理 所谓分页显示,也就是将数据库中的结果集人为的分成一段一段的来显示,这里需要两个初始的参数: 每页多少条记录($PageSi

一步步教你利用webpack如何搭一个vue脚手架(超详细讲解和注释)

Vue作为前端三大框架之一截至到目前在github上以收获44,873颗星,足以说明其以悄然成为主流.16年10月Vue发布了2.x版本,经过了一段时间的摸索和看官方的教程和api,才了解到2.0版本在1.0版本的基础上做了好多调整,废弃了好多api. 本文将详细介绍关于利用webpack搭一个vue脚手架的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 一.适用人群 1.对webpack知识有一定了解但不熟悉的同学. 2.女同学!!!(233333....) 二.目