Helm 有助於簡化 Kubernetes 應用程式佈署,透過 Chart 封裝 Kubernetes 資源定義。文章首先說明如何為每個微服務建立 Helm Chart,並設定 GitHub Pages 作為 Helm 倉函式庫,接著示範如何在 watchlist Chart 中參照其他 Chart 作為依賴。文章也提供健康檢查的程式碼範例,包含使用 curl 以及 Jenkins HTTP Request Plugin 的進階用法,確保服務正常運作。最後,文章詳細介紹 Jenkins X 的 CI/CD 流程,包含自動化建置、佈署到預覽環境與生產環境、ChatOps 的使用以及 GitOps 方法的應用,並提供相關的 Groovy 指令碼範例說明 Jenkins X 的自動化流程。
使用 Helm 管理 Kubernetes 中的微服務
在前面的章節中,我們已經瞭解瞭如何將微服務容器化並佈署到 Kubernetes 叢集。在本文中,我們將探討如何使用 Helm 來簡化微服務的管理。
建立 Helm Charts
首先,我們需要為每個微服務建立一個 Helm chart。Helm chart 是一個包含了 Kubernetes 資源定義的包,它可以幫助我們簡化應用程式的佈署和管理。
# 為每個微服務建立 Helm chart
helm create movies-loader
helm create movies-parser
helm create movies-store
helm create movies-marketplace
建立完成後,我們需要在每個 chart 的 values.yaml 檔案中定義相關的組態引數。
內容解密:
helm create命令用於建立一個新的 Helm chart。- 每個 chart 都包含了
templates目錄,用於存放 Kubernetes 資源定義的範本。 values.yaml檔案用於定義 chart 的預設值,可以在安裝 chart 時被覆寫。
組態 Helm 倉函式庫
接下來,我們需要將這些 chart 上傳到一個 Helm 倉函式庫中。這裡我們使用 GitHub Pages 作為 Helm 倉函式庫。
# 將 chart 封裝並上傳到 GitHub Pages
helm package movies-loader
helm package movies-parser
helm package movies-store
helm package movies-marketplace
# 將封裝好的 chart 上傳到 GitHub Pages
git add .
git commit -m "Update Helm charts"
git push origin main
然後,我們需要將 GitHub Pages 組態為 Helm 倉函式庫。
# 新增 Helm 倉函式庫
helm repo add watchlist https://mlabouardy.github.io/watchlist-charts
內容解密:
helm package命令用於將 chart 封裝成.tgz檔案。- 將封裝好的 chart 上傳到 GitHub Pages 後,我們可以使用
helm repo add命令將其新增為 Helm 倉函式庫。
在 watchlist Chart 中參照其他 Charts
現在,我們可以在 watchlist Chart 的 Chart.yaml 檔案中參照其他 charts。
apiVersion: v2
name: watchlist
description: Top 100 iMDB best movies in history
type: application
version: 1.0.0
appVersion: 1.0.0
maintainers:
- name: Mohamed Labouardy
email: mohamed@labouardy.com
dependencies:
- name: mongodb
version: 7.8.10
repository: https://charts.bitnami.com/bitnami
alias: mongodb
- name: movies-loader
version: 1.0.0
repository: https://mlabouardy.github.io/watchlist-charts
- name: movies-parser
version: 1.0.0
repository: https://mlabouardy.github.io/watchlist-charts
- name: movies-store
version: 1.0.0
repository: https://mlabouardy.github.io/watchlist-charts
- name: movies-marketplace
version: 1.0.0
repository: https://mlabouardy.github.io/watchlist-charts
內容解密:
- 在
Chart.yaml檔案中,我們定義了watchlistChart 的依賴項,包括mongodb和其他微服務的 charts。 - 每個依賴項都指定了名稱、版本和倉函式庫地址。
執行健康檢查
在佈署完成後,我們需要執行健康檢查來驗證微服務是否正常運作。
// 定義取得服務 URL 的函式
def getUrl(){
switch(env.BRANCH_NAME){
case 'preprod':
return 'https://api.staging.domain.com'
case 'master':
return 'https://api.production.domain.com'
default:
return 'https://api.sandbox.domain.com'
}
}
// 新增健康檢查階段
stage('Healthcheck'){
sh "curl -m 10 ${getUrl()}"
}
內容解密:
getUrl()函式根據當前 Git 分支名稱傳回相應的服務 URL。- 在
Healthcheck階段,我們使用curl命令對服務 URL 發起請求,以驗證服務是否正常運作。
使用 Jenkins HTTP Request Plugin
為了執行更進階的 HTTP 請求,我們可以安裝 Jenkins HTTP Request Plugin。
// 使用 httpRequest DSL 物件發起 HTTP 請求
stage('Healthcheck'){
def response = httpRequest getUrl()
def json = new JsonSlurper().parseText(response.content)
def version = json.get('version')
if (version != '1.0.0') {
error "Expected API version 1.0.0 but got ${version}"
}
}
內容解密:
httpRequestDSL 物件用於發起 HTTP 請求,並取得回應內容。- 使用
JsonSlurper解析回應內容,並驗證服務版本號是否正確。
探索 Jenkins X
Jenkins X(https://jenkins-x.io/)是一種針對現代雲端應用程式在 Kubernetes 上的 CI/CD 解決方案。它簡化了組態流程,並充分利用了 Jenkins 2.0 的強大功能。同時,它還結合了 Helm、Artifact Hub、ChartMuseum、Nexus 和 Docker Registry 等開源工具,簡化了雲原生應用的建置流程。
Jenkins X 補足了 Jenkins 在持續交付和專案升級管理上的不足,特別是在預覽、測試和生產環境中執行於 Kubernetes 的專案。它採用 GitOps 來管理佈署到各個環境中的 Kubernetes 資源組態和版本。因此,每個環境都有自己的 Git 儲存函式庫,包含了所有 Helm 圖表、版本以及應用程式的組態。
遵循這種方法,Git 成為基礎架構即程式碼和應用程式碼的唯一真實來源。所有對期望狀態的變更都透過 Git 提交來完成。這樣一來,可以輕易追蹤變更歷史,並且在出現問題時快速回復變更。
安裝與設定 Jenkins X
首先,需要安裝 Jenkins X CLI,並根據作業系統選擇合適的安裝指令:http://mng.bz/20ZX。執行 jx version --short 來確認是否為最新穩定版本。
建立 Kubernetes 叢集
Jenkins X 執行於 Kubernetes 叢集上。如果使用的是主流雲端服務供應商(Amazon EKS、GKE 或 AKS),Jenkins X 提供了多種建立叢集的方法:
jx create cluster eks --cluster-name=watchlist
jx create cluster aks --cluster-name=watchlist
jx create cluster gke --cluster-name=watchlist
jx create cluster iks --cluster-name=watchlist
在現有的 EKS 叢集上執行 Jenkins X,請參考官方:https://jenkins-x.io/v3/admin/setup/operator/。
安裝 Jenkins X
在 Kubernetes 叢集上安裝 Jenkins X,只需在終端機執行以下命令:
jx boot
安裝過程中會詢問一系列問題以組態安裝,如圖 11.30 所示。
安裝結果
安裝完成後,會顯示相關服務的連結和密碼,請妥善儲存以供未來使用。
Jenkins X 的功能與特點
Jenkins X 佈署了一系列支援服務,包括 Jenkins 儀錶板、Docker Registry、ChartMuseum 和 Artifact Hub 用於管理 Helm 圖表,以及作為 Maven 和 npm 儲存函式庫的 Nexus。
執行 kubectl get svc 命令可檢視服務列表。
Jenkins 網頁儀錶板
瀏覽器開啟安裝過程中提供的 Jenkins URL,並使用管理員使用者名稱和密碼登入,即可看到如圖 11.31 所示的儀錶板。
無伺服器模式
Jenkins X 允許以無伺服器模式執行 Jenkins。這樣,只有在需要時才會啟動 Jenkins,而不是持續佔用 CPU 和記憶體資源。
建立與佈署應用程式
Jenkins X 預設建立兩個 Git 儲存函式庫,分別對應測試環境和生產環境,如圖 11.32 所示:
- 測試環境:自動佈署專案主分支的最新版本。
- 生產環境:需要手動使用
jx promote命令來升級版本。
建立應用程式
建立一個 Go 語言的 RESTful API,輸出 IMDb 前 100 名電影列表。然後,使用以下命令將專案匯入 Jenkins X:
jx import
若要匯入已存在於遠端 Git 儲存函式庫的專案,可以使用 --url 引數:
jx import --url https://github.com/mlabouardy/jx-movies-store
自動化流程
Jenkins X 會根據專案語言選擇合適的建置包,產生 Jenkinsfile、Dockerfile 和 Helm 圖表,並建立遠端儲存函式庫、註冊 webhook,最後推播程式碼到遠端儲存函式庫,如圖 11.33 所示。
同時,Jenkins X 也會自動建立 Jenkins 多分支Pipeline作業,並觸發Pipeline。可以使用以下命令追蹤Pipeline進度:
jx get activity -f jx-movies-store -w
或者在 Jenkins 儀錶板中檢視,如圖 11.34 和圖 11.35 所示。
建置階段指令碼範例
以下是建置階段的部分指令碼,展示了當主分支發生事件時執行的動作:
stage('Build Release') {
when {
branch 'master'
}
steps {
// 建置流程步驟
}
}
程式碼解析:
此 Groovy 指令碼定義了一個名為「Build Release」的階段,該階段僅在 master 分支發生變更時觸發。該階段內包含了建置流程的具體步驟,例如編譯、測試和封裝等。
stage('Build Release'):定義了一個名為「Build Release」的階段,這是 Jenkins Pipeline 中的一個基本組成單位,用於組織不同的任務。when { branch 'master' }:這是一個條件判斷,表示只有當目前執行的分支是master時,才會執行該階段內的步驟。這確保了只有主分支的變更會觸發建置流程。steps { // 建置流程步驟 }:在steps區塊內,可以填寫具體的建置流程,例如編譯程式碼、執行測試、建置 Docker 映象等。這些步驟可以根據具體需求進行自定義,以實作自動化的建置和佈署流程。
透過這種方式,Jenkins X 結合 Kubernetes 和 GitOps 方法,實作了高效的 CI/CD 流程,大大簡化了雲原生應用的開發和佈署工作。
發現 Jenkins X 的自動化佈署與 CI/CD 流程
Jenkins X 提供了一個根據 Kubernetes 的 CI/CD 解決方案,能夠自動化應用程式的建置、測試與佈署。以下將詳細介紹 Jenkins X 的工作流程與特點。
自動化建置與佈署流程
在 Jenkins X 中,當我們將應用程式碼推播到 GitHub 時,Jenkins X 會自動觸發建置流程。以下是一個典型的建置流程:
container('go') {
dir('/home/jenkins/agent/go/src/github.com/mlabouardy/jx-movies-store') {
checkout scm
sh "git checkout master"
sh "git config --global credential.helper store"
sh "jx step git credentials"
sh "echo \$(jx-release-version) > VERSION"
sh "jx step tag --version \$(cat VERSION)"
sh "make build"
sh "export VERSION=`cat VERSION` && skaffold build -f skaffold.yaml"
sh "jx step post build --image $DOCKER_REGISTRY/$ORG/$APP_NAME:\$(cat VERSION)"
}
}
內容解密:
container('go')指定了建置過程中使用的容器環境。dir()切換到指定的工作目錄。checkout scm從 GitHub 簽出程式碼。sh "git checkout master"切換到 master 分支。sh "jx step git credentials"組態 Git 認證資訊。sh "echo \$(jx-release-version) > VERSION"生成版本號並寫入 VERSION 檔案。sh "jx step tag --version \$(cat VERSION)"根據 VERSION 檔案中的版本號對程式碼進行標記。sh "make build"執行建置命令。sh "export VERSION=cat VERSION&& skaffold build -f skaffold.yaml"使用 Skaffold 進行建置並推播映像到 Docker Registry。sh "jx step post build --image $DOCKER_REGISTRY/$ORG/$APP_NAME:\$(cat VERSION)"將建置好的映像推播到指定的 Docker Registry。
Helm Chart 與 ChartMuseum
Jenkins X 使用 Helm Chart 來管理 Kubernetes 應用程式的佈署。建置過程中,Jenkins X 會將 Helm Chart 封裝並推播到 ChartMuseum 儲存函式庫。
自動化佈署到預生產環境
當建置完成後,Jenkins X 會自動將應用程式佈署到預生產環境(Staging)。這個過程涉及到建立一個新的 Pull Request(PR),將應用程式的版本號更新到 env/requirements.yaml 檔案中。
預覽環境(Preview Environment)
對於每個 PR,Jenkins X 都會建立一個預覽環境,以便開發人員可以提前驗證變更。這使得開發團隊能夠在變更合併到 master 分支之前獲得快速反饋。
ChatOps 命令
Jenkins X 支援多種 ChatOps 命令,用於管理 PR 的生命週期。常用的命令包括:
/approve:批准 PR 合併。/retest:重新執行失敗的測試。/assign USER:將 PR 分配給指定使用者。/lgtm:表示 PR 已經準備好合併。
佈署到生產環境
當應用程式在預生產環境中驗證透過後,可以使用 jx promote 命令將其佈署到生產環境。