天天看点

基于资源编排一键交付应用之基于WaitCondition的通知机制

随着各类应用的不断发展,许多应用开发人员对应用部署的便捷性和应用运行的稳定性都提出了很高的要求,从这个意义上来讲,应用的一键交付以及对应用做负载均衡将会是一个不错的解决方案。对开发人员而言,在交付应用时如何才能保证对应用所做的负载均衡是成功的呢?此时,有效控制应用的部署过程并且感知应用的部署结果,将具有重要的意义。

本文将为大家提供一个基于资源编排一键构建负载均衡应用并基于 waitcondition 的通知机制掌控应用部署过程的解决方案。

首先引入一个概念:waitcondition(等待条件)。在基于资源编排构建应用时,不得不使用资源 <code>aliyun::ecs::instance</code> 的 userdata 属性。在创建 ecs vm 的时候,userdata 作为 ecs vm 的属性传递到 ros,当 userdata 执行结束后,执行结果需要被 ros 接收并进行处理,为了实现这个功能,需要引入两个资源,一个资源表示需要在一定的时间内等待一定数量的 userdata 执行的消息,在条件不满足的情况下,使栈一直保持在资源创建状态;另一个资源接收 userdata 的信息,保存 userdata 执行的结果,并且产生 cloud init 回调的 curl 命令,进而通知 ros userdata 执行的结果。这两个资源依次为:

aliyun::ros::waitcondition

aliyun::ros::waitconditionhandle

因此,waitcondition 使用了一种通知机制,在 userdata 执行结束后告诉开发者应用部署已完成,使开发者能够感知到应用部署的进度和状态。

基于资源编排构建一个负载均衡集群,用于提供应用的运行环境

基于资源编排在负载均衡集群的每个节点上构建应用

利用 waitcondition 的通知机制掌控应用的部署过程

目前云资源构建的网络类型只支持 vpc,可选区域仅支持华南 1、华北 2 和华东 2,即 <code>regionid</code> 只支持 <code>cn-shenzhen</code>、<code>cn-beijing</code> 和 <code>cn-shanghai</code>。其它的 region 和网络类型,我们也会尽快的上线。

除了以上介绍的方法外,本文将介绍一种构建负载均衡集群更为简便的方法,那就是在模板中定义资源类型 <code>aliyun::ecs::instancegroup</code>,并在其中利用属性 <code>maxamount</code> 和 <code>minamount</code> 指定您需要创建的实例个数,以此来替代在模板中重复定义 <code>aliyun::ecs::instance</code> 的繁琐工作。如下模板定义了一个拥有三个实例的负载均衡集群(部分资源的定义已省略,可详见最终模板):

正如前文所说,在应用部署时引入资源 <code>aliyun::ros::waitcondition</code> 和 <code>aliyun::ros::waitconditionhandle</code> 以掌控应用的部署过程。资源 <code>aliyun::ros::waitcondition</code> 有以下三个属性:

count

接收到成功信号的数量,即当等待条件接收到必要的成功信号后,ros 才能继续创建堆栈资源。否则,若在超时时间之前未能接受到指定数量的成功信号, ros 会认为未满足等待条件,从而停止堆栈资源的创建并进行回滚。

handle

使用内部函数 ref 来指定 <code>aliyun::ros::waitconditionhandle</code> 资源。只要您在资源创建过程中添加 waitcondition 资源,就必须将等待条件与对应的 waitconditionhandle 资源进行关联。

timeout

等待接受 count 属性指定信号数的最大允许时长(以秒计算)。为该属性指定的最长时间为 12 小时(43200秒)。

在创建资源 <code>aliyun::ecs::instance</code> 的时候,ros 会把 userdata 最终传递到 ecs vm,然后通过 waitcondition 轮询的检查是否超时、是否接收到 userdata 失败的消息以及是否接收到足够多的 userdata 执行的消息。当 waitcondition 检测到 waitconditionhandle 接收到 userdata 执行结果的通知后,标识自己创建成功。最后 ros 为这个模板所创建的栈标识为创建成功,否则就是创建失败。

userdata 执行的状态信息是通过 'ros_notify -d {"status" : "success", "reason": "signal1", "data": data1, "id" : "1"}' 这行命令传回来的,该命令中的参数解释如下:

status

userdata 执行的状态,有两个值:"success"和"failure"。"success"表明 userdata 执行成功;"failjure" 表明 userdata 执行失败,栈资源将进行回滚。

reason

userdata 执行的状态原因,用户自定义

data

数据信息,用户自定义

id

唯一id号,标识一次通知或一个资源,用户自定义

这些值都是可选的,用户可以部分指定或者全部指定,也可以什么都不指定。如果什么都不指定或只指定部分信息,waitconditionhandle 处理的时候,会赋上默认值,默认值是成功。ros_notify 最终会被替换成由 waitconditionhandle 所生成的真正的 curl 命令串。后面的 -d 是发送给 ros 的详细执行信息。这个是可选的,用户可以根据需要进行添加。所以在模板中,需要使用以下两个函数:

fn::replace

用 waitconditionhandle 提供的 curlcli 替换 ros_notify

fn::getatt

获取 waitconditionhandle 的输出值 curlcli

除此之外,waitcondition 也有一个输出信息 data,可输出 userdata 执行返回的所有信息。

以下定义了两个利用已有 vpc 资源构建负载均衡的 wordpress 的模板。

首先是利用资源类型 <code>aliyun::rds::instance</code> 定义了具有两个节点的负载均衡集群的模板,值得注意的是,为了方便起见,模板中的两个 webserver 共用一个 waitcondition,所以模板中的资源 waitcondition 未使用属性 dependson。以下是模板详情:

其次是利用资源类型 <code>aliyun::ecs::instancegroup</code> 一次性定义了具有三个节点的负载均衡集群的模板,值得注意的是,在定义模板前用户并不知道 instancegroup 中的每个 instance 的资源 id,所以在调用命令 <code>ros-notify -d</code> 时不应该指定资源id,而是让其自动去获取,以下是模板详情:

完成模板的创建后,根据 stack 资源的创建步骤,输入必要的参数,点击 <code>创建</code> 按钮,即可完成资源的创建以及应用的构建。

资源创建完成后,根据资源创建的输出结果,在浏览器中直接输入 <code>[ipaddress]</code> 或者 <code>http://[ipaddress]/wp-admin/install.php</code> 即可访问搭建好的 wordpress 应用。

继续阅读