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 檔案中,我們定義了 watchlist Chart 的依賴項,包括 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}"
  }
}

內容解密:

  • httpRequest DSL 物件用於發起 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 分支發生變更時觸發。該階段內包含了建置流程的具體步驟,例如編譯、測試和封裝等。

  1. stage('Build Release'):定義了一個名為「Build Release」的階段,這是 Jenkins Pipeline 中的一個基本組成單位,用於組織不同的任務。

  2. when { branch 'master' }:這是一個條件判斷,表示只有當目前執行的分支是 master 時,才會執行該階段內的步驟。這確保了只有主分支的變更會觸發建置流程。

  3. 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)"
    }
}

內容解密:

  1. container('go') 指定了建置過程中使用的容器環境。
  2. dir() 切換到指定的工作目錄。
  3. checkout scm 從 GitHub 簽出程式碼。
  4. sh "git checkout master" 切換到 master 分支。
  5. sh "jx step git credentials" 組態 Git 認證資訊。
  6. sh "echo \$(jx-release-version) > VERSION" 生成版本號並寫入 VERSION 檔案。
  7. sh "jx step tag --version \$(cat VERSION)" 根據 VERSION 檔案中的版本號對程式碼進行標記。
  8. sh "make build" 執行建置命令。
  9. sh "export VERSION=cat VERSION && skaffold build -f skaffold.yaml" 使用 Skaffold 進行建置並推播映像到 Docker Registry。
  10. 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 命令將其佈署到生產環境。