在Kubernetes環(huán)境中采用Spinnaker的意義
Spinnaker是最初由Netflix設(shè)計和開發(fā)的開源多云連續(xù)交付工具。它有助于將應(yīng)用程序部署到各種云提供商,例如Google Cloud Platform(GCP),Amazon Web Services(AWS)和Microsoft Azure。
該博客的目的是幫助開發(fā)人員,架構(gòu)師和商業(yè)從業(yè)人員了解采用Kubernetes環(huán)境時使用Spinnaker的重要性。您將了解:
- Spinnaker在Kubernetes環(huán)境中的作用
- 在Kubernetes環(huán)境中使用Spinnaker
- 了解Spinnaker的架構(gòu)
- 使用Spinnaker設(shè)計持續(xù)交付管道
- 解釋Spinnaker管道工作流程
- 使用Spinnaker設(shè)計持續(xù)交付管道的最佳實踐
Spinnaker在Kubernetes環(huán)境中的作用
由于其在管理多容器環(huán)境中的簡便性,各種組織都采用Kubernetes。但是,Kubernetes不是像Jenkins或Spinnaker這樣的持續(xù)交付或部署工具。早期,Kubernetes生態(tài)系統(tǒng)缺少一個簡單的持續(xù)交付工具來自動構(gòu)建Kubernetes清單,測試這些工件并部署這些工件。Jenkins支持在Kubernetes集群上持續(xù)交付應(yīng)用程序,但是增加了復(fù)雜性。
Spinnaker支持在Kubernetes集群上部署應(yīng)用程序。它簡化了此過程,并幫助組織在Kubernetes集群上部署了生產(chǎn)級的構(gòu)建工件。
Spinnaker還通過其圖形用戶界面(GUI)用于管理Kubernetes集群上部署的應(yīng)用程序。可以編輯和更新Kubernetes清單文件,以提供動態(tài)編輯Kubernetes特定屬性的功能。借助Spinnaker GUI,您還可以監(jiān)控Kubernetes對象的運行狀況。
在Kubernetes環(huán)境中使用Spinnaker
Spinnaker得到了各種云提供商的支持,例如App Engine,Amazon Web Services(AWS),Azure,Google Cloud Platform(GCP),Cloud Foundry,Oracle和Kubernetes。在云上將Spinnaker與Kubernetes一起安裝時,它將提供Kubernetes本機,基于清單的部署。Spinnaker使用一個帳戶對Kubernetes集群進行身份驗證。
在Kubernetes環(huán)境中Spinnaker的關(guān)鍵功能是應(yīng)用程序管理和應(yīng)用程序部署。應(yīng)用程序管理功能有助于管理和查看Kubernetes集群對象。可以使用Spinnaker在Kubernetes對象上執(zhí)行各種操作,例如擴展,縮小,回滾和前進。Spinnaker的此功能有助于從單個點(即Spinnaker GUI)管理多個Kubernetes集群。
Spinnaker的應(yīng)用程序部署功能用于在Kubernetes集群中部署各種對象。Spinnaker在Kubernetes集群中部署應(yīng)用程序時支持各種部署策略,例如Blue/Green,滾動更新,canary部署等。要執(zhí)行應(yīng)用程序部署,Spinnaker使用管道和階段。借助Spinnaker管道,您可以創(chuàng)建持續(xù)的交付流程,以將代碼從源代碼管理工具自動部署到Kubernetes集群。您還可以使用Spinnaker階段在將任何內(nèi)容部署到生產(chǎn)Kubernetes集群上之前執(zhí)行代碼驗證。
了解Spinnaker的架構(gòu)
Spinnaker由獨立的微服務(wù)組件組成。下面提到其中一些組件:
- Deck:提供與Spinnaker工具交互的用戶界面。
- Gate:充當(dāng)API網(wǎng)關(guān)。它將所有API請求傳遞給服務(wù)。
- Orca:處理各種臨時操作并管理管道及其階段。
- Clouddriver:云提供商。充當(dāng)Spinnaker與云提供商之間的集成點。
- Front50:保留應(yīng)用程序,管道和項目的元數(shù)據(jù)。
- Rosco:烘焙映像,然后將其部署在各種云提供商上。
- Igor:通過諸如Jenkins和Travis CI的持續(xù)集成平臺觸發(fā)管道。
- Echo:通過電子郵件,短信和Slack發(fā)送通知。它還負責(zé)傳入的Webhooks,例如Github Webhooks和Jenkins Webhooks。
- Fiat:充當(dāng)Spinnaker的授權(quán)服務(wù)。
- Kayenta:為Spinnaker提供自動化的金絲雀分析。
- Halyard:一種配置服務(wù),用于安裝,更新和配置Spinnaker。

