如何使用 Spinnaker 和 Kubernetes 進行數據庫變更發佈

將應用程序部署到 Kubernetes 時,有很多選擇。像 Helm 和 Ksonnet 這樣的工具使得打包應用程序並將其部署到多個 Kubernetes 環境變得非常簡單。但是,這些工具只能解決部分問題。部署到生產很少像 helm install my-chart 一樣如此簡單。他們可以涉及多個步驟,並保證所涉及的應用程序正常運行。我從 Kubernetes 用戶那裏聽到的一個最常見的問題是“如何部署我的數據庫變更?”。這是我一遍又一遍地問自己的問題。在 Skuid ,我們花了很多時間試圖找出最安全和高可用的方式來執行這些數據庫遷移,作爲我們部署 Pipeline 的一部分。我們寫的代碼來做到這一小步在我們的 Pipeline 步驟是很複雜的。

使用 Spinnaker ,我們能夠使這一步驟可重複,安全和可靠。在本教程中,我將解釋如何設置一個簡單的部署 Pipeline 來運行我們的遷移,並部署我們的應用程序,而不寫任何複雜的代碼。

本教程的目標是展示使用 Spinnaker 爲 Kubernetes 構建整體部署 Pipeline 是多麼容易。這個例子雖然是個簡單的 Demo,但是卻演示瞭如何在部署過程中執行多個步驟,而無需爲生產中運行的每個應用程序重複"造輪子"。

安裝程序

對於本教程,我們將使用 Go 編寫的示例應用程序。此示例應用程序包含一個簡單的 API 服務器以及一個用於上下遷移數據庫的命令。我們將設置一個簡單的持續部署 Pipeline ,將新的 Docker 鏡像推送到鏡像註冊中心(Quay)時執行兩項操作:

1. 使用新鏡像運行數據庫遷移

2. 部署新的 API 服務器

這個示例證明使用 Spinnaker 可以輕鬆實現整個部署流程的自動化,並確保我們以安全可重複的方式進行部署。

作爲參考,我們將要部署的鏡像是通過 Server 命令在3000端口上發佈一個 API 服務器。要執行數據庫遷移,我們將使用相同的 Docker 鏡像,但不是執行該 Server 命令,而是使用該 Migrate 命令。以下是我們示例應用程序的 --help 輸出:

用法:

  • golang-sample-service [command]

可用命令:

  • Help 有關任何命令

  • Migrate 幫助執行數據庫遷移

  • Server 啓動應用程序服務器

部署 API 服務器

首先,我們將使用 Spinnaker 建立一個簡單的部署流程。這個 Pipeline 將把一個新的鏡像推送到註冊中心。

首先,我們需要配置觸發器:


然後,我們將通過單擊“添加階段”並選擇“部署”來配置部署階段。


從那裏,我們可以添加一個新的服務器組,使用觸發鏡像,並在“容器”部分下配置它的端口:



現在這些步驟已經完成,我們可以通過導航返回到“Pipeline”選項卡並執行 Pipeline 來測試我們的 Pipeline。這將把我們服務的第一個實例部署到我們的目標 Kubernetes 帳戶。


然後,我們可以通過導航到“Clusters”選項卡並查看我們的服務是否健康(由服務器組下的綠色實例表示)來驗證我們的服務是否正在運行。


數據庫升級

我們教程的下一步將是將我們的數據庫變更發佈添加到我們的 Pipeline 中。爲此,我們將利用 Run Job 階段,並將其作爲部署我們的應用程序的先決條件。這個階段將通過 Docker 鏡像觸發我們的 Pipeline,並運行一個 Kubernetes Pod 來執行數據庫遷移。如果 Pod 成功退出,該階段將被視爲成功,並進入我們現有的部署階段。

首先,我們將添加 Run Job 階段並對其進行配置。我們不需要爲這個工作公開任何端口,但是我們需要添加一些額外的環境變量,以便我們的遷移框架知道如何連接到我們的數據庫。對於本教程,我簡單地連接到集羣內 Postgres 數據庫,但是您的應用程序可以輕鬆連接到 AWS 或其他數據庫解決方案中的 RDS 實例。

我們將通過添加一個 Run Job 階段開始,就像我們添加部署階段一樣:


然後,我們將通過選擇觸發鏡像來配置我們的工作,覆蓋“參數”並在“容器”部分下添加我們的環境變量:

注意:遷移數據庫的命令是 migrate up --dir={migrations-directory}



一旦我們的作業配置好了,我們所要做的就是配置部署階段,依靠 Run Job 階段的成功,通過導航到部署階段並從 “depends on” 部分選擇 “Run Database Migrations”:


再次,我們可以執行我們的 Pipeline,現在,在部署階段之前,我們將運行數據庫遷移作爲部署 Pipeline 的一部分。


結論

以安全可靠的方式將軟件交付給生產是一個難題。更糟糕的是,今天可用的工具只能解決一小部分問題。 Spinnaker 是一種減輕這種負擔的方法,而不必像 Jenkins 一樣將多個腳本和系統與 CI 平臺粘合在一起。通過使用 Spinnaker Pipeline,我們可以使用現成的普通階段來構建簡單或複雜的部署,以滿足您的公司的需求。

原文鏈接:

https://blog.spinnaker.io/deploying-database-migrations-with-spinnaker-and-kubernetes-6e6761f9d28a

作者:靳日陽,JFrog 研發工程師

具有多年軟件開發經驗;對Java主流技術、前沿框架都具有豐富的開發經驗;擅長Linux服務器,對優化,部署等有深入研究,熟悉Jenkins,持續集成及交付,DevOps等。

歡迎轉載,但轉載請註明作者與出處。謝謝!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章