OpenStack Heat服務介紹 (三)

Heat是OpenStack中的Orchestration services,也就是應用程序的配置管理。linux

Heat用聲明式的方法來管理公有云或者私有云中的應用程序。它和其餘OpenStack的服務相似,對外提供ReSTful接口,但除此以外,它定義了一套配置管理的模版。Heat的模版纔是Heat的核心所在。git


由於OpenStack開發Heat一開始的目的是爲了能支持AWS中的CloudFormation模版,因此不少術語和概念都來源於AWS的CloudFormation(http://awsdocs.s3.amazonaws.com/AWSCloudFormation/latest/cfn-ug.pdfgithub


讓咱們先從CloudFormation格式的getting_started.template 來介紹其中的幾個關鍵概念。web

https://github.com/openstack/heat-templates/blob/master/cfn/F17/getting_started.templatebash


{
  "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類型,還有容許傳給虛擬機的用戶參數。app

Outputs中定義了建立Stack後的輸出。Instance的Ip值是從MyInstance中獲得PublicIp值。ssh


Heat中的基本術語
ide

1. 棧。棧是CloudFormation中管理一組資源的基本單位。一個棧每每對應與一個應用程序。在Heat本身給出的例子中,WordPress就是一個web應用,用它的配置文件能夠建立一個棧實例。

2. 資源。一個棧能夠擁有不少資源, 資源是底層服務的抽象。CPU,memory,disk,網絡等均可以看做是資源。資源和資源之間會存在依賴關係。Heat在建立棧的時候會自動解析依賴關係,按順序建立資源。從Havana開始Heat能並行的建立沒有依賴關係的資源。


161422593.png


理想狀況下,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的模版表示會是這樣

161928706.png


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/

相關文章
相關標籤/搜索