使用Spinnaker設(shè)計持續(xù)交付管道
創(chuàng)建了一個持續(xù)交付管道,以在兩個不同的Kubernetes命名空間(即DEV和UAT)上部署Kubernetes清單和應(yīng)用程序構(gòu)建(docker鏡像)。要創(chuàng)建一個持續(xù)交付管道,您需要一個Helm Charts作為Kubernetes清單文件的模板,Spinnaker正在使用該清單創(chuàng)建最終可部署的Kubernetes清單工件。
您可以創(chuàng)建五個單獨的Spinnaker管道,如下所述:
- DEV-Kubernetes集群的YAML文件更改部署流水線:此管道用于在Kubernetes集群的DEV名稱空間上部署,觸發(fā)條件是Kubernetes清單文件發(fā)生了更改(dev.yaml)。
- UAT-Kubernetes集群的YAML文件更改部署流水線:此管道用于在Kubernetes集群的UAT名稱空間上部署,觸發(fā)條件是Kubernetes清單文件發(fā)生了更改(uat.yaml)。
- DEV – Docker鏡像–應(yīng)用程序部署流水線:此管道用于代碼更改后構(gòu)建Docker鏡像并部署在Kubernetes集群的DEV名稱空間上。
- UAT – Docker鏡像–應(yīng)用程序部署流水線:此管道用于代碼更改后構(gòu)建Docker鏡像并部署在Kubernetes集群的UAT名稱空間上。
- UAT-Jenkins手動Docker鏡像部署流水線:此管道用于代碼更改后構(gòu)建Docker鏡像并手動部署在Kubernetes集群的UAT命名空間上。它使用戶可以在UAT名稱空間上手動部署所需的應(yīng)用程序代碼(Docker鏡像)。上面提到的兩個Spinnaker管道分別在DEV和UAT名稱空間上自動部署代碼。它使用戶可以控制在UAT名稱空間上部署的應(yīng)用程序代碼(Docker鏡像)。
解釋Spinnaker管道的工作流程
計劃部署的Kubernetes清單文件和應(yīng)用程序代碼(Docker鏡像)現(xiàn)在應(yīng)該推送到GitHub存儲庫。
- 在GitHub上配置Webhook,自動將更改通知推送到Jenkins,Jenkins配置有作業(yè)以自動檢測GitHub中的應(yīng)用程序代碼更改。
- Jenkins作業(yè)獲取最新的應(yīng)用程序代碼更改并構(gòu)建Docker鏡像。使用Docker插件或者是原生的dockerCLI指令,Jenkins將新創(chuàng)建的鏡像推送到Docker Hub。
- 相應(yīng)的Spinnaker管道在自動觸發(fā)器的幫助下持續(xù)監(jiān)視Docker Hub注冊表。
- 在Docker Hub注冊表中獲取到最新的Docker鏡像后,您可以執(zhí)行Spinnaker管道觸發(fā)器并將相應(yīng)的應(yīng)用程序代碼(Docker鏡像)部署在Kubernetes集群的DEV/UAT名稱空間上。
讓我們詳細討論每個管道。
用于DEV和UAT的Kubernetes集群管道的YAML文件更改部署流水線
該Spinnaker管道包括四個階段-配置、Jenkins、Bake(清單)和Deploy(清單)。
- 配置階段是一個自動觸發(fā)器,配置為檢測dev.yml 或者 uat.yml文件中的提交更改。如果這些文件中有更改,則將開始執(zhí)行此管道。
- Jenkins階段向Jenkins作業(yè)發(fā)送觸發(fā)器,該作業(yè)在現(xiàn)有的Kubernetes集群上執(zhí)行一組Linux命令(構(gòu)建鏡像指令),以檢測最近部署的Docker鏡像標簽。此階段確保不使用latest的Docker鏡像標記和更新現(xiàn)有的Docker鏡像。之后,Jenkins階段將現(xiàn)有的Docker映像標簽記錄在一個文本文件中(例如,build_uat_yml.properties)。
稍后,文本文件將傳遞到下一個Spinnaker階段,即Bake(清單)。
- 此階段配置有一個模板,該模板包含鏡像標簽的變量為“ {{.Values.image.tag}}”。spinnaker用build_uat_yml.properties/ build_dev_yml.properties文件中存在的鍵值替換此變量值。
然后,Spinnaker創(chuàng)建一個最終的構(gòu)建工件,其中包含清單值和Jenkins作業(yè)記錄的Docker鏡像標簽值。
- 部署(清單)階段使用此最終工件,并將此清單構(gòu)建工件部署在DEV/UAT名稱空間上,而無需更新現(xiàn)有Docker鏡像標簽。
DEV – Docker鏡像-應(yīng)用程序部署管道
此Spinnaker管道包括三個階段:配置,烘焙(清單)和部署(清單)。
- Configure階段配置有自動觸發(fā)器,以在Docker Hub注冊表中檢測新推送的Docker映像。
- Bake(Manifest)階段用于根據(jù)現(xiàn)有的Helm模板和已定義的dev.yml值文件創(chuàng)建Kubernetes清單文件。最終工件是使用帶有“最新”標簽的Docker鏡像創(chuàng)建的。
- 部署(清單)階段使用最終工件,并將其部署在已配置的Kubernetes集群的DEV名稱空間中。
UAT – Docker鏡像-應(yīng)用程序部署管道
該管道使用與上述相同的流程從現(xiàn)有的Helm模板和已定義的uat.yml值文件創(chuàng)建最終工件。唯一的區(qū)別是,在此階段,將自動觸發(fā)器配置為“ DEV – Docker鏡像–應(yīng)用程序部署”管道的執(zhí)行結(jié)果。“ DEV – Docker鏡像–應(yīng)用程序部署”管道的成功執(zhí)行/完成將開始管道的執(zhí)行。如果“ DEV-Docker鏡像-應(yīng)用程序部署”管道的執(zhí)行進入失敗狀態(tài),則該管道將永遠不會開始執(zhí)行,這將防止在Kubernetes集群的UAT名稱空間中部署失敗的工件。
UAT-Jenkins手動Docker鏡像部署管道
該管道可幫助用戶根據(jù)需要在UAT名稱空間中部署舊的Docker鏡像工件。用戶提供所需的Docker鏡像標簽,該標簽將通過參數(shù)化的Jenkins作業(yè)進行部署,該作業(yè)會創(chuàng)建文本文件(例如build.properties),并將用戶提供的Docker鏡像作為內(nèi)容。例如– IMAGE_TAG = v15。這里,v15是用戶提供的鏡像標簽。
將build.properties文件作為輸入傳遞到Spinnaker管道。
- 烘烤(清單)階段配置有一個模板,該模板包含鏡像標簽的變量為“ {{.Values.image.tag}}”。Spinnaker將該變量值替換為build-properties文件中存在的鍵值。然后,Spinnaker將創(chuàng)建最終的構(gòu)建工件,其中包含清單值和用戶傳遞的Docker鏡像標簽值。
- 部署(清單)階段使用此最終工件,并通過使用提到的標簽拉出相應(yīng)的Docker鏡像,將該清單構(gòu)建工件部署在UAT名稱空間上。
使用Spinnaker設(shè)計持續(xù)交付管道的最佳實踐
- Spinnaker提供的GUI允許用戶執(zhí)行應(yīng)用程序管理,例如通過GUI直接編輯Kubernetes對象YAML定義文件。但是大多數(shù)時候,源代碼管理工具用于存儲和版本化Kubernetes對象YAML定義文件。在這種情況下,通過Spinnaker GUI完成的任何YAML文件更改都將在下一次管道部署期間被覆蓋。因此,強烈建議對存儲在源代碼管理工具中的YAML文件進行更改,而不是直接通過Spinnaker GUI編輯YAML文件。
- 使用Docker鏡像推送而不是GitHub推送觸發(fā)器或Jenkins作業(yè)觸發(fā)器配置Spinnaker管道觸發(fā)器。這種做法避免了構(gòu)建和驗證系統(tǒng)的重組。
- 不要在Docker鏡像中烘焙Secrets。應(yīng)在運行時使用云提供商的密鑰管理服務(wù)加載機密。
- 使用審核日志來確定已執(zhí)行的操作,執(zhí)行的時間以及執(zhí)行的人。最佳實踐是通過將Spinnaker與GCP Stackdriver和AWS CloudWatch等云監(jiān)控服務(wù)集成來生成Spinnaker審核日志。
- 通過Kubernetes對象YAML文件在Kubernetes集群上部署Docker鏡像。在YAML文件中定義Docker鏡像有兩種方法,即通過定義鏡像標簽或定義鏡像摘要。最佳實踐是通過摘要在YAML文件中定義Docker鏡像。這種方法將確保部署的Docker鏡像始終指向相同的內(nèi)容。
Spinnaker是一個強大的持續(xù)交付工具,用于自動在Kubernetes集群上部署應(yīng)用程序。Spinnaker管道也可以配置為在執(zhí)行實際部署之前對構(gòu)建工件執(zhí)行單元測試和功能測試。因此,Spinnaker可以幫助組織更快地將代碼獲取到生產(chǎn)環(huán)境。