启迪云-高级网络工程师 邸小丽

Heat 是由AWS的EC2 Cloud Formation 演化而来,是openstack中负责Orchestration的service, 用于openstack 中资源的编排,它通过将OpenStack中的资源(resource)以模版(template)的形式组织起来。例如我们可以将一组资源,比如虚拟机实例的启动、IP绑定、软件部署等写在一个template里面,heat 通过读取配置文件来完成模版规定的动作:创建虚拟机,associate floatingip,deploy application 等等。Heat 将从这个template中创建出来的一组资源称之为“资源栈”(stack)。当对这一组资源进行操作时,只需要对stack进行操作,所以heat很适合批量资源的创建和销毁,它将一系列繁琐的人工操作自动化了起来。

Orchestration 可以理解为自动化部署、配置(provisioning and deployment)。除了资源的部署之外,还有一方面是server上应用软件的安装配置。当需要部署多个节点的时候,节点之间的依赖关系,部署顺序和配置都可以交给heat来管理。

除此之外, heat 还可以和open stack的监控(telemetry)服务Ceilometer一起实现自动伸缩,所以我们可以在heat的模版中定义一个scaling group作为一个资源。

本文将对以上内容做一个简单的介绍。

什么是Heat?

Heat向开发人员和系统管理员提供了一种简便地创建和管理一批相关的OpenStack资源的方法,并通过有序且可预测的方式对其进行资源配置和更新。用户可以使用Heat的示例模板或自己创建模板来描述OpenStack资源以及应用程序运行时所需的任何相关依赖项或运行时参数。

当设置完成后,可通过按授权控制、可预测的方式修改和更新OpenStack资源。用户可以通过OpenStack管理控制台、Heat命令行工具或 API对模板及其相关的资源集进行设置和更新。

为什么需要heat

❖更快更有效的管理OpenStack的资源

云平台系统在相对比较稳定的情况下,管理成本逐渐变成首要的解决问题。云上自动化能力是一个云平台的刚需,可以有效降低维护难度。

OpenStack原生提供命令行和Horizon 来供用户管理资源。然而命令行和在浏览器中的点击,费时费力,不利于用户使用Openstack 来进行大批量的管理以支撑IT 应用。如下图所示,openstack中有众多的资源,对应了很多繁琐的操作。

Heat 在这种情况下应运而生. 如下图所示,我们可以将一些零散的资源操作都定义在heat的模版中,通过一个创建stack的操作,就能创建出我们要的资源。Heat 采用模板方式来设计或者定义编排。为方便用户使用,Heat 还提供了大量的模板例子,使用户能够方便地得到想要的编排。

❖ 更小的研发成本

引入Heat,对于不了解OpenStack的研发者来说,可以更快的接入现有的业务系统。开发者更关心的是授权认证和对虚拟资源的增删改,而对于底层的状态并不用太多了解。

术语

1. stack

Stack概念来源于AWS,是OpenStack中用来管理一组资源的基本单位。一个stack往往对应一个应用程序。Stack管理的是resource,而resource是个抽象的概念,它可以是虚拟机,可以是网络等。

Stack就是在单个模板中定义的实例化资源的集合,是Heat管理应用程序的逻辑单元。

2. template

heat的template描述了所用的所有组件资源以及组件资源之间的关系。heat模版是heat的核心。

❖2.1 resource

资源是底层服务的抽象,CPU、memory、disk、网络等都可以看作是资源。一个stack可以拥有很多资源。资源和资源之间会存在依赖关系。Heat在创建栈的时候会自动解析依赖关系,按顺序创建资源。在heat的template中,resources用于模板中资源的声明,在HOT模板中,应该至少有一个资源的定义,否则在实例化模板时将不会做任何事情。

❖2.2 parameters

heat模板中的参数,定义在创建或更新stack时可以传递哪些参数来定制模板。

❖2.3 parameter_groups

用于指定如何对输入参数进行分组,以及提供参数的顺序。

❖2.4 outputs

heat模板中的顶级key,定义实例化后stack将返回的数据。

模版中包括七个部分:heat_template_version、description、parameter_groups、parameters、resources、outputs、conditions。除了heat_template_version和resources,其它都是可选部分。

Heat架构

Heat 是openstack 中上层的一个服务,如下图所示:

它位于其它基础组件的上层,可以将其它组件的资源以模版的形式组织起来, 如下图:

Heat 由以下组件组成:

- Heat-api:实现openstack天然支持的REST API。该组件通过把API请求经由AMQP传送给Heat engine 来处理API请求。

- Heat-api-cfn:提供兼容AWSCloudFormation的API,同时也会把API请求通过AMQP转发给Heat engine。

- Heat-engine: heat-engine是heat中的核心模块,处理主要的逻辑业务。此模块提供heat最主要的功能,执行模板内容,最终完成应用系统的创建和部署,并把执行结果返回给API调用者。当heat engine 拿到请求后,会把请求解析为各种类型的资源,每种资源都对应OpenStack 其它的服务客户端,然后通过发送REST 的请求给其它服务。通过如此的解析和协作,最终完成请求的处理。

- heatclient:CLI通过与heat-api通信,来调用API实现相关功能。终端开发者可以直接使用编排REST API。

- heat-cfntools:独立于heat组件的一个的工具,需要单独下载。这个工具用来完成虚拟机实例内部的操作配置任务。在创建虚拟机镜像时,需要在镜像中安装heat-cfntools工具。

Heat 中各个组件调用逻辑如下图所示:

Heat client 接受输入命令,参数和模板,处理信息后转为REST API,请求发送到heat-api服务。Heat API服务接受请求,读入模板信息,处理后利用rpc请求发送给heat-engine。heat-engine解析template数据,调用各种资源插件,然后各种资源插件通过openstack的clients发送指令给OpenStack服务。

Heat使用

❖5.1 对基础架构的编排

对于不同的资源,Heat 都提供了对应的资源类型。比如对于VM,Heat 提供了OS::Nova::Server。OS::Nova::Server 有一些参数,比如key、image、flavor 等,这些参数可以直接指定,可以由客户在创建Stack 时提供,也可以由上下文其它的参数获得。创建一个VM的部分模板如下:

resources:

server:

type: OS::Nova::Server

properties:

key_name: { get_param: key_name }

image: { get_param: image }

flavor: { get_param: flavor }

user_data: |

#!/bin/bash

echo “10.10.10.10 testvm”>> /etc/hosts

在上面创建VM 的例子中,我们选择从输入参数获得OS::Nova::Server 所需的值。其中利用user_data 做了一些简单的配置。

❖5.2 对软件配置和部署的编排

Heat提供了多种资源类型来支持对于软件配置和部署的编排,如下所列:

· OS::Heat::CloudConfig:VM 引导程序启动时的配置,由OS::Nova::Server 引用

· OS::Heat::SoftwareConfig:描述软件配置

· OS::Heat::SoftwareDeployment:执行软件部署

· OS::Heat::SoftwareDeploymentGroup:对一组VM 执行软件部署

· OS::Heat::SoftwareComponent:针对软件的不同生命周期部分,对应描述软件配置

· OS::Heat::StructuredConfig:和OS::Heat::SoftwareConfig 类似,但是用Map 来表述配置

· OS::Heat::StructuredDeployment:执行OS::Heat::StructuredConfig 对应的配置

· OS::Heat::StructuredDeploymentsGroup:对一组VM 执行OS::Heat::StructuredConfig 对应的配置

其中最常用的是OS::Heat::SoftwareConfig 和OS::Heat::SoftwareDeployment。

❖ OS::Heat::SoftwareConfig

下面是OS::Heat::SoftwareConfig 的用法,它指定了配置细节。

resources:

install_db_sofwareconfig

type: OS::Heat::SoftwareConfig

properties:

group: script

outputs:

- name: result

config: |

#!/bin/bash -v

yum -y install mariadb mariadb-server httpd wordpress

touch /var/log/mariadb/mariadb.log

chown mysql.mysql /var/log/mariadb/mariadb.log

systemctl start mariadb.service

❖ OS::Heat::SoftwareDeployment

下面是OS::Heat::SoftwareDeployment 的用法,它指定了在哪台服务器上做哪项配置。另外SofwareDeployment 也指定了以何种信号传输类型来和Heat 进行通信。

sw_deployment:

type: OS::Heat::SoftwareDeployment

properties:

config: { get_resource: install_db_sofwareconfig }

server: { get_resource: server }

signal_transport: HEAT_SIGNAL

