在Kubernetes上部署和伸縮Jenkins

在本教程中,咱們將使用Rancher在Kubernetes上部署和伸縮Jenkins。按照本文的步驟一步步來,你將會使用到咱們用來測試實際構建做業的master-agent體系結構,建立出功能齊全的Jenkins。web

介 紹docker

Jenkins是一個開源的持續集成和持續交付工具,它能夠用來自動構建、測試和部署軟件。在全世界有超過一百萬的用戶在使用Jenkins,它是目前最流行的自動化服務器。Jenkins的優點包括:shell

  • 是一個擁有龐大社區支持的開源軟件api

  • 基於Java的代碼庫,使其能夠移植到全部主要平臺瀏覽器

  • 有超過1000個插件的豐富生態系統服務器

Jenkins可以與主流的源代碼管理系統(Git、SVN、Mercurial以及CVS)、主流的構建工具(Ant、Maven、Grunt)、shell腳本和Windows批處理命令、測試框架、報表生成器的都良好地協同工做。Jenkins的插件還提供了對Docker和Kubernetes的支持,Docker和Kubernetes可以建立、部署基於雲的微服務環境,而且把它們投入到測試和生產部署中。網絡

Jenkins支持master-agent體系結構(許多build agents/構建代理根據master服務器調度來完成任務),使其具備高度的可伸縮性。Master的工做是安排構建做業,將做業分發給代理實際執行,監視這些代理並得到構建的結果。除此以外,master服務器還能夠直接執行構建做業。app

代理的任務是構建從master服務器發送過來的做業。做業能夠配置在指定類型的代理商運行,若是沒有特別需求,Jenkins就簡單地選擇下一個可用代理。負載均衡

Jenkins的可伸縮性能夠帶來許多便利:框架

  • 並行運行多個構建方案

  • 自動地掛載和移除代理,節約開銷

  • 分配負載

固然,儘管Jenkins包含了這種開箱即用的可伸縮性特性,配置它的過程卻並非很簡單。有許多可以擴展Jenkins的選擇,而其中一種強大的選擇就是使用Kubernetes。

Kubernetes是什麼?

Kubernetes是一個開源的容器編排工具。它主要用來幫助操做人員部署、伸縮、更新和維護服務,以及提供服務發現機制來管理節點集羣上的容器化應用程序。你能夠查看官方文檔,瞭解更多關於Kubernetes的內容和用途:

https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/

Kubernetes是管理可伸縮的、基於容器的工做負載的最佳工具之一。包括Jenkins在內的大多數應用程序均可以進行容器化,而這也使得Kubernetes成爲了很是好的選擇。

項目目標

在咱們開始以前,先花一點時間描述一下咱們將要構建的系統。

咱們首先會將Jenkins master實例部署到Kubernetes集羣上。咱們將使用Jenkins的kubernetes插件。咱們將使用Jenkins的kubernetes插件,經過提供動態代理來適配當前的工做負載,在集羣上擴展Jenkins。該插件基於具體的Docker鏡像啓動代理,爲每一個構建建立一個Kubernetes pod。在構建完成後,Jenkins將刪除pod來節省資源。代理則使用JNLP(Java Network Launch Protocol,Java網絡啓動協議)啓動,所以容器可以在啓動和運行以後自動鏈接到Jenkins master。

前期準備和安裝

你須要準備這些東西來完成本教程:

Linux機器用於運行Rancher:咱們還會使用它構建自定義的Jenkins鏡像。能夠按照Rancher安裝入門指南在主機上安裝Docker和Rancher:

https://rancher.com/quick-start/

Docker Hub帳戶:咱們須要一個帶有容器鏡像倉庫的帳戶,爲Jenkins master和代理推送自定義鏡像。

GCP帳戶:咱們將在GCP上部署Kubernetes集羣。谷歌雲平臺的free-tier應該可以完成這項工做。您實際使用其餘公有云,操做也是同樣的。

爲Jenkins組件構建自定義的鏡像

那麼咱們先從給Jenkins組件構建自定義鏡像開始,將它們推送到Docker Hub。

登陸到Linux服務器,在那裏你就能夠運行Rancher並構建鏡像。若是尚未安裝Docker和Rancher,請按照Rancher快速入門指南在主機上安裝Docker和Rancher。主機準備好後,咱們就能夠準備dockerfile了。

