雲上自動化 vs 雲上編排

華為雲開發者社群發表於2020-07-23

1 摘要

本文介紹了為什麼在一個好的公有云或私有云中必須要有一個編排系統來支援雲上自動化,以及實現這個編排系統的困難和各家的努力。同時提供了一套實現編排系統的原型,它包括了理論分析及主體外掛框架,還給出一些細節控制的建議。希望有助於大家對“資源編排&應用編排”概念有更深的瞭解,也希望以開放的心態與大家一起努力,使得雲真的像水電一樣自然和普及。

2 為什麼需要雲上自動化

IT領域的自動化要求無需多言,每個程式設計師都知道這是必須品。自動化指令碼,自動化測試,自動化部署等等,都是為了程式及圍繞此程式的各類程式設計師跑的更加歡快。那麼在雲上我們是否還需要自動化?簡單而言,初次使用無需考慮;深度使用者需要雲上自動化。具體體現在:

2.1 重複性的執行動作

在雲上驗證應用上線的工作中,有很多的事情是需要重複操作的。比如環境的銷燬和重建;或者擴容的場景下,重複地完成多個新例項的配置動作。一旦此類操作的頻率變高,比如一天一次或者一天多次的時候,你一定會覺得繁瑣,並且開始嘗試如何使得整個流程變的自動化,從而保證每一次執行是可重複的。也許你會寫些Shell或者Python指令碼,或者你主動呼叫雲提供商的API,甚至藉助某些工具如Chef,Puppet來完成這個目的。

重複是催生自動化的首要條件。

2.2 節約時間

在雲上使用服務,有些操作是非常耗時的,比如建立資料庫,建立VM,都需等待分鐘級別的時間。一旦需要序列的建立多個耗時任務,就需要使用者持續等待一段時間。而此時如果可以將整個流程自動化,則可以釋放人為的等待過程,使程式設計師去完成其他更有價值的任務。

雲上的流程自動化後,執行動作的總體耗時並不會減少,只是這段等待時間可以被轉移,比如放在深夜執行。也正是這個原因(耗時沒有減少,只是轉移了),所以自動化後時間的節省,還是要以重複性為前途的。假如只是一次性的操作,那麼“自動化節約的時間” vs “完成自動化的時間”一般都是不划算的。

2.3 基礎環境的複製

這裡的基礎環境是指Infrastructure,是指應用跑在雲上所需要的所有云服務的集合。例如一個典型Web網站的3層架構,前端+後臺+資料庫。在雲上的某個區(例如華北區)域搭建好一套完整的系統後,遇到需要在華南區甚至另一個雲提供商的雲上,重新搭建一樣的環境的時候,就會有系統複製的需求。是靠程式設計師手動一個一個元件的安裝?還是自動化的一鍵重複部署?在有後者能力的情況下,當然後者是首選。

現在很多雲廠商都推行一個叫做 Infrastructure As Code 的概念,使用機器可以理解的配置檔案,來代替人工互動式的配置動作。並且這種配置檔案可以通過版本管理系統像程式碼一樣進行版本管理。這樣對於企業的好處主要體現有3個:減小成本、提高效率、降低風險。

減小成本很好理解,如上提到的,自動化可以將人力轉移到其他任務上,提高程式設計師的產出。而效率的提升主要體現在通過自動化的配置可以將環境安裝的實施過程縮短,如果有多個元件或者團隊互動的話,提升效率就更明顯了。同時自動化可以消除人為的錯誤,可重複的執行特性也提升實施過程的可靠性。

2.4 自助式服務

雲上服務,如果做得好,應該是自助式的,就像自來水和電一樣,即開即用,按需付費。只有這樣子才可以支援任意的自動化按需供給、按需擴容,也才是雲本身所具備的含義。

所以這一條理由其實是對雲提供商提出的要求,你的雲平臺要能夠支援使用者自助式的按需使用各種雲服務,並提供相應的使用計量資訊(賬單)和使用報告。只有當平臺的後端實現流程是全自動化的,才能做到給使用者的體驗是完全自助式的。這跟淘寶商家的“有貨隨便拍”一個道理,否則沒到下單前都得跟店家溝通,無法做到按需自助式使用。