❖ OS::Heat::SoftwareConfig 和OS::Heat::SoftwareDeployment 执行流程

OS::Heat::SoftwareConfig和OS::Heat::SoftwareDeployment协同工作,需要一系列Heat工具的自持。这些工具都是OpenStack的子项目。

首先,os-collect-config调用Heat API拿到对应VM的metadata。当metadata更新完毕后os-refresh-config开始工作了,它主要是运行下面目录所包含的脚本:

/opt/stack/os-config-refresh/pre-configure.d

/opt/stack/os-config-refresh/configure.d

/opt/stack/os-config-refresh/post-configure.d

/opt/stack/os-config-refresh/migration.d

/opt/stack/os-config-refresh/error.d

每个文件夹都应对了软件不同的阶段,比如预先配置阶段、配置阶段、后配置阶段和迁移阶段。如果任一阶段的脚本执行出现问题,它会运行error.d目录里的错误处理脚本。os-refresh-config 在配置阶段会调用一定预先定义的工具,比如heat-config,这样就触发了heat-config的应用,调用完heat-config后,又会调用os-apply-config。存在在heat-config或者os-apply-config里的都是一些脚本,也叫钩子。Heat对于各种不同的工具提供了不同的钩子脚本。用户也可以自己定义这样的脚本。

等一切调用完成无误后,heat-config-notify 会被调用,它用来发信号给Heat,告诉这个软件部署的工作已经完成。当Heat 收到heat-config-notify 发来的信号后,它会把OS::Heat::SoftwareConfig 对应资源的状态改为Complete。如果有任何错误发生,就会改为CREATE_FAILED 状态。

❖ OS::Heat::SoftwareConfig 和OS::Heat::SoftwareDeployment 执行流程如下:

Heat AutoScalling

基础架构的自动伸缩是一个很高级的功能。Heat提供自动伸缩组OS::Heat::AutoScalingGroup 和伸缩策略OS::Heat::ScalingPolicy,结合基于Ceilometer 的OS::Ceilometer::Alarm 实现了可以根据各种条件,比如负载,进行资源自动伸缩的功能。

Heat 自动伸缩的流程图如下:

定义自动伸缩组如下:

auto_scale_group:

type: OS::Heat::AutoScalingGroup

properties:

min_size: 1

max_size: 4

  • 定义伸缩规则如下:

server_scaleup_policy:

type: OS::Heat::ScalingPolicy

properties:

adjustment_type: change_in_capacity

auto_scaling_group_id: {get_resource: auto_scale_group}

cooldown: 60

scaling_adjustment: 1

  • 定义警报如下:

cpu_alarm_high:

type: OS::Ceilometer::Alarm

properties:

description: Scale-up if the average CPU > 50% for 1 minute

meter_name: cpu_util

statistic: avg

period: 60

evaluation_periods: 1

threshold: 50

alarm_actions:

- {get_attr: [server_scaleup_policy,alarm_url]}

matching_metadata: {'metadata.user_metadata.stack': {get_param: "OS::stack_id"}}

comparison_operator: gt

参考

https://docs.openstack.org/heat/

https://docs.openstack.org/heat/latest/template_guide/software_deployment.html

https://blog.csdn.net/wuyongpeng0912/article/details/81104235

https://blog.csdn.net/hejin_some/article/details/63255935

