天天看點

基于資源編排一鍵傳遞應用之基于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 應用。

繼續閱讀