在 Kubernetes Engine 上使用 Jenkins

本主題將解說在 Google Kubernetes Engine 上使用 Jenkins 的最佳做法。如要實作這個解決方案,請參閱在 Kubernetes Engine 上設定 Jenkins

Jenkins 為開放原始碼的自動化伺服器,可讓您靈活地自動化調度管理建構、測試和部署管道。Kubernetes Engine 是 Kubernetes 的託管版本,也是功能強大的叢集管理器和自動化調度管理系統,可用於執行容器。

當您必須設定持續推送軟體更新 (CD) 管道時,將 Jenkins 部署到 Kubernetes Engine 可以提供比標準 VM 部署作業更多的重要優點:

  • 當您的建構程序使用容器時,同一個虛擬主機可以跨不同作業系統執行工作。

  • Kubernetes Engine 提供臨時的建構執行工具,讓每個建構作業都可以在乾淨環境中執行,而這個建構作業會與其之前的建構作業完全相同。

    • 由於這些建構執行工具的短暫性,所以系統只會在建構作業正在執行時才會使用 Kubernetes Engine 叢集,如此資源可以留給批次處理工作等其他叢集工作使用。

    • 啟動建構執行工具只需幾秒的時間。

  • Kubernetes Engine 運用 Google 全域負載平衡器,將網路流量轉送至您的執行個體。這個負載平衡器會處理 SSL 終止,並提供一個全域 IP 位址,以用於透過 Google 骨幹網路,將使用者從最靠近使用者的服務點,轉送至其中一個最近路徑上的網路前端。

如要深入瞭解 Kubernetes Engine 上的 Jenkins,請觀看 YouTube 2018 年的 Next 演講:

使用 Helm 部署 Jenkins 主要執行個體

請使用 Helm圖表存放區部署 Jenkins。Helm 是可用來設定及部署 Kubernetes 應用程式的套件管理員。

如要瞭解如何為 Kubernetes Engine 設定 Jenkins,請參閱為 Kubernetes Engine 設定 Jenkins

下圖說明在多節點 Kubernetes 叢集部署 Jenkins 的架構。

Jenkins 和 Kubernetes 架構

將 Jenkins 主要執行個體部署至 Kubernetes 叢集的不同命名空間中。命名空間允許針對 Jenkins 部署作業建立配額,還有從邏輯上將 Jenkins 與叢集內的其他部署作業分開。

建立 Jenkins 服務

Jenkins 提供叢集需要存取的兩項服務。請分開部署這些服務,以方便個別管理及命名。

  • 在通訊埠 8080 上對外公開的 NodePort 服務:這項服務會允許 pod 和外部使用者存取 Jenkins 使用者介面。這種類型的服務可透過 HTTP 負載平衡器來達到負載平衡。

  • 通訊埠 50000 上的內部私人 ClusterIP 服務:Jenkins 執行工具會使用這個服務從叢集內部與 Jenkins 主要執行個體通訊。

下列各節說明範例服務定義。

---
  kind: Service
  apiVersion: v1
  metadata:
    name: jenkins-ui
    namespace: jenkins
  spec:
    type: NodePort
    selector:
      app: master
    ports:
      - protocol: TCP
        port: 8080
        targetPort: 8080
        name: ui
---
  kind: Service
  apiVersion: v1
  metadata:
    name: jenkins-discovery
    namespace: jenkins
  spec:
    selector:
      app: master
    ports:
      - protocol: TCP
        port: 50000
        targetPort: 50000
        name: slaves

建立 Jenkins 部署作業

將 Jenkins 主要執行個體部署成具有備用資源數量為 1 的部署作業,如此可確保永遠只有一個 Jenkins 主要執行個體在叢集中執行。如果 Jenkins 主要執行個體 pod 暫停運作或其執行所在的節點關閉,則 Kubernetes 會重新啟動叢集中其他位置的 pod。

請務必將要求和限制設定為 Helm 部署的一部分,如此一來在容器排定之前,就能保證在叢集內部有一定數量的 CPU 和記憶體資源。否則,您的主要執行個體可能會因為 CPU 或記憶體耗盡而停止運作。

Jenkins 主目錄磁碟區會儲存 XML 設定檔和外掛程式 JAR 檔案;這些檔案構成您的設定。此資料儲存在由 GKE 叢集代管的永久磁碟上,並會在重新啟動 Jenkins 時保留資料。如要變更永久磁碟的大小,請在使用 Helm 安裝 Jenkins 時編輯 Persistence.Size 的值。

連線至 Jenkins

當 Jenkins pod 完成建立後,您便可以建立負載平衡器端點,從 Cloud Platform 之外連接這個 pod。請考慮使用下列的最佳做法。

  • 將 Kubernetes 輸入資源用於一個設定容易且能處理 SSL 終止的 L7 負載平衡器。

  • 使用 Kubernetes 密鑰,將 SSL 憑證提供給負載平衡器。使用 tls.certtls.key 值,並在輸入資源設定中參照這些值。

設定 Jenkins

保護 Jenkins 安全

在第一次連結到 Jenkins 之後,請務必立即保護 Jenkins 安全。您可以參照 Jenkins 標準安全設定教學課程,執行運用內部使用者資料庫的簡易程序。本設定作業不需要使用額外的基礎架構,並提供鎖定匿名使用者的功能。

安裝外掛程式

您可以安裝下列外掛程式,以增強 Jenkins 與 Kubernetes Engine 之間的互動。

  • Kubernetes 外掛程式可讓您使用 Kubernetes 服務帳戶來進行驗證,並使用不同的基本映像檔建立已加上標籤的執行工具設定。當必須使用執行工具時,這個外掛程式會建立 pod,且在工作結束時銷毀這個 pod。

  • Google Authenticated Source 外掛程式可讓您在存取 Cloud Source Repositories 等的 Cloud Platform 服務時使用您的服務帳戶憑證。

如要使用 Helm 圖表新增其他外掛程式,請在值檔案中編輯您傳遞至 Helm 安裝或升級指令的外掛程式清單

自訂 Jenkins 代理程式 Docker 映像檔

建立 pod 範本時,您可以提供現有的 Docker 映像檔,也可以建立已安裝大部分建構階段依附元件的自訂映像檔。使用自訂映像檔可以縮短整體建構時間,並建立更為一致的建構環境。

自訂 Docker 映像檔必須安裝並設定 Jenkins JNLP 從屬代理程式。JNLP 代理程式是與 Jenkins 主要執行個體進行通訊的軟體,目的是協調執行 Jenkins 工作並報告工作狀態。

其中一個選項是將 FROM jenkins/jnlp-slave 新增至映像檔設定。例如,如果您的應用程式建構程序取決於 Go 執行階段,那麼您可以建立下列 Dockerfile,以使用您自有的依附元件和建構成果來擴展現有的映像檔。

FROM jenkins/jnlp-slave
RUN apt-get update && apt-get install -y golang

然後,執行下列指令,建構並上傳映像檔至您專案的 Container Registry 存放區。

docker build -t gcr.io/[PROJECT]/my-jenkins-image .
gcloud docker -- push gcr.io/[PROJECT]/my-jenkins-image

在建立 pod 範本時,您可以將「Docker image」(Docker 映像檔) 欄位設定為下列字串,其中 [PROJECT] 要換成您的專案名稱,[IMAGE_NAME] 則換成映像檔名稱。

gcr.io/[PROJECT]/[IMAGE_NAME]

上述範例可確保在 Jenkins 工作啟動時,Go 程式設計語言執行階段已預先安裝。

在 Jenkins 中建構 Docker 映像檔

您可以在 Jenkins 工作中使用 Cloud Build 來建構 Docker 映像檔,而無需託管自己的Docker 精靈。您的 Jenkins 工作必須具有已取得 cloudbuild.builds.editor 角色的服務帳戶憑證。

有關 Jenkins Pipeline 檔案的範例,請參閱此 GitHub 存放區

打算在叢集內構建容器的使用者也可選擇 Kaniko。Kaniko 不需要使用 Docker 精靈,即可建構及推送映像檔到遠端註冊資料庫。

關於在 Jenkins 中使用 Kaniko 的範例,請參閱此 GitHub 存放區

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
解決方案