溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Kubernetes怎么構(gòu)造可自由擴(kuò)展的Jenkins

發(fā)布時(shí)間:2021-09-03 18:18:52 來源:億速云 閱讀:136 作者:chen 欄目:云計(jì)算

本篇內(nèi)容主要講解“Kubernetes怎么構(gòu)造可自由擴(kuò)展的Jenkins”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Kubernetes怎么構(gòu)造可自由擴(kuò)展的Jenkins”吧!

獨(dú)立的 Jenkins 服務(wù)器

在這種模式下,只有一個(gè) Jenkins 服務(wù)器負(fù)責(zé)所有的構(gòu)建任務(wù)并使用 TCP 連接部署到遠(yuǎn)程服務(wù)器上。這也是最簡單的一種方式,你完全不需要擔(dān)心其他可變因素。

Kubernetes怎么構(gòu)造可自由擴(kuò)展的Jenkins

主從策略

采用單機(jī)模式運(yùn)行 Jenkins 有一些弊端。

盡管單機(jī)模式你無需考慮多服務(wù)器和節(jié)點(diǎn),但當(dāng)大量的構(gòu)建任務(wù)在同一時(shí)間運(yùn)行時(shí),服務(wù)器可能會負(fù)荷過重。你可能會考慮增加節(jié)點(diǎn)可并發(fā)執(zhí)行的構(gòu)建任務(wù)數(shù)量,但是很快就會遇到性能瓶頸。

為了解決這個(gè)問題,你可以將部分任務(wù)分發(fā)到其他的機(jī)器上去,即 Jenkins 從節(jié)點(diǎn)。Jenkins 從節(jié)點(diǎn)會運(yùn)行一段程序與主節(jié)點(diǎn)進(jìn)行通信,判斷是夠有可執(zhí)行的構(gòu)建任務(wù)。一旦 Jenkins 主節(jié)點(diǎn)調(diào)度安排好構(gòu)建任務(wù),就將其分發(fā)至相應(yīng)的從節(jié)點(diǎn)。那我們的問題解決了嗎?接著往下看。

Kubernetes怎么構(gòu)造可自由擴(kuò)展的Jenkins

可擴(kuò)展的 Jenkins

我們進(jìn)一步來探索 Jenkins 的運(yùn)行方式。當(dāng)你的團(tuán)隊(duì)中還未建立 CI 時(shí),你可能無需多臺靜態(tài)服務(wù)器來執(zhí)行 Jenkins 任務(wù)。

當(dāng)你無需 7*24 運(yùn)行時(shí),你的服務(wù)器可能會空閑,這時(shí)就產(chǎn)生資源浪費(fèi)了。

但如果你正在使用容器技術(shù)如 Kubernetes,你可以讓 Jenkins 的運(yùn)行架構(gòu)變得更高級。簡單的說,就是讓主節(jié)點(diǎn)處理調(diào)度構(gòu)建任務(wù),把任務(wù)分發(fā)任務(wù)到從節(jié)點(diǎn)進(jìn)行執(zhí)行,但是你并不需要事先就生成相應(yīng)的從節(jié)點(diǎn)——當(dāng)從節(jié)點(diǎn)需要使用時(shí),會立刻應(yīng)運(yùn)而生。

這種運(yùn)行架構(gòu)可以解決下面的問題

Jenkins 服務(wù)器性能不再是問題

當(dāng)你將 Jenkins 運(yùn)行在 Kubernetes 集群中時(shí),Jenkins 可以根據(jù)集群資源使用情況調(diào)節(jié)并啟動。因?yàn)楹芏鄳?yīng)用都共享一個(gè)集群,這樣就能有效的節(jié)約資源——這種情況下 Jenkins 并不會運(yùn)行在一個(gè)資源使用頂峰時(shí)候。

如果你將集群部署在云端,如Google Cloud Platform,Jenkins 的運(yùn)行將會變得更加輕松靈活。GKE 不僅僅可以根據(jù)容器的情況自我調(diào)節(jié),還可以根據(jù)集群的負(fù)載情況添加或移除節(jié)點(diǎn),如此一來就有了無限擴(kuò)展的能力。

并行運(yùn)行構(gòu)建任務(wù)

你無需再仔細(xì)考慮同一時(shí)間并發(fā)執(zhí)行的任務(wù)數(shù)目,Jenkins 會準(zhǔn)備好一個(gè)從節(jié)點(diǎn)以便于運(yùn)行相關(guān)的任務(wù)。

