您好,登錄后才能下訂單哦!
本篇內容主要講解“Kubernetes怎么構造可自由擴展的Jenkins”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Kubernetes怎么構造可自由擴展的Jenkins”吧!
在這種模式下,只有一個 Jenkins 服務器負責所有的構建任務并使用 TCP 連接部署到遠程服務器上。這也是最簡單的一種方式,你完全不需要擔心其他可變因素。
采用單機模式運行 Jenkins 有一些弊端。
盡管單機模式你無需考慮多服務器和節點,但當大量的構建任務在同一時間運行時,服務器可能會負荷過重。你可能會考慮增加節點可并發執行的構建任務數量,但是很快就會遇到性能瓶頸。
為了解決這個問題,你可以將部分任務分發到其他的機器上去,即 Jenkins 從節點。Jenkins 從節點會運行一段程序與主節點進行通信,判斷是夠有可執行的構建任務。一旦 Jenkins 主節點調度安排好構建任務,就將其分發至相應的從節點。那我們的問題解決了嗎?接著往下看。
我們進一步來探索 Jenkins 的運行方式。當你的團隊中還未建立 CI 時,你可能無需多臺靜態服務器來執行 Jenkins 任務。
當你無需 7*24 運行時,你的服務器可能會空閑,這時就產生資源浪費了。
但如果你正在使用容器技術如 Kubernetes,你可以讓 Jenkins 的運行架構變得更高級。簡單的說,就是讓主節點處理調度構建任務,把任務分發任務到從節點進行執行,但是你并不需要事先就生成相應的從節點——當從節點需要使用時,會立刻應運而生。
這種運行架構可以解決下面的問題
當你將 Jenkins 運行在 Kubernetes 集群中時,Jenkins 可以根據集群資源使用情況調節并啟動。因為很多應用都共享一個集群,這樣就能有效的節約資源——這種情況下 Jenkins 并不會運行在一個資源使用頂峰時候。
如果你將集群部署在云端,如Google Cloud Platform
,Jenkins 的運行將會變得更加輕松靈活。GKE 不僅僅可以根據容器的情況自我調節,還可以根據集群的負載情況添加或移除節點,如此一來就有了無限擴展的能力。
你無需再仔細考慮同一時間并發執行的任務數目,Jenkins 會準備好一個從節點以便于運行相關的任務。
Kubernetes 也可以很好的實現負載均衡,它會讓 Jenkins 從節點運行在最適合的服務器上,正因如此,構建任務的運行會更快且更有效率。
如果你的構建任務或者從節點突然遇到問題了,這個時候你完全不用擔心,Jenkins 會自動移除有問題的從節點并啟動一個新的從節點。
這樣會節省大量的故障排查時間,因為每個從節點不是必須存在的,如果某個從節點遇到障礙,Jenkins 會請求 Kubernetes 移除它并啟動一個全新的從節點。就是這么簡單。
一開始,我們可能采用單機模式使用 Jenkins,半年內可能不會有什么問題,當使用的人越來越多,負載也越來越高,最終我們都不得不面臨負載超出范圍的問題。
當我們還沒有使用 Kubernetes,解決辦法可能是搭建主從架構或給單機服務器增加 CPU 和內存。我們可能會選擇后面這種辦法,因為這是最有效和最直接的方式。然而這種方法并不能徹底解決我們的問題。
多次嘗試后,我們公司 CTO 提出云部署的方式,我們決定將 Jenkins 部署到云端并和已有的 Kubernetes 集群結合在一起,除此之外,我們還將其他的工具也一并遷移到了云端。是不是很簡單?讓我們來驗證一下。
我們有兩個方案。一是將主節點運行在容器中的單機模式,另外一個方案就是利用將 Jenkins 運行在 Kubernetes 集群 。后者我們提出以下2層拓撲結構:
Jenkins 主節點作為控制器,管理用戶登陸及調度構建任務;
使用 Kubernetes 啟動額外的 Jenkins 從節點容器,用戶將在這些從節點容器中觸發任務并運行,當任務成功執行完成后,容器會被移除;
接下來我們看看如何進行配置。
創建主節點實例鏡像的 Dockerfile 如下:
version: "3" FROM jenkins/jenkins:centos # # Distributed Builds plugins RUN /usr/local/bin/install-plugins.sh ssh-slaves # # install Notifications and Publishing plugins RUN /usr/local/bin/install-plugins.sh email-ext RUN /usr/local/bin/install-plugins.sh mailer RUN /usr/local/bin/install-plugins.sh slack # # Artifacts RUN /usr/local/bin/install-plugins.sh htmlpublisher # # UI RUN /usr/local/bin/install-plugins.sh greenballs RUN /usr/local/bin/install-plugins.sh simple-theme-plugin # # Scaling RUN /usr/local/bin/install-plugins.sh kubernetes # # install Maven USER root RUN yum update -y && yum install -y maven USER jenkins
構建鏡像
docker build -t <your-docker-registry>/jenkins-master:0.0.1 .
將鏡像推送至中央倉庫
docker push <your-docker-registry>/jenkins-master:0.0.1
這個 Dockerfile 很簡單,不需要安裝任何軟件,因為主節點不用運行任何構建任務,而僅僅是管理各節點。你可以根據自己的需求修改。
接下來使用Kubernetes mainfest
文件啟動Jenkins 主節點的運行實例,文件內容如下:
apiVersion: v1 kind: ServiceAccount metadata: labels: k8s-app: jenkins name: jenkins namespace: default apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: jenkins-crb roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: jenkins namespace: default apiVersion: v1 kind: PersistentVolumeClaim metadata: name: jenkins-pv-claim labels: app: jenkins spec: accessModes: - ReadWriteOnce resources: requests: storage: 30Gi apiVersion: apps/v1 kind: Deployment metadata: name: jenkins-deployment labels: app: jenkins spec: replicas: 1 selector: matchLabels: app: jenkins template: metadata: labels: app: jenkins spec: serviceAccountName: jenkins volumes: - name: jenkins-pv-storage persistentVolumeClaim: claimName: jenkins-pv-claim containers: - name: jenkins image: <your-docker-registry>/jenkins-master:0.0.1 env: - name: JAVA_OPTS value: -Djenkins.install.runSetupWizard=false imagePullPolicy: Always ports: - containerPort: 8080 - containerPort: 50000 volumeMounts: - mountPath: "/var/jenkins_home" name: jenkins-pv-storage securityContext: privileged: true imagePullSecrets: - name: regcred initContainers: - name: volume-mount-data-log image: busybox imagePullPolicy: Always command: ["sh", "-c", "chown -R 1000:1000 /var/jenkins_home"] volumeMounts: - mountPath: "/var/jenkins_home" name: jenkins-pv-storage apiVersion: v1 kind: Service metadata: name: jenkins-service labels: app: jenkins-svc spec: ports: - port: 8080 targetPort: 8080 protocol: TCP name: app - port: 50000 targetPort: 50000 protocol: TCP name: jnlp selector: app: jenkins apiVersion: extensions/v1beta1 kind: Ingress metadata: name: jenkins-ingress annotations: nginx.ingress.kubernetes.io/add-base-url: "true" nginx.ingress.kubernetes.io/proxy-body-size: "0" spec: rules: - host: jenkins.example.com http: paths: - path: / backend: serviceName: jenkins-service servicePort: 8080 - host: jenkinsmaster.example.com http: paths: - path: / backend: serviceName: jenkins-service servicePort: 50000
manifest file
主要定義了以下內容:
默認命名空間中增加一個名為 Jenkins 的服務;
jenkins-crb
,將 jenkins 服務與集群管理員cluster-admin
綁定,這就允許 Jenkins 主節點和 Kubernetes 集群進行通信并執行一些集群管理的任務如啟動或停止 pods;
jenkins-pv-claim
,作為一個持久化的數據卷,可以保存 30GB 的Jenkins 數據;
Jenkins 主節點運行實例啟動后,Jenkins 服務和jenkins-pv-claim
數據卷對外暴露的端口分別是8080和50000
說明 Jenkins 主節點在集群中的 IP;
設置 Jenkins 對外提供的 URL;
上述配置生效后,你可以自行選擇負載均衡方式或者從節點運行方式,也可以根據需要改變,然后使用kubectl apply-f<manifest_file>
使文件生效。接下來你就可以在瀏覽器中通過Jenkins.example.com
上(或自行定義的url)來訪問 Jenkins。
相比主節點,從節點鏡像有所不同,它們并不會管理你的構建任務而僅僅是執行而已。因此,我們需確保從節點符合運行的所有要求。
既然我們目前所構建的應用都是運行在容器上的微服務,我們需在 Jenkins 的從節點服務器上安裝 docker,只有這樣我們才能在從節點上運行 docker。
所用的Dockerfile 如下:
FROM jenkins/jnlp-slave # # install Maven USER root RUN apt update -y RUN apt install -y apt-transport-https ca-certificates curl gnupg2 software-properties-common RUN curl -fsSL https://apt.dockerproject.org/gpg | apt-key add - RUN apt-add-repository "deb https://apt.dockerproject.org/repo debian-$(lsb_release -cs) main" RUN apt-get update RUN apt-cache policy docker-engine RUN apt-get install -y docker-engine=1.13.1-0~debian-stretch VOLUME /root/.docker RUN cd /usr/bin && curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.17.0/bin/linux/amd64/kubectl RUN chmod +x /usr/bin/kubectl COPY config /root/.kube/ RUN wget -O /root/helm.tar.gz https://get.helm.sh/helm-v2.15.2-linux-amd64.tar.gz RUN cd /root && tar -zxvf helm.tar.gz RUN cd /root && mv /root/linux-amd64/helm /usr/bin/helm RUN chmod +x /usr/bin/helm RUN cp -a /usr/bin/helm /usr/local/bin/helm RUN helm init --upgrade USER root
構建鏡像
docker build -t <your-docker-registry>/jenkins-slave .
將鏡像推送至中央倉庫
docker push <your-docker-registry>/jenkins-slave
從節點的運行鏡像已經推送至中央倉庫后,下一步就是在 Jenkins 上設置一旦有構建任務觸發時如何用 Kunernetes 啟動一個運行容器。主要步驟分為以下兩個步驟:
通過kubectl cluster-info | grep master
獲取 URL 或 Kunernetes API
在 Jenkins 的 cloud configure 界面[your_jenkins_url]/configureClouds/)
配置如下:
最后記得保存以上設置
為了確保主節點僅僅作為控制器而不執行具體的構建任務,我們需要將主節點的 executors 設置為0.
訪問[your_jenkins_url]/computer/(master)/configure
,根據下圖指示executors
設置為0并保存
創建一個自由風格任務,并命名為job-1
,并根據以下步驟進行配置
創建一個和job-1
完全一樣的任務,命名為job-2
同時啟動兩個任務,此時你會注意到這兩個構建任務都分別在 kubernetes 生成了一個新的 pod ,并且同時執行著。
在控制臺查看兩個任務的輸出:
到此,相信大家對“Kubernetes怎么構造可自由擴展的Jenkins”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。