編寫Jenkins Master Dockerfile

咱們先在當前文件夾下建立一個名爲Dockerfile-jenkins-master的文件,來定義Jenkins master鏡像:

在文件內部,加入下面Dockerfile構建命令。這些命令使用主Jenkins Docker鏡像做爲基礎,配置咱們用於部署到Kubernetes集羣的插件:

完成後,保存並關閉文件

編寫Jenkins代理的Dockerfiles

接下來,咱們就能夠爲Jenkins代理建立Dockerfile文件了。咱們將建立兩個代理鏡像,演示Jenkins如何正確識別爲每一個做業準備的正確代理。

在當前目錄中建立一個空文件。咱們將把它複製到鏡像中做爲正在構建的每一個代理的標識符:

如今,爲第一個代理鏡像建立Dockerfile

該鏡像將把空文件複製到一個惟一的名稱,標記所使用的代理。

完成以後保存並關閉文件

最後,定義第二個代理。這個和前一個代理相同,不過使用了不一樣的文件標識符:

保存並關閉文件

如今你的工做目錄看起來應該是這樣的:

構建鏡像並Push到Docker Hub

有了準備好的Dockerfile,咱們如今就準備構建和push鏡像到Docker Hub啦。

首先構建Jenkins master的鏡像:

注意:下面的命令中,將 <dockerhub_user>替換成本身的Docker Hub帳戶名

[root@rancher-instance jenkins-kubernetes]# docker build -f Dockerfile-jenkins-master -t <dockerhub_user>/jenkins-master .

當命令的結果返回以後,查看新建立的鏡像:

使用帳戶憑證登陸到Docker Hub:

[root@rancher-instance jenkins-kubernetes]# docker loginLogin with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: Password: Login Succeeded

如今,將鏡像推送到Docker Hub:

注意:下面的命令中,一樣注意替換成本身的Docker Hub帳戶

你可能還須要一樣的命令來構建第二個鏡像給Jenkins JNLP代理:

注意:下面的命令中,注意將<dockerhub_user>替換成本身的Docker Hub帳戶名

若是一切順利,你就能在Docker Hub帳戶中看到下圖這個狀態:

使用Rancher部署集羣

如今咱們的鏡像已經發布,就可使用Rancher來幫助部署GKE集羣了。若是您以前安裝了Rancher,經過web瀏覽器訪問服務器的ip地址就能登陸到實例了。

接下來,建立新的GKE集羣。這裏爲了建立具備訪問權限的服務帳戶,你須要登陸到谷歌雲帳戶。使用其餘的公有云服務所需的步驟也是類似的,具體能夠參考文檔學習如何建立服務帳號,以及如何與Rancher一塊兒部署集羣:

https://rancher.com/docs/rancher/v2.x/en/cluster-provisioning/hosted-kubernetes-clusters/

在集羣上部署Jenkins

在集羣準備好以後,咱們就能夠部署Jenkins master和建立一些服務了。若是你對kubectl比較熟悉,你能夠直接用命令行來實現;不過經過Rancher的UI,你也能很容易地部署全部須要的組件。

不管你選擇何種方式將工做負載添加到集羣上,都須要在本地計算機上建立下面的文件來定義須要建立的對象。

首先建立一個文件定義Jenkins部署:

在文件裏粘貼下面的內容:

注意:下面的內容中將<dockerhub_user>替換成本身的Docker Hub帳戶名

apiVersion: extensions/v1beta1 kind: Deployment metadata: name: jenkins spec: replicas: 1 template: metadata: labels: app: jenkins spec: containers: - name: jenkins image: <dockerhub_user>/jenkins-master env: - name: JAVA_OPTS value: -Djenkins.install.runSetupWizard=false ports: - name: http-port containerPort: 8080 - name: jnlp-port containerPort: 50000 volumeMounts: - name: jenkins-home mountPath: /var/jenkins_home volumes: - name: jenkins-home emptyDir: {}

下面,建立一個文件配置咱們須要的兩個服務。

一個是LoadBalancer服務,它將提供一個公開的IP地址便於咱們在Internet上訪問Jenkins。另外一個是ClusterIP服務,用於在master和代理之間的內部通訊,以後會用到該服務:

在文件內,複製下面的YAML結構:

apiVersion: v1 kind: Service metadata: name: jenkins spec: type: LoadBalancer ports: - port: 80 targetPort: 8080 selector: app: jenkins apiVersion: v1 kind: Service metadata: name: jenkins-jnlp spec: type: ClusterIP ports: - port: 50000 targetPort: 50000 selector: app: jenkins

在Rancher上,點擊本身管理的集羣(例子中名爲jenkins)。在左上角的菜單中,選擇Default項目,而後選擇Workloads選項卡。

如今,點擊Import YAML。在接下來的頁面中,點擊右上角的Read from a file按鈕。選擇在本地建立的deployment.yml文件並點擊Import。

Rancher將在集羣上面部署一個基於你Jenkins master鏡像的pod

接下來,咱們須要在Jenkins master上配置訪問UI的方式。

在Load Balanced選項卡中,按照先前導入文件同樣的操做。單擊Import YAML按鈕,接着點Read from a file按鈕。而後從本身的電腦中選擇service.yml文件,點擊Import按鈕。

Rancher會開始建立你的服務。部署負載均衡會花費一些時間。

在service狀態成爲Active後,你能夠點擊在負載均衡器行後側的三個垂直點,選擇View/Edit YAML來找到它的公共IP地址。在這裏,向下滾動界面找到在status->loadBalancer->ingress->ip下的IP地址。

這樣咱們就能夠經過該IP地址在web瀏覽器中訪問Jenkins UI了。

配置動態的構建代理

有了Jenkins master啓動運行後,咱們能夠進一步配置動態構建代理,以在必要的時候能夠自動啓動Pods。

禁用默認Master構建代理

Jenkins UI中左側的Build Executor Status下,默認配置了兩個Executor,等待執行構建做業,它們是由Jenkins master提供的。

主實例應該只負責調度構建做業、將做業分發給代理以供執行、監視代理並獲取構建結果。由於咱們不但願主實例執行構建,所以要禁用這些。

點擊Manage Nodes以後的Manage Jenkins。

單擊與master行上的齒輪圖標。

接下來的頁面中,把# of executors設置成0,點擊Save。

這兩個空閒的executors將從UI左側的Build Executor Status中刪除。

收集配置信息

爲了在Kubernetes集羣上自動部署構建代理,咱們須要一些信息來配置Jenkins。咱們須要三條來自GCP帳戶的信息以及一條來自ClusterIP服務中的信息。

在你的GCP帳戶中,選擇Kubernetes Engine,接着是Clusters,而後點擊集羣的名稱。在Detail列中,複製端點IP供以後使用。這是咱們須要讓Jenkins鏈接到集羣的URL:

下一步,點擊端點右側的Show credentials。複製Username和Password。

如今,切換到Rancher UI。在左上角菜單中,選擇Jenkins集羣上的Default項目。在上方的導航窗口中選擇Workloads選項卡,而後單擊頁面上的Service Discovery選項卡:

點擊jenkins-jnlp行上垂直的三個點,而後單擊View/Edit YAML。複製spec > clusterIP以及spec > ports > port中的值備用。

配置Jenkins Kubernetes插件

返回主Jenkins儀表盤,點擊Manage Jenkins,而後選擇Manage Plugins:

點擊Installed選項卡並查看Kubernetes插件是否安裝:

如今咱們來配置插件。前往Manage Jenkins並選擇Configure System:

滑到頁面底部的Cloud部分。點擊Add a new cloud,選擇Kubernetes。

在下面的表單中,Kubernetes URL字段上輸入https://,而後輸入從GCP帳戶複製的集羣端點IP地址。

在Credentials下,點擊Add按鈕,選擇Jenkins。在出現的表單上,輸入從GCP帳戶複製的用戶名和密碼,單擊底部的Add按鈕。

返回到Kubernetes表單,從Credentials下拉菜單中選擇剛纔添加的憑據並單擊Test Connection按鈕。若是配置正確,則會顯示「Connection test successful」。

如今,向下滾動到頁面底部的Images部分,單擊Add Pod Template按鈕,而後選擇Kubernetes Pod Template。 使用惟一值填寫「Name」和「Labels」字段,以標識您的第一個代理。 咱們將使用標籤指定應該使用哪一個代理鏡像來運行每一個構建。

