Infrastructure as Code――Kubernetes一鍵編排實踐
在2017雲棲大會・深圳峰會上,來自阿裏雲的王升功分享了《Infrastructure as Code――Kubernetes一鍵編排實踐》。他首先從開發者角度分析了基礎設施在交互上麵臨的挑戰,提出了基礎設施即代碼的解決方案。然後,它主要分享了資源編排服務――IaC運行平台以及Kubernetes一鍵編排的具體實踐過程。最後通過實際應用場景分享了一鍵編排實踐的效果。
?
以下內容根據直播視頻整理而成。
?
從開發者視角看基礎設施
我們經常拿IDC和雲計算作對比,以此來襯托雲計算的變化。IaaS、PaaS、SaaS都是從交付方麵來闡述其所做的事情,IaaS是基礎設施作為服務來交付,PaaS是把平台作為服務交付,SaaS是軟件直接作為服務交付。對於開發人員來說,我們之前可能有專門的IDC,有專門的運維人員負責基礎設施的維護(選IDC、網絡、機器)。雲計算的出現,尤其是基礎設施作為服務的一個交付手段的時候,開發人員有時候也需要直接麵對基礎設施的維護。這就給我們帶來了新的挑戰:80%的關鍵係統或服務的異常中斷是由人為原因引起;50%的係統異常是由變更、配置、發布、人工操作導致。解決上述問題的核心理念是,盡量減少人參與運維流程中所做的事情。我們的解決方案是自動化編排:取消手工操作讓應用部署流程自動化;降低運維複雜度讓係統自動對齊業務需求。
Infrastructure as Code?基礎設施即代碼
從開發人員的角度來說,最熟悉的流程是:寫代碼、編譯、調試、部署、運行,整個流程會使開發人員的安全感比較高。對於基礎設施來說,特別是像如今基礎設施都是通過服務來交付的情況,而且這些服務都是由像阿裏雲這樣的第三方雲服務商交付的情況,我們的安全感可能會缺失。如果讓基礎設施也像代碼一樣在開發人員的掌握中,那麼缺失的安全感就能夠找回。阿裏雲提供的所有基礎設施都提供了Open API方式,所以可以寫代碼去操作。就像可以寫代碼申請內存空間一樣,我們也可以通過寫代碼申請一個ECS、SLB。上圖中所示的流程也適用於基礎設施。
資源編排服務?IaC運行平台
阿裏雲通過資源編排服務實現上述理念。上圖中有三個核心概念:模板,JSON格式的文本文件,它其實對應上述流程中的代碼部分,使基礎設施變成可以編寫的代碼,編寫時不需要關注資源如何調用Open API等事情;ROS,編排引擎,它本身也通過Open API的方式向外提供服務,它可以通過用戶定義的模板創建一係列的資源;資源棧,即阿裏雲資源集合,未來對資源的管理都可以以資源棧為單位進行集中管理。整個編排過程是一個全自動的過程。
如何實施基礎設施即服務的過程呢?如上圖所示,首先我們需要對我們的係統進行架構設計,比如如果我們的架構是網站則會涉到負載均衡、RDS資源。接著是模板開發,將設計好的架構編程為模板,模板有足夠的能力去表達架構,比如包含的資源,資源之間的關係。將創建好的模板提交給ROS,ROS會根據模板創建資源棧,其出口是一堆資源棧的集合,後期對資源的管理都可以基於資源棧來進行,包括更新、升級。
上圖是ROS最簡單的編排模板,第一行聲明了編排模板的版本。Resources部分,定義了名為k8s_master的資源,類型為ECS實例,並且定義了實例的類型、鏡像和安全組。當我們把上述代碼提交給編排引擎之後,編排引擎就能根據上述代碼創建出一台符合我們要求的ECS實例。
通過資源編排在雲端交付開源軟件
開源軟件交付麵臨的新問題包括:大計算時代的大型分布式係統架構複雜,角色眾多,如何部署?需要與雲計算服務整合進行全局優化,如何獲取和配置資源?敏捷和DevOps,如何應對快速頻繁的部署與銷毀?資源編排服務的解決方案:通過編排模板定義雲資源的需求和配置;通過CloudInit、Chef進行軟件部署;通過全自動的編排引擎進行無人值守的係統交付。
Kubernetes(k8s)
Kubernetes(k8s)的靈感來自於Google Borg,Borg這個係統在Google是做數據中心層麵的管理,類似於阿裏雲的伏羲。而Kubernetes其目的是做容器化應用的自動部署、擴展和管理,社區成員包括Google、IBM、微軟、VMWare、Docker等多家公司。如何通過阿裏雲的資源部署一個最簡單的Kubernetes集群?
Kubernetes部署規劃
上圖是一個非常簡單的集群,有三個角色:一個Kubernetes Master,兩個Node節點。它們跑在三個ECS上,屬於一個獨立的VPC網絡,隻有一個子網VSwitch。
首先我們要規劃我們的網絡,所有的資源都放在VPC網絡下麵,VPC網絡在安全性和可擴展性方麵都比傳統網絡要好。最上方通過模板定義了一個VPC模板,類型為阿裏雲ECS VPC,設置了網段、名字。然後創建VSwitch,環境複雜時可以創建多個子網。最後創建SecurityGroup來管理網絡規則。從上述流程可以看出,通過模板來創建VPC網絡環境,會使問題變得簡單、清晰。
緊接著,我們為K8sMaster創建ECS,類型為ECS實例,ImageId可以參數化,給一個子網地址,並指定係統盤類型是SSD。
我們需要在實例中部署Kubernetes的組件,最上方為創建實例時用戶指定的數據。中間框中的腳本內容詳細展示了部署的過程。
Node角色的創建如上圖所示。Node的數量是不確定的,我們需要有一種方式能創建多台Node。ECS InstanceGroup的作用是通過MaxAmount和MinAmount兩個值控製實例的個數,當需要確定數量資源的時候可以將這兩個值設為一致。其餘屬性和創建Master時是基本一致的。
上圖是Node節點上部署的腳本,作用是在Node節點啟動後,在其上部署Node節點所需要的kubelet、docker,以及進行基礎環境的配置。
執行編排
上文構建的模板已經實現了我們係統方方麵麵所需要的東西。上圖是輸入模板的頁麵,模板源除了直接輸入之外還可以指定url文件。這樣我們的模板開發完之後就可以放到一個OSS的地址上,其他人也可以通過這個地址創建、部署同樣的係統。
前一個頁麵點擊創建之後,就可以進入事件列表頁麵。通過模板部署應用的過程中,因為涉及到很多的資源,所以存在有很多事件。對於觀察者來說,更希望看到過程中的一些細節,從事件列表就可以實時監控到每一步正在進行的事件是什麼,並且可以獲知其狀態。
當所有的編排動作完成之後,可以進入到資源列表頁麵。這個頁麵可以看到整個應用被創建出來的資源細節。
上圖是阿裏雲官方提供的一些樣例模板,通過這些模板,我們可以部署Jenkins、docker_ddc等更複雜、更有用的係統。
應用場景:運行環境複製
模板除了有創建資源的用途、運維的用途、軟件交互的用途,還可以用於其他場景。比如,當我們實施DevOps的時候,希望有很多靠譜的環境(開發環境、集成測試環境、線上生產環境)。為了讓其保證一致,通過手工方式很難做到,但通過模板達到上述目的卻比較簡單。
類似的場景還有:在模板裏定義很複雜的VPC子網結構,做子網規劃;做DevOps流程實施;通過編排做資源的創建、刪除、規劃,做到係統自動擴容、縮容;以模板的形式向客戶交付可部署的應用模板。
?
本文介紹的部署Kubernetes集群的編排模板和一個快捷的部署方法已經整理成雲棲社區的文章,供參考:《10分鍾自動部署Kubernetes1.6.1集群》最後更新:2017-05-09 13:01:52