解码resources时里面是空的_深度解码超实用的OpenStack Heat相关推荐

  1. 解码resources时里面是空的_【汛情手记】要干不要水,从一款单4499解码衍生的臆想...

    春风不度玉门关,又见才子伴乐谈. 2020确实不是一个太平的年份,才别疫情,又遇汛清,最近长江沿线城市水灾不断,我所在的城市启动了一级响应,作为预备役非战斗人员,才子已经被指派上前线驻点巡堤,所以这阵 ...

  2. 解码resources时里面是空的_支持高清6K解码,AI人工智能语音,腾讯企鹅极光盒子1v闪亮登场...

    这段时间情况特殊,我们都闲置在家,除了必要的学习和锻炼身体外,追剧成为了我日常必不可少的一部分,<爱的迫降><梨泰院class><庆余年>等,一部接一部的看,总感觉 ...

  3. base64 加密有空格 换行_[编码解码] Base64 编码换行和+号遍空格的处理

    Android自身带有Base64加密与解密的包,可以方便地加密密码方便传输. String base64Token = Base64.encodeToString(token.trim().getB ...

  4. 简单介绍实体类或对象序列化时,忽略为空属性的操作

    这篇文章主要介绍了实体类或对象序列化时,忽略为空属性的操作,具有很好的参考价值,希望对大家有所帮助.如有错误或未考虑完全的地方,望不吝赐教 第一种,在配置文件配置 在application.xml直接 ...

  5. bug修复录-qq浏览器中post请求时body为空

    近期项目中遇到一个bug,其中解决过程比较有意思,特此记录下来.有一天看到报警记录有一个500服务端的错误,量很少,一周都不一定有一个,先根据服务器里的本地日志拿到了当时请求的相关信息像UA.cook ...

  6. PDF:解决从PDF中复制文字时出现的空方框问题

    PDF:解决从PDF中复制文字时出现的空方框问题 目录 解决问题 解决思路 解决问题 解决从PDF中复制文字时出现的空方框问题 解决思路 将该pdf文档另存为html格式,然后打开html文件,复制文 ...

  7. Java解决空引用_在java中检查空引用的乐观方法

    本问题已经有最佳答案,请猛点这里访问. 任何Java精通/专家都能告诉我,在使用null来避免EDCOX1×0时,检查空引用或对象的乐观方式是什么? 在我的代码中,我有100多个字段,其中大部分是为了 ...

  8. 上传文件时$_FILES为空,可能的原因及解决方法

    上传文件时$_FILES为空,可能的原因及解决方法 参考文章: (1)上传文件时$_FILES为空,可能的原因及解决方法 (2)https://www.cnblogs.com/i6010/articl ...

  9. springBoot上传文件时MultipartFile报空问题解决方法

    springBoot上传文件时MultipartFile报空问题解决方法 参考文章: (1)springBoot上传文件时MultipartFile报空问题解决方法 (2)https://www.cn ...

最新文章

  1. 【uni-app】富文本控件:百度小程序上uParse无法正确显示
  2. 【数据结构与算法】之双向链表的创建/遍历/插入/删除/查找的算法实现
  3. shell 执行失败重试_Uipath 机器人总是运行失败怎么办?
  4. VS建lUML画类图
  5. 论文浅尝 - AAAI2020 | 基于知识图谱进行对话目标规划的开放域对话生成技术
  6. 截取字符串的函数_常用的Excel函数
  7. 如何查看外网ip地址_如何查看本机ip地址?
  8. 实现Windows Phone 8多媒体:视频
  9. homebrew下安装mysql_Mac下homebrew安装Mysql以及配置问题
  10. Windows 2000 Server Resource Kit CD BT下载地址
  11. 卸载vuecli3_针对遇到安装或卸载vue-cli失败的解决方案
  12. 联想a30微型计算机,联想A30测评,硬件部分。是电脑哦。
  13. Spring Bean作用域
  14. 汽车零部件行业PLM解决方案
  15. element-ui中el-upload在ie10中无法上传相同图片的问题:XMLHttpRequest: 网络错误 0x2efd, 由于出现错误 00002efd 而导致此项操作无法完成。
  16. win10怎么快速锁定计算机,win10怎么快捷键锁定电脑_win10一键锁屏快捷键是什么-win7之家...
  17. 自然语言处理之Word2Vec
  18. linux删除 0 字节文件,如何恢复 Linux 上删除的文件
  19. signature=c4f11bb5142d9f6ce0876b3cc0d888af,1【这人生我去了吧】_百度贴吧
  20. 反编译小程序得到源代码

热门文章

  1. Unity: .NET下的依赖注入容器
  2. 华为畅享max有没有人脸识别_谁说千元机就要将就?华为畅享Z全面测评:5G、屏幕、拍照无短板...
  3. 构建根文件系统之busybox(三)最小根文件系统
  4. 基于排队理论的云计算模型的MATLAB仿真
  5. C++ new和delete操作符
  6. Vue.js组件中v-model的使用
  7. Unity UGUI —— 无限循环List(转载)
  8. Android服务之Service(其一)
  9. 使用 IntraWeb (31) - IntraWeb 的 Xml 操作使用的是 NativeXml
  10. RemoteApp连接时所需要的证书