2.5 小結:自動化的成本

任何需要自動化的東西,前提就是你需要重複的執行,只有當自動化的收益大於重複的成本,才會有自動化的需求出現。假如任務只是一次性的,那就不存在自動化的需求。相反我們相信從收益方面考慮,精心人工操作一遍會比將流程自動化更為划算。

好比有時候路上遇到口渴並不會想安裝一套自來水,還不如直接買一瓶礦泉水來的實在,而在家裡,則需要安裝一套自來水系統,因為你每天都需要使用水。

雲上的自動化提供了一種可靠性,它使得雲資源,雲服務的每一次建立的行為都是一致的,任何使用者,任何組織的執行都是可重複的;同時也消除了由於人為操作可能的失誤所帶來的問題,是雲上深度使用者的必需品。

3 雲上自動化演進

3.1自動化面臨的困難

(1)雲服務的種類豐富多樣,導致想要完成全面的自動化並非易事。一個典型的雲平臺會提供了ECS(虛機),EVS(硬碟),VPC(網路),RDS(資料庫),ELB(負載均衡)等等一系列數都數不清的服務。有一個新的術語叫做 AWS fatigued,就是說AWS每年都會上線各種新服務&新特性,使得使用者對新上線的服務&特性都感到了“AWS疲乏”,疲於使用。

(2)雲服務間的建立存在複雜的依賴關係。最典型的例子就是,當建立EIP的時候,需繫結VM,而建立CM的時候,又需要先建立Subnet,建Subnet的前提就是需要先有VPC。層層的依賴,以及交叉依賴,都為開發者在企圖自動化的道路設定了攔路虎,使得完成自動化的成本大大提高。根據前面提到的成本大於重複性收益的時候,自動化就會被放棄。

(3)雲上資源的使用方式與傳統方式不同。使用者從資源的完全擁有者變成資源的使用者,後臺許可權的降低,導致你無法掌控一切,使得不那麼方便的定位資源初始化失敗原因(也許雲平臺本身的Bug導致)。有時候不得不聯絡雲提供商求助瞭解失敗原因。另外在使用流程上也會稍有改變,原來你的軟體包一次拷貝就到了驗證環境,而在雲上,也許你需要中轉跳板才能達到目的。這些都加劇了自動化的實施困難。

3.2 自動化的嘗試

這裡直接給一個圖來總結了雲上自動化的嘗試歷程,可以更加直觀的瞭解這一領域的發展情況。不過在資源供給自動化和資源編排上其實邊界也沒有那麼的明顯,可以看到主要的差異是在靈活的語法上。在已有的自動化模板裡面逐步增加一些靈活的語法,基本可以達到靈活編排的目的。

4 終極的自動化體系-編排

自動化是指一個任務流程中不需要人為的干預,而編排則是指多個任務流程可以提前規劃,任務間可以互相配合,並行或者序列的執行。可以從最直接的定義上看到,只有做到任意的自動化流程控制才能稱之為編排,是一個自動化的升級版。由此可見,如果某雲廠商的一個編排系統,連一些基礎的自動化流程都無法滿足,那麼它就不是一個好的編排系統。

4.1 雲上的編排標杆

提到雲上的編排系統,就不得不提老大哥AWS的Cloudformation了,基本上它已經是AWS雲生態的一個標準,支撐應用市場以及服務目錄完成任意IT軟體和IT基礎設施的初始化流程。

它的主要原理就是使用者提供建立物件的各種屬性,然後CFN協助完成物件的建立。例如初始化EC2,就是相當於建立VM虛擬機器。那麼使用者就得提供屬性:主機名,用什麼映象,硬碟多大,用什麼網路,主機規格,安全組等。有了這些屬性,CFN就可以確定如何呼叫EC2的API來建立VM了。

它之所以能力很強是因為它除了提供執行順序的控制能力以外,在語法層面還提供了很多的內建函式,使用者可以通過函式來引用變數,拼接變數值,控制執行細節。超豐富的編排物件,使得使用CFN基本可以滿足任意AWS資源的自動化建立。

4.2 雲上編排系統對比

這裡分析三家典型的提供編排能力的雲廠商能力分析表,不對之處也請聯絡糾正。(亞馬遜CFN、阿里ROS、華為AOS)

