摘要:容器建立或應用部署配置繁雜且存在變數,為了確保系統靈活性和復用性,本文將重點放在如何以模板引擎為核心,建構統一的容器部署框架。
在大家使用容器的過程中,都會有一種經歷,容器配置項眾多大概有四五十項,且需要一定技術背景才能理解。部署過程中,使用者常常因為對於配置參數缺乏理解,導致容器啟動,應用部署或升級時遇到各種各樣的問題。使用者如何加快對不同參數的理解並且能夠根據不同的應用類型和場景,做相應擴展,本文將重點放在探討和解決這些問題上。
容器創建或應用部署配置繁雜且存在變數,為了確保系統靈活性和復用性,決定以模板引擎為核心,建構統一的容器部署框架。本文重點在於如何建置模板引擎以及以模板引擎為核心建置容器部署框架的運作原理。在模板引擎中,符合一定格式規範的文件是基礎,對於可能有變化或根據部署流程需要變化的位置,使用參數標識站位。模板檔結尾追加參數標識的定義,用來執行參數標識語意轉換。模板或參數標識的具體內容,可以透過特定設定檔讀取或接收客戶端請求參數。
模板引擎由模板定義,模板解析,模板轉換,模板執行四個模組組成。範本定義依賴容器叢集的管理框架,是非可執行的檔案。模板解析器負責把模板一分為二:一部分形成非可執行的部署模板;一部分形成部署模板中參數的定義說明,參數定義說明透過唯一的站位標識符與部署模板中的站位標識符一一對應。模板轉換器接受參數值,結合解析器中產生的部署模板,參數值標識與模板中佔位標識關聯,參數值透過佔位標識替換,產生可執行檔。模板執行器負責根據模板創建對象,一般有調度框架或容器引擎承擔。
模板引擎的執行原理如圖1所示:
#範本定義包含兩類資訊:部署範本;參數識別。
以kubernetes的部署範本為例,部署範本涉及到4種不同類型定義,分別是:資源、版本、資訊說明、資料配置。
資源:表示kubernetes中定義的物件類型。
版本:表示物件的版本
資訊說明:包含物件名稱,標籤,註解等,為物件尋找或排程提供索引。
資料配置:負責定義容器處於運行狀態遵循的標準,包括連接埠、環境變數、資源、調度、健康檢查等。
參數標識由6個屬性組成,分別是parameters、name、description、displayname、value、type。
parameters:參數定義起始標誌
#description:參數的提示訊息
displayname :具體語意資訊
name:與引用參數名稱對應,表示描述資訊為對應的參考參數
value:參數預設值
type:代表不同的樣式,客戶端依照type類型,呈現具體樣式
以kubernetes中的namespace物件為例,模板的完整定義如下程式碼所示:
apiVersion: v1kind: Namespacemetadata: name: ${name } --- {"parameters": [ { "description": "命名空间", "displayName": "命名空间", "name": "name", "value": "", "type": "String" } ]}
由上述程式碼中,包含兩部分內容:部署模板,參數說明。
部署範本如下程式碼區塊所示:
apiVersion: v1kind: Namespacemetadata: name: ${name }
部署範本定義物件建立的所有內容,範本中欄位意義說明如下:
apiVersion :通用選項,定義版本資訊
Kind:定義物件類型,區別不同的物件
Metadata:定義部署時指定的參數鍵值對
${}:表示參數的參考值,即可取代參數
參數標識,定義了客戶端動態取得參數後的展現形態,下方程式碼範例參數識別定義:
{"parameters": [ { "description": "命名空间", "displayName": "命名空间", "name": "name", "value": "", "type": "String" } ]}
參數標識定義統一的格式。透過語意轉化,把繁雜的配置轉變為使用者易於理解的方式。客戶端讀取到Parameters標識,透過模板解析器抽象化可輸入參數,展示所需的Form表單,提供使用者輸入的功能。
模板定義由對Kubernetes或Docker熟悉的專業人員編寫。可根據具體的業務場景,進行即時和動態調整,確保部署的靈活性和擴展性。同時,系統根據不同的對象,提供基礎模板。使用者在具備一定知識背景的基礎上同樣可以進行模板製作和維護。
透過輸入輸出流取得模板中參數標識,進行語意轉化,得到易於理解的配置參數。模板解析器的工作原理如下圖2所示:
客戶端發起建立物件請求,服務端收到請求以後,會根據請求的物件類型自關聯基礎範本。透過檔案流的方式,讀取基礎模板,讀取過程中以Parameters標誌為起始點,取得參數描述資訊。解析完成,參數以Json字串的方式傳回客戶端,客戶端根據Json字串,動態產生需要使用者填寫的表單,使用者根據表單內容完成參數輸入操作。
模板解析器重點解析模板定義中的參數標識。透過語意轉化,訊息提示,形成易辨識的輸入項。對用戶而言,解析完成日後能夠屏蔽繁雜的技術指標,用戶的關心點由技術轉變到業務配置。最大程度降低使用成本,增加易用性。
模板轉換器是模板引擎的核心,重點解決三個問題:取得部署模板,參數與值轉換,建構可執行檔。客戶端把模板解析器中參數賦予真實值,傳遞到服務端,服務端讀取模版內容,遇到參數的標誌位結束,把讀取的內容透過文件流寫到新文件,產生部署文件,接著用參數值對部署檔案中的參數做關聯替換,產生最終的可執行檔。模板轉換器的工作原理如圖3所示:
#取得部署範本:由範本定義可知,範本中包含兩部分內容:部署範本與參數識別。模板轉換器首先需要部署模板,透過檔案流的方式讀取模板定義中的部署模板,讀取過程中以parameters標識符分割,取得部署模板。
参数值转化:核心是解决参数与占位符关联和赋值问题。模板转换器通过模板参数定义的name属性key关联,模板转化器拿到参数值以后,获取参数值对应的key(key在部署模板唯一),并且根据key,替换部署模板中占位标识,完成参数替换。
构建可执行文件:通过文件流的方式,把前两部转化的字符流输出到文件,构建出可执行文件。
模板转换器执行以后,生成的可执行文件如下所示:
apiVersion: v1kind: Namespacemetadata: name: ruffy
模板执行器接收可执行的部署文件,对于文件中定义的部署类型进行解析,拆分成若干个可执行任务。容器引擎根据收到的任务执行操作,最终协同完成部署工作。模板执行器往往依赖于容器调度和执行引擎。以Kubernetes容器编排框架为例,模板转化器生成的可执行文件,以字符流的方式传输到Kubernetes的Server端,Kubernetes根据传入文件,自动解析文件内容,并且做出相关操作。对于模板引擎而言,无论是Kubernetes还是Swarmkit都能够得到友好的支持。模板执行器的工作原理如图4所示:
範本執行器執行以後的結果如圖5所示:
透過模板引擎的方式,可以對容器的配置做靈活使用,無論是容器部署還是其他資源主題物件創建,都有對應模板支援。模板處理引擎不需要根據模板的變動而不斷的修改程式碼。同時,使用者可以從自己理解的語義關注配置訊息,不需要關注具體技術細節和實現方式,簡化操作行為,降低使用成本。
以上是PHP設計模式之基於模板引擎的容器部署框架的詳細內容。更多資訊請關注PHP中文網其他相關文章!