負(fù)載均衡

Kubernetes 也可以很好的實(shí)現(xiàn)負(fù)載均衡,它會讓 Jenkins 從節(jié)點(diǎn)運(yùn)行在最適合的服務(wù)器上,正因如此,構(gòu)建任務(wù)的運(yùn)行會更快且更有效率。

自我修復(fù)

如果你的構(gòu)建任務(wù)或者從節(jié)點(diǎn)突然遇到問題了,這個(gè)時(shí)候你完全不用擔(dān)心,Jenkins 會自動移除有問題的從節(jié)點(diǎn)并啟動一個(gè)新的從節(jié)點(diǎn)。

這樣會節(jié)省大量的故障排查時(shí)間,因?yàn)槊總€(gè)從節(jié)點(diǎn)不是必須存在的,如果某個(gè)從節(jié)點(diǎn)遇到障礙,Jenkins 會請求 Kubernetes 移除它并啟動一個(gè)全新的從節(jié)點(diǎn)。就是這么簡單。

Kubernetes怎么構(gòu)造可自由擴(kuò)展的Jenkins

我們選擇哪種運(yùn)行架構(gòu)

一開始,我們可能采用單機(jī)模式使用 Jenkins,半年內(nèi)可能不會有什么問題,當(dāng)使用的人越來越多,負(fù)載也越來越高,最終我們都不得不面臨負(fù)載超出范圍的問題。

當(dāng)我們還沒有使用 Kubernetes,解決辦法可能是搭建主從架構(gòu)或給單機(jī)服務(wù)器增加 CPU 和內(nèi)存。我們可能會選擇后面這種辦法,因?yàn)檫@是最有效和最直接的方式。然而這種方法并不能徹底解決我們的問題。

如何解決這個(gè)問題

多次嘗試后,我們公司 CTO 提出云部署的方式,我們決定將 Jenkins 部署到云端并和已有的 Kubernetes 集群結(jié)合在一起,除此之外,我們還將其他的工具也一并遷移到了云端。是不是很簡單?讓我們來驗(yàn)證一下。

我們有兩個(gè)方案。一是將主節(jié)點(diǎn)運(yùn)行在容器中的單機(jī)模式,另外一個(gè)方案就是利用將 Jenkins 運(yùn)行在 Kubernetes 集群 。后者我們提出以下2層拓?fù)浣Y(jié)構(gòu):

  • Jenkins 主節(jié)點(diǎn)作為控制器,管理用戶登陸及調(diào)度構(gòu)建任務(wù);

  • 使用 Kubernetes 啟動額外的 Jenkins 從節(jié)點(diǎn)容器,用戶將在這些從節(jié)點(diǎn)容器中觸發(fā)任務(wù)并運(yùn)行,當(dāng)任務(wù)成功執(zhí)行完成后,容器會被移除;

接下來我們看看如何進(jìn)行配置。

創(chuàng)建 Jenkins 主節(jié)點(diǎn)實(shí)例鏡像

創(chuàng)建主節(jié)點(diǎn)實(shí)例鏡像的 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

構(gòu)建鏡像

docker build -t <your-docker-registry>/jenkins-master:0.0.1 .

將鏡像推送至中央倉庫

docker push <your-docker-registry>/jenkins-master:0.0.1

這個(gè) Dockerfile 很簡單,不需要安裝任何軟件,因?yàn)橹鞴?jié)點(diǎn)不用運(yùn)行任何構(gòu)建任務(wù),而僅僅是管理各節(jié)點(diǎn)。你可以根據(jù)自己的需求修改。

自啟動 Jenkins 主節(jié)點(diǎn)運(yùn)行實(shí)例

接下來使用Kubernetes mainfest文件啟動Jenkins 主節(jié)點(diǎn)的運(yùn)行實(shí)例,文件內(nèi)容如下:

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主要定義了以下內(nèi)容:

  • 默認(rèn)命名空間中增加一個(gè)名為 Jenkins 的服務(wù);

  • jenkins-crb,將 jenkins 服務(wù)與集群管理員cluster-admin綁定,這就允許 Jenkins 主節(jié)點(diǎn)和 Kubernetes 集群進(jìn)行通信并執(zhí)行一些集群管理的任務(wù)如啟動或停止 pods;

  • jenkins-pv-claim,作為一個(gè)持久化的數(shù)據(jù)卷,可以保存 30GB 的Jenkins 數(shù)據(jù);

  • Jenkins 主節(jié)點(diǎn)運(yùn)行實(shí)例啟動后,Jenkins 服務(wù)和jenkins-pv-claim數(shù)據(jù)卷對外暴露的端口分別是8080和50000

  • 說明 Jenkins 主節(jié)點(diǎn)在集群中的 IP;

  • 設(shè)置 Jenkins 對外提供的 URL;

