Heat是OpenStack中的Orchestration services,也就是应用程序的配置管理。
Heat用声明式的方法来管理公有云或者私有云中的应用程序。它和其他OpenStack的服务类似,对外提供ReSTful接口,但除此之外,它定义了一套配置管理的模版。Heat的模版才是Heat的核心所在。
因为OpenStack开发Heat一开始的目的是为了能支持AWS中的CloudFormation模版,所以很多术语和概念都来源于AWS的CloudFormation(http://awsdocs.s3.amazonaws.com/AWSCloudFormation/latest/cfn-ug.pdf)
让我们先从CloudFormation格式的getting_started.template 来介绍其中的几个关键概念。
https://github.com/openstack/heat-templates/blob/master/cfn/F17/getting_started.template
{ "AWSTemplateFormatVersion" : "2010-09-09", "Parameters" : { "KeyName" : { "Description" : "Name of an existing EC2 KeyPair to enable SSH access to the instance", "Type" : "String" } }, "Resources" : { "MyInstance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "KeyName" : { "Ref" : "KeyName" }, "ImageId" : "F17-x86_64-cfntools", "InstanceType": "m1.small", "UserData" : { "Fn::Base64" : "80" } } } }, "Outputs" : { "InstanceIp" : { "Value" : { "Fn::Join" : ["", ["ssh ec2-user@", {"Fn::GetAtt": ["MyInstance", "PublicIp"]}]]}, "Description" : "My ssh command" } } }
AWSTemplateFormatVersion定义了Template的版本信息。
Parameters是用户在创建Stack时可以输入的参数类型。
Resources中,MyInstance是一个EC2的Instance,它的属性包括SSH的Key,Glance中的Image名称,Instance的Flavor类型,还有允许传给虚拟机的用户参数。
Outputs中定义了创建Stack后的输出。Instance的Ip值是从MyInstance中得到PublicIp值。
Heat中的基本术语
1. 栈。栈是CloudFormation中管理一组资源的基本单位。一个栈往往对应与一个应用程序。在Heat自己给出的例子中,WordPress就是一个web应用,用它的配置文件可以创建一个栈实例。
2. 资源。一个栈可以拥有很多资源, 资源是底层服务的抽象。CPU,memory,disk,网络等都可以看作是资源。资源和资源之间会存在依赖关系。Heat在创建栈的时候会自动解析依赖关系,按顺序创建资源。从Havana开始Heat能并行的创建没有依赖关系的资源。
理想情况下,Heat允许你象写代码那样来管理你的应用,你可以把Heattemplate保存在版本管理器中,当你修改了模版的内容,应用的配置也会自动做出调整。当然,这是理想情况。。。
Heat模版
Heat模版和CloudFormation模版的一个很大不同是格式。AWS的CloudFormation采用的是JSON格式,它的一个缺点是没办法插入注释。Heat采用Yaml格式来克服这一缺点。另一个好处是解析不同版本的Yaml文件更为方便。因为Yaml是JSON格式的超集,JSON格式的文件可以无损转成Yaml格式。下面,让我们先来看一个Heat模版的例子:
Parameters: ssh_key_name: Type: String Description: ssh keypair name p_w_picpath_name: Type: String Description: The p_w_picpath to boot Resources: my_server: Type: OS::Nova::Server Properties: flavor: m1.small key_name: {"Ref": "ssh_key"} block_device_mapping: device_name: vda volume_id: {"Ref": "my_vol"} my_vol: Type: OS::Cinder::Volume Properties: size: 20 p_w_picpath: {"Ref": "p_w_picpath_name"} Outputs: server_ip: Description: The server IP Value: {"Fn::GetAtt": ["my_server", "first_address"]}
模版中有四个关键段:
Parameters(可选):定义用户在创建stack需要输入的参数。
Mappings (可选):定义一组静态 Key/ValuePair。用Fn::FindInMap可以查找对应的值。
Resources (必填):定义你的应用所依赖的Resources,以及Resources之间的关系。比如你的应用依赖于哪些包,该如何配置网络,需要的CPU,Memory多少等等。
Outputs (可选): 描述给用户的返回值。
所有的Resources都用通用的接口。
一些可选或必填的属性:用来配置这些资源。
一些输出属性:通过内置函数,如Fn:GetAtt,来得到的属性。
资源之间可以建立起树状的依赖关系。下面是一个典型的Autoscaling例子,用Heat的模版表示会是这样
Resources: MEMAlarmHigh: Type: AWS::CloudWatch::Alarm Properties: AlarmDescription: Scale-up if MEM > 50% for 1 minute MetricName: MemoryUtilization Namespace: system/linux Statistic: Average Period: '60' EvaluationPeriods: '1' Threshold: '50' AlarmActions: - {Ref: WebServerScaleUpPolicy} Dimensions: - Name: AutoScalingGroupName Value: {Ref: WebServerGroup} ComparisonOperator: GreaterThanThreshold WebServerScaleUpPolicy: Type: AWS::AutoScaling::ScalingPolicy Properties: AdjustmentType: ChangeInCapacity AutoScalingGroupName: {Ref: WebServerGroup} Cooldown: '60' ScalingAdjustment: '1' WebServerGroup: Type: AWS::AutoScaling::AutoScalingGroup Properties: AvailabilityZones: {'Fn::GetAZs': ''} LaunchConfigurationName: {Ref: LaunchConfig} MinSize: '1' MaxSize: '3' LoadBalancerNames: - {Ref: ElasticLoadBalancer} ElasticLoadBalancer: Type: AWS::ElasticLoadBalancing::LoadBalancer Properties: ... LaunchConfig: Type: AWS::AutoScaling::LaunchConfiguration Metadata: ... Properties:
大家可以看到Resource之间通过{Ref:}关键字相互联系了起来。
Heat通过AWS::AutoScaling::AutoScalingGroup来支持Autoscaling。当新的VM起来的时候,Scaling Group可以同时更新Load balancer的配置来加入新的VM信息。
Providers 和 Environments是Havana release中增加的两个features。Providers用来定义用户自定义的Resources, Providers的语法和Heat内置支持的Resources语法格式完全一样。Environments用来覆盖template中的部分内容,比如基本环境的设置。理想的情况是用一组providertemplate来部署你的应用(每个provider template定义一个应用),用一个environmenttemplate来定义一个云的基础架构。这样通过选择provider模版和environment模版就能在不同的云环境下使用。
目前Heat还在开发自己的模版格式HOT (HeatOrchestration Template),在Heat的模版仓库中已经包含了HOT模版的例子,更多的例子可以看这里:
https://github.com/openstack/heat-templates/