接下來,在Jenkins tunnel字段中,輸入你在Rancher UI中從jenkins-jnlp服務檢索到的IP地址和端口,用冒號分隔:

如今,在Container字段中,單擊Add Container按鈕並選擇Container Template,在彈出的內容中填寫如下字段:

  • Name: jnlp(這是Jenkins代理須要的)

  • Docker image:<dockerhub_user>/Jenkins-slave-jnlp1(確保更改Docker Hub用戶名)

  • Command to run:刪除這裏的值

  • Arguments to pass to the command:刪除這裏的值

其他字段保持原樣。

接下來,單擊Add Pod Template按鈕,再次選擇Kubernetes Pod Template。對建立的第二個代理鏡像重複剛纔的過程,須要注意的是,在須要的時候要修改那些對應於第二個鏡像的值:

單擊Save按鈕保存修改並繼續。

測試動態構建做業

如今咱們已經完成了配置工做,咱們能夠建立一些構建做業,保證Jenkins可以在Kubernetes之上進行伸縮。這裏咱們將爲每一個Jenkins代理建立5個構建做業。

在Jenkins主頁面,單擊左側的New Item,爲第一個代理的第一個構建輸入名稱,選擇Freestyle project並單擊OK按鈕。

在下一頁的Label Expression字段中,輸入你爲第一個Jenkins代理鏡像設置的標籤,若是單擊字段以外,會出現一條消息,提示標籤由雲提供服務。

向下滾動到Build Environment部分,檢查Color ANSI Console Output。

在Build部分,單擊Add build step並選擇Execute shell。把下面的腳本粘貼進去。

完成以後單擊Save。

給第一個代理建立另外四個工做則是單擊New Item,填寫新名稱並使用Copy from字段來從第一個構建中複製。你能夠在無需對第一個構建做更改的狀況下保存每一個構建。

接下來,爲第二個Jenkins代理配置第一個做業。單擊New Item,給第二個代理的第一個做業選個名字,再一次從第一個代理中複製做業。這一次咱們將在保存以前修改配置頁面上的字段。

首先,修改Label Expression字段匹配第二個代理的標籤。

接着,用下面的腳本替換掉Build部分文本框中的腳本:

完成後單擊Save。

一樣按照剛剛咱們的流程,爲第二個代理建立另外四個構建。

如今,轉回到主頁面,單擊每行最右邊的圖標,啓動所有剛剛建立的10個做業。在啓動以後,它們會按照Build Queue部分的指示排隊等待執行:

大約幾秒鐘以後,會開始建立Pods來執行構建(你能夠在Rancher的Workload選項卡中檢驗這一點)。Jenkins會爲每一個做業建立一個pod。在每一個代理啓動時,它鏈接到master並從隊列中接收要執行的做業。

代理完成了本身的工做後,它就會自動從集羣中刪除:

要檢查做業的狀態,能夠單擊每一個代理中的一項做業。從Build History中單擊構建,而後點擊Console Output。由第一個代理執行的做業應該指定使用了jenkins-slave1 Docker鏡像,而由第二個代理執行的構建應該指定使用了jenkins-slave2鏡像:

若是你獲得了上面的輸出,那麼Jenkins的配置就是正確的,並且是按照預期的方式在運行的。如今你就能夠開始定製本身的Kubernetes的構建系統,幫助本身的團隊測試和發佈軟件啦。

結 論

在本文中,咱們配置了Jenkins來按需自動部署構建代理,將其鏈接到了Rancher管理的Kubernetes集羣。爲此,咱們完成了下面的步驟:

  • 使用Rancher建立了一個集羣

  • 爲Jenkins master和代理建立了自定義Docker鏡像

  • 將Jenkins master和L4 LoadBalancer服務部署在Kubernetes集羣上

  • 在集羣上配置了Jenkins kubernetes插件,自動生成動態代理

  • 使用帶有專用代理鏡像的多個構建做業測試場景

本文着重展示了設置Jenkins master和代理體系結構的基本的必要配置。咱們瞭解了Jenkins如何使用JNLP啓動代理,以及容器如何自動鏈接到Jenkins master來接受指令。爲了實現這一點,咱們使用Rancher建立集羣、部署工做負載並監控產生的Pods。在這以後,咱們又依靠Jenkins Kubernetes插件將全部不一樣的組件鏈接在了一塊兒。

相關文章
相關標籤/搜索