√表示“強/做得好”,O表示“一般/待增強”,X表示“沒有此特性”。

注:OpenStack的Heat編排能力類似AWS,但是無圖形化設計器,這裡就不列舉了。

4.3 編排系統的不足

當前的編排系統都需要一個描述檔案,來描述使用者希望的執行流程。一般都會把這個描述檔案稱之為“模板”。通過模板來控制執行邏輯,這並不是一個問題,因為你能看到的業界編排系統都有自己的“模板”語法規則。問題在於,從無到有的寫作一個新的模板,會比較困難,需要使用者學習一定的門檻,大家的第一感覺總是像在學習一門新的程式語言。

這個是由編排的目標物件的複雜度決定的:建立一個RDS資料庫,就是會比單獨建立一臺VM,需要有更多的控制引數。於是一種新的模板語法,相當於一種新的程式語言。寫過程式碼的你肯定知道,想要快速的編碼,當然需要合適的IDE支撐。也正因此,一些有實力的編排系統就會推出相應的圖形化設計器,其定位就是配套的模板寫作IDE。

比如AWS,阿里和華為都提供了線上的模板編輯IDE。設計器好壞的評價標準就是能否支撐方便的寫作模板。

5 如何實現雲上編排系統

一個編排系統的核心就是一個工作流引擎,負責分析各個步驟間的依賴關係,並按照DAG(有向無環圖)模型來控制這些流程的執行順序。而云上的編排,更加的具化,就是按依賴順序建立各個雲服務。

演算法層面,我們可以稱每個雲服務為元素。建立各種雲服務的過程,就是按順序建立各個元素的過程。

5.1有向無環圖DAG

有向無環圖(Directed Acyclic Graph, DAG), 是有向圖的一種,字面意思的理解就是圖中沒有環。常常被用來表示事件之間的依賴關係,用於管理任務之間的排程。

圖:一個有向無環圖的例子

其中所有節點的拓撲排序是有向無環圖中經常需要使用到的演算法,我們的系統原型也是按照此理論基礎進行實現的。就是把所有元素按照DAG依賴關係確定好誰先誰後的順序,具體演算法大家可以在網上或者資料中搜尋獲得,這裡就不細介紹了。排好序後,接下里的實現就是先完成底層的元素,再完成上層元素,直到所有元素都初始化完畢。以上就是我們的編排系統模型的理論參照。

5.2 編排系統原型

在這裡我們假設有一個系統的初始化流程如下:

要實現所有元素按照設定好的順序建立,我們遵從兩個要點:(1)預設並行執行。(2)無依賴的先執行。具體演算法實現上,我們首先將元素啟動順序分解為有向圖,並遍歷計算得到每個節點的依賴數。如下:

注:依賴只需要計算臨近的節點就可以。

遵循之前的兩個原則:那麼元素B和元素D的依賴數是0,所以這兩個元素可以先執行初始化。同時B和D之間無關,可以並行執行。

在任意一個元素執行完之後,所有依賴這些節點的依賴數減一,重新得到所有節點的依賴數:

本次可以執行的元素就是C和F,因為它們的依賴數為0。在這兩個元素執行完後,將依賴他們的元素的依賴數減一,重新得到所有節點依賴數:

按照上述的邏輯遞迴執行,直到所有的元素都被執行完,整個工作流就完成了。它保證整個流程是按順序用時最短的。從工作流實現原理可知,編排的能力強弱並不強調流程控制,而是編排元素,及編排語法的豐富程度。好的編排系統,可以快速的完成新元素的驅動開發,從而提供新服務的編排能力。

5.3 元素間資訊傳遞

如果每個元素初始化,都得記錄著其他元素的資訊,這種在實現上元素間就很耦合。為了保持每個元素在執行時候的獨立性(即當前元素在初始化時,不用去了解其他元素的資訊)。主體框架需要保持一個全域性資訊,然後在初始化一個元素的時候,把這個元素需要的資訊告訴它就行。它自己完全不知道還有哪些其他元素,反正它自己需要的資訊都有了。

