返回文章列表

Helm Kubernetes 微服務佈署與 Jenkins X CI CD

本文介紹如何使用 Helm 簡化 Kubernetes 中微服務的佈署與管理,並探討 Jenkins X 的 CI/CD 流程,包含 Helm Chart 建立、倉函式庫組態、依賴管理、健康檢查、Jenkins Pipeline 設定以及 GitOps 方法的應用。

Web 開發 DevOps

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: [email protected]
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 命令將其佈署到生產環境。