基于 Kubernetes 的微服务部署即代码
在基于 Kubernetes 的基礎設施即代碼一文中,我概要地介紹了基于 Kubernetes 的 .NET Core 微服務和 CI/CD 動手實踐工作坊使用的基礎設施是如何使用代碼描述的,以及它的自動化執行過程。
如果要查看基于 Kubernetes 的基礎設施即代碼架構全圖,以及實現代碼,請回到文章基于 Kubernetes 的基礎設施即代碼。
本文,我們深入探討其中 微服務部署部分的“基礎設施即代碼”的實現原理。
一般來說,在一個團隊,CI/CD 軟件不會經常部署。與此不同,時常處于開發之中的微服務的則會經常部署。此外,在部署到集群之前,通常開發人員還需要在某個“本機”環境對其所開發的微服務進行預先測試和調試。于是,在工作坊的環境中,我們在設計微服務的“持續部署即代碼”時,也模擬正常的微服務開發情景進行了相關設計。
大體上,工作坊在部署微服務時,有如下幾個方面協同工作:
微服務所需的公用基礎設施
微服務本身在 Kubernetes 上的部署配置
微服務的 CI/CD 過程
其中“微服務公用基礎設施”部分的自動化原理在我們第一篇文章中已有介紹,這里主要介紹后兩者。
微服務的 Kubernetes 部署
之前介紹過,在需要部署微服務時,調用?dev-services?項目根目錄的?provision-services.sh?腳本文件將觸發微服務的部署。腳本中的實際過程,還是會使用微服務項目根目錄的?k8s.yaml?來完成部署。部署時,腳本還是會利用之前介紹過的模板引擎傳入變量文件。
也就是說,用于部署工作坊中的微服務的 Kubernetes 資源文件都是以單個?k8s.yaml?文件的形式在各個微服務自己的代碼倉庫中維護的。這體現出“微服務自己知道如何部署自己”的自助原則。工作坊的微服務大致可分為兩類,一類是純后臺服務,另一類是提供 Web 界面的服務。維護微服務的團隊可根據需要自行定制用于在 Kubernetes 集群上部署它自己的資源文件。如果使用 kustomize,還可以以這個文件為入口,利用嵌套、變量等功能編寫更易于維護的 Kubernetes 資源文件。
微服務的 CI/CD 過程
工作坊中的微服務,它們的 CI/CD 過程同樣是由微服務自身所主導的。在上一篇文章基于 Kubernetes 的 CICD 基礎設施即代碼中我們介紹過微服務的部署流水線在 Jenkins 啟動之后就已經內置創建好了。但實際上流水線雖然創建好了,但流水線中運行的內容卻確實是由微服務自己控制和維護的。
這得益于 Jenkins 中基于 Jenkinsfile 的“流水線即代碼”技術。簡單來說,Jenkins 在運行流水線之前,會先去微服務代碼庫下載這個?Jenkinsfile?文件,再根據其中的內容決定如何運行流水線。查看各個微服務的代碼庫就會發現,它們的根目錄都存在一個?Jenkinsfile,雖然整體結構都差不多,但具體細節還是有一些差異的。
在?Jenkinsfile?中,我們聲明了微服務持續集成和持續部署的幾個典型階段:
檢出代碼
編譯應用
生成新版容器鏡像
部署新版容器鏡像
其中,上述第 2 步要求 Jenkins 具有支持 .NET Core SDK 的運行器(Slave)節點?dotnet;而第 3、4 步則要求 Jenkins 具有支持?kubelet?和?docker?的節點?image-builder。而它們,則是由 Jenkins 中的 Kubernetes 插件提供的支持。當流水線運行到這些步驟時,插件將負責按需地在 Kubernetes 集群上啟動具有這些功能的 Slave 節點。具體的啟動方法(比如,要使用的鏡像、要掛載的存儲等)都在“CICD 基礎設施即代碼”的過程中被自動寫入。
雖然在工作坊中,我們各個示例微服務的流水線的結構都大致類似;但在實際項目中,有了上述特性的支持,各個團隊可以自己定制自己的微服務的流水線形態。舉例來說,在上述第 3 步,生成容器鏡像時,會用到?Dockerfile。與?Jenkinsfile?一樣,其中調用的?Dockerfile?也同樣是自己維護的。因此,微服務團隊能夠很輕松地對?Dockerfile?進行定制,即使要使用不同的編程語言平臺也都能輕松掌控。
在現在這種體系下,微服務團隊對自己的 CI/CD 過程幾乎具有完全的掌握能力。
總結
在部署微服務的公用基礎設施及微服務本身的過程中,我們也結合使用了不同的自動化技術:
借助 Pod 附加執行(exec),可以直接在容器中執行程序。我們在 SqlServer 部署完成之后,向其中導入數據庫結構和種子數據時用到了這種技術
借助 Jenkins 上的 Kubernetes 插件定制 Jenkins 按需啟動的運行器(Slave)節點的運行
使用 Dockerfile 自由定制運行微服務所用的容器
使用 Jenkinsfile 配合由 Jenkins 提供的流水線和 Groovy 腳本語法可以輕松實現“流水線即代碼”
作為這一系列的最后一篇,這里也簡單回顧一下工作坊對“基礎設施即代碼”的實踐。目前,這個系列基本上涵蓋了從 CI/CD 基礎設施,到微服務的持續部署的兩個關鍵環節,這也是開發團隊經常會打交道的兩個環節。工作坊的場景相對比較簡單,并沒有實現諸如存儲、數據庫遷移和流量切換等高級話題,也沒有考慮安全性和與周邊工具的集成等領域,更沒有涉及 Kubernetes 集群本身以及它可能依賴的基礎平臺的更廣泛意義上的“基礎設施即代碼”。所以,如果希望把工作坊的實踐應用到實際項目中,還需要經過一系列改進。
基于“基礎設施即代碼”的實踐,可以直接把能夠運行的基礎設施配置代碼本身當作操作文檔。這一思想不僅有助于快速而可靠地構建基礎設施,它還能夠讓開發人員擁有更多靈活性,促進跨部門協作時關于職責劃分的新討論,最終有助于團隊間能力的融合,共同組建 DevOps 能力。
作為拓展素材,我推薦學習基礎設施即代碼和 Kubernetes Patterns 兩本書(可直接從 Red Hat 下載)。前者深入介紹了“基礎設施即代碼”實踐過程中的各方面設計考慮,后者詳細探討了常見的基于 Kubernetes 的操作技巧和設計方法。
相關文章:
基于 Kubernetes 的基礎設施即代碼
基于 Kubernetes 的 CICD 基礎設施即代碼
云原生
(譯)An introduction to Kubernetes
程序員修神之路--kubernetes是微服務發展的必然產物
深入探究Kubernetes - 初識容器
使用Helm將ASP.NET Core應用程序部署到Kubernetes容器集群
Kubernetes攻略之新手上路
Hello Kubernetes快速交互實驗手冊
十分鐘了解Kubernetes
原文地址:https://blog.jijiechen.com/post/microservice-delivery-as-code-on-kubernetes/
總結
以上是生活随笔為你收集整理的基于 Kubernetes 的微服务部署即代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3分钟搞懂前后端开发的区别
- 下一篇: .NET ORM FreeSql 第一个