在 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 叢集

部署 Kubernetes Engine 叢集時,請為下列服務啟用驗證範圍

  • Google Cloud Storage — storage-rw

    • Jenkins 必須能存取 Google Container Registry,這是將內容儲存在 Cloud Storage 的服務。
  • Google Cloud Source Repositories — projecthosting

    • Cloud Source Repositories 提供私人存放區,讓您用來儲存原始碼。Jenkins 可以盡可能快速地從這些存放區提取資料來建構、測試及部署程式碼。

例如,建立叢集時,您可以使用類似以下範例的程式碼:

gcloud container clusters create jenkins-cd \
         --network jenkins \
         --scopes "https://www.googleapis.com/auth/projecthosting,storage-rw"

如果您打算運用其他 Google 服務,可以新增其他範圍

部署 Jenkins 主要執行個體

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

Jenkins 和 Kubernetes 架構

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

如要建立 Kubernetes 命名空間,請輸入下列指令。

kubectl create namespace 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。

請務必設定要求和限制做為部署定義的一部分,如此才能保證容器擁有叢集內一定容量的 CPU 和記憶體資源,然後再進行排程。否則,您的主要執行個體可能會因為 CPU 或記憶體耗盡而停止運作。

Jenkins 主目錄磁碟區會儲存 XML 設定檔和外掛程式 JAR 檔案;這些檔案構成您的設定。請考慮使用下列的最佳做法。

  • 建立永久磁碟來儲存主目錄,以確保即使執行 Jenkins 主要執行個體的 Pod 暫停運作,也能維護您的關鍵設定資料。

  • 這個磁碟應大於或等於 10 GB。

  • 建立您的磁碟區後,您必須將這個磁碟連接至虛擬機器以格式化這個磁碟,接著從任何虛擬機器卸載這個磁碟區並將它卸離,然後您便可以將這個磁碟區用於部署作業。

以下程式碼說明範例部署定義。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: jenkins
  namespace: jenkins
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: master
    spec:
      containers:
      - name: master
        image: jenkins/jenkins:2.67
        ports:
        - containerPort: 8080
        - containerPort: 50000
        readinessProbe:
          httpGet:
            path: /login
            port: 8080
          periodSeconds: 10
          timeoutSeconds: 5
          successThreshold: 2
          failureThreshold: 5
        env:
        - name: JENKINS_OPTS
          valueFrom:
            secretKeyRef:
              name: jenkins
              key: options
        - name: JAVA_OPTS
          value: '-Xmx1400m'
        volumeMounts:
        - mountPath: /var/jenkins_home
          name: jenkins-home
        resources:
          limits:
            cpu: 500m
            memory: 1500Mi
          requests:
            cpu: 500m
            memory: 1500Mi
      volumes:
      - name: jenkins-home
        gcePersistentDisk:
          pdName: jenkins-home
          fsType: ext4
          partition: 1

連線至 Jenkins

Kubernetes 叢集中的所有 Pod 都可以使用 master.jenkins.svc 作為主機名稱,以及使用 8080 作為通訊埠來存取 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 服務時使用您的服務帳戶憑證。

依照這些操作說明安裝外掛程式。

為 Kubernetes Engine 設定 Jenkins

有關如何為 Kubernetes Engine 設定 Jenkins 的逐步指引,包括建構執行工具設定、新增憑證等內容,請參閱為 Kubernetes Engine 設定 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

如要升級 Jenkins 主要執行個體,請編輯部署資訊清單,然後將「映像檔」屬性的標記值變更為您要升級的目標版本。如需可用版本清單,請參閱 Docker 的 Jenkins 映像檔標記清單

編輯完檔案後,使用下列指令部署變更。

kubectl apply -f jenkins.yaml

後續步驟

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

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

這個網頁
解決方案