這裡舉例說明,排程框架維護一個全域性資訊,記錄每個元素需要哪些引數才能初始化。上圖綠色的需要使用者提供,紅色的則在被依賴物件建立後自動獲得。比如建立VM需要VPC的ID,那麼在VPC建立後,VPC的ID就知道了,這個欄位不用使用者提供。

所以在元素D初始化完成後,元素C就可以開始初始化了。這個時候,所有建立C的引數,都應該是確認的值。在呼叫C服務的初始化API的時候,不缺任何資訊。這樣在實現C的建立API和銷燬API,就非常獨立,只與C服務本身打交道。

如上圖,在開發新服務的時候,只需要瞭解新服務自身就可以了,所有想要的資訊(可以直接要求使用者提供,或者通過依賴獲得),都會通過框架管理和傳遞。

這就是我們的外掛化框架,這個框架使得新增一種服務非常容易。因為服務的驅動開發是完全獨立的。

5.4 外掛設計

5.4.1 元素的生命週期

每一種雲服務物件,在編排系統看來都是一個元素。新增一種元素的編排,就需要該元素提供增刪改查等基礎執行能力。編排系統的外掛管理框架會根據使用者執行動作,比如建立or銷燬,來呼叫元素對應的API。

有了上一節的元素執行流程框架後,新增一個編排物件,只需要完成該元素的各種行為驅動就可以。例如:只要有建立和銷燬VM的方法(API),那麼就可以在編排元素裡面增加一個EC2服務,就可以在模板裡面增加這種元素的編排了。排程框架只是把它當做一個普通元素來對待。

5.4.2 使用者自定義外掛

基於外掛框架每個元素驅動獨立的優勢,同時考慮到Kubernetes中的Resource物件也有自定義擴充套件特性(custom resource definition),可以設計一種元素外掛支援使用者定義自己的K8S編排物件的能力。即把使用者提供的“資訊”原封不動的傳遞給底層API。由底層系統去解釋使用者的“資訊”。編排系統退化為只負責流程控制+資訊傳遞通道。

5.4.3 操作的等待&進度

之前提過,有些雲服務的操作非常耗時,如果不能提供整體進度的直觀反饋,使用者體驗就會非常的差,以為整個執行流程掛死。所以在元素驅動的編寫時,必須考慮進度和等待反饋,讓編排框架能感知執行進度。使得使用者可以知道當前在執行哪個元素,該元素的執行進度如何。從而確保整體的編排流程能夠給使用者最直接和友好的反映。

5.5 TOSCA模型

有了排程框架&外掛框架,剩下的就是配置檔案的語法了,目前主要的可借鑑語法就是AWS的Cloudformation和TOSCA語法。其中AWS-CFN是以資源初始化為中心的,而TOSCA的定義為TOSCA is a specification that aims to standardize how we describe software applications and everything that is required for them to run in the “cloud”,可見TOSCA是更加偏向於面向App的。鑑於容器技術的流行,越來越多的應用以獨立容器出現,不再強調需要傳統的VM。我們覺得模板語法使用TOSCA是個不錯的選擇。

實際上,在自動化的過程中,你會發現:模板的語法並不是關鍵點。只要能自動化,模板寫出來都不會相差太大,所以關鍵還是看自動化能力。這個就好比程式語言的選擇,Java和Go,寫二叉樹遍歷不會在意是用for還是用while。各種程式語言的主要區別在內建函式/庫上,所以在模板的語法上提供豐富的自動化便利性才是目的。這一點需要向AWS學習,它提供了很多的內建函式。

6 總結

在雲上,自動化其實是剛需,只有完成了自動化這個基座,才能構建出完整的雲生態。而編排作為一種高階自動化能力,需要負起推動雲生態走向完整的重任。是檢驗一個雲廠商實力的硬通貨。

華為PaaS團隊在雲上,特別是PaaS雲上的自動化&編排領域,有多年的探索和積累。在此希望能與業界一起分享並推動雲上編排領域的發展,使得在雲的使用過程中能帶來更好的使用者體驗,讓雲上自動化能真正如雲這個趨勢一樣無處不在。

如果有好的想法&建議,也可以跟我們交流。

本文作者:華為PaaS架構師 唐老師

點選關注,第一時間瞭解華為雲新鮮技術~

相關文章