上述配置生效后,你可以自行選擇負(fù)載均衡方式或者從節(jié)點(diǎn)運(yùn)行方式,也可以根據(jù)需要改變,然后使用kubectl apply-f<manifest_file>使文件生效。接下來你就可以在瀏覽器中通過Jenkins.example.com上(或自行定義的url)來訪問 Jenkins。

構(gòu)建從節(jié)點(diǎn)運(yùn)行實(shí)例鏡像

相比主節(jié)點(diǎn),從節(jié)點(diǎn)鏡像有所不同,它們并不會管理你的構(gòu)建任務(wù)而僅僅是執(zhí)行而已。因此,我們需確保從節(jié)點(diǎn)符合運(yùn)行的所有要求。

既然我們目前所構(gòu)建的應(yīng)用都是運(yùn)行在容器上的微服務(wù),我們需在 Jenkins 的從節(jié)點(diǎn)服務(wù)器上安裝 docker,只有這樣我們才能在從節(jié)點(diǎn)上運(yùn)行 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 &amp;&amp; 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 &amp;&amp; tar -zxvf helm.tar.gz

RUN cd /root &amp;&amp; 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

構(gòu)建鏡像

docker build -t <your-docker-registry>/jenkins-slave .

將鏡像推送至中央倉庫

docker push <your-docker-registry>/jenkins-slave

在Jenkins 上配置 Kubernetes 集群

從節(jié)點(diǎn)的運(yùn)行鏡像已經(jīng)推送至中央倉庫后,下一步就是在 Jenkins 上設(shè)置一旦有構(gòu)建任務(wù)觸發(fā)時(shí)如何用 Kunernetes 啟動一個(gè)運(yùn)行容器。主要步驟分為以下兩個(gè)步驟:

通過kubectl cluster-info | grep master獲取 URL 或 Kunernetes API

在 Jenkins 的 cloud configure 界面[your_jenkins_url]/configureClouds/)配置如下:

Kubernetes怎么構(gòu)造可自由擴(kuò)展的Jenkins

Kubernetes怎么構(gòu)造可自由擴(kuò)展的Jenkins

Kubernetes怎么構(gòu)造可自由擴(kuò)展的Jenkins

Kubernetes怎么構(gòu)造可自由擴(kuò)展的Jenkins

最后記得保存以上設(shè)置

禁用主節(jié)點(diǎn)執(zhí)行器

為了確保主節(jié)點(diǎn)僅僅作為控制器而不執(zhí)行具體的構(gòu)建任務(wù),我們需要將主節(jié)點(diǎn)的 executors 設(shè)置為0.

訪問[your_jenkins_url]/computer/(master)/configure,根據(jù)下圖指示executors設(shè)置為0并保存

Kubernetes怎么構(gòu)造可自由擴(kuò)展的Jenkins

測試配置是否生效

創(chuàng)建一個(gè)自由風(fēng)格任務(wù),并命名為job-1,并根據(jù)以下步驟進(jìn)行配置

Kubernetes怎么構(gòu)造可自由擴(kuò)展的Jenkins

Kubernetes怎么構(gòu)造可自由擴(kuò)展的Jenkins

創(chuàng)建一個(gè)和job-1完全一樣的任務(wù),命名為job-2

Kubernetes怎么構(gòu)造可自由擴(kuò)展的Jenkins

同時(shí)啟動兩個(gè)任務(wù),此時(shí)你會注意到這兩個(gè)構(gòu)建任務(wù)都分別在 kubernetes 生成了一個(gè)新的 pod ,并且同時(shí)執(zhí)行著。

Kubernetes怎么構(gòu)造可自由擴(kuò)展的Jenkins

在控制臺查看兩個(gè)任務(wù)的輸出:

Kubernetes怎么構(gòu)造可自由擴(kuò)展的Jenkins

到此,相信大家對“Kubernetes怎么構(gòu)造可自由擴(kuò)展的Jenkins”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI