中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Kubernetes怎么構造可自由擴展的Jenkins

發布時間:2021-09-03 18:18:52 來源:億速云 閱讀:136 作者:chen 欄目:云計算

本篇內容主要講解“Kubernetes怎么構造可自由擴展的Jenkins”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Kubernetes怎么構造可自由擴展的Jenkins”吧!

獨立的 Jenkins 服務器

在這種模式下,只有一個 Jenkins 服務器負責所有的構建任務并使用 TCP 連接部署到遠程服務器上。這也是最簡單的一種方式,你完全不需要擔心其他可變因素。

Kubernetes怎么構造可自由擴展的Jenkins

主從策略

采用單機模式運行 Jenkins 有一些弊端。

盡管單機模式你無需考慮多服務器和節點,但當大量的構建任務在同一時間運行時,服務器可能會負荷過重。你可能會考慮增加節點可并發執行的構建任務數量,但是很快就會遇到性能瓶頸。

為了解決這個問題,你可以將部分任務分發到其他的機器上去,即 Jenkins 從節點。Jenkins 從節點會運行一段程序與主節點進行通信,判斷是夠有可執行的構建任務。一旦 Jenkins 主節點調度安排好構建任務,就將其分發至相應的從節點。那我們的問題解決了嗎?接著往下看。

Kubernetes怎么構造可自由擴展的Jenkins

可擴展的 Jenkins

我們進一步來探索 Jenkins 的運行方式。當你的團隊中還未建立 CI 時,你可能無需多臺靜態服務器來執行 Jenkins 任務。

當你無需 7*24 運行時,你的服務器可能會空閑,這時就產生資源浪費了。

但如果你正在使用容器技術如 Kubernetes,你可以讓 Jenkins 的運行架構變得更高級。簡單的說,就是讓主節點處理調度構建任務,把任務分發任務到從節點進行執行,但是你并不需要事先就生成相應的從節點——當從節點需要使用時,會立刻應運而生。

這種運行架構可以解決下面的問題

Jenkins 服務器性能不再是問題

當你將 Jenkins 運行在 Kubernetes 集群中時,Jenkins 可以根據集群資源使用情況調節并啟動。因為很多應用都共享一個集群,這樣就能有效的節約資源——這種情況下 Jenkins 并不會運行在一個資源使用頂峰時候。

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

并行運行構建任務

你無需再仔細考慮同一時間并發執行的任務數目,Jenkins 會準備好一個從節點以便于運行相關的任務。

負載均衡

Kubernetes 也可以很好的實現負載均衡,它會讓 Jenkins 從節點運行在最適合的服務器上,正因如此,構建任務的運行會更快且更有效率。

自我修復

如果你的構建任務或者從節點突然遇到問題了,這個時候你完全不用擔心,Jenkins 會自動移除有問題的從節點并啟動一個新的從節點。

這樣會節省大量的故障排查時間,因為每個從節點不是必須存在的,如果某個從節點遇到障礙,Jenkins 會請求 Kubernetes 移除它并啟動一個全新的從節點。就是這么簡單。

Kubernetes怎么構造可自由擴展的Jenkins

我們選擇哪種運行架構

一開始,我們可能采用單機模式使用 Jenkins,半年內可能不會有什么問題,當使用的人越來越多,負載也越來越高,最終我們都不得不面臨負載超出范圍的問題。

當我們還沒有使用 Kubernetes,解決辦法可能是搭建主從架構或給單機服務器增加 CPU 和內存。我們可能會選擇后面這種辦法,因為這是最有效和最直接的方式。然而這種方法并不能徹底解決我們的問題。

如何解決這個問題

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

我們有兩個方案。一是將主節點運行在容器中的單機模式,另外一個方案就是利用將 Jenkins 運行在 Kubernetes 集群 。后者我們提出以下2層拓撲結構:

  • Jenkins 主節點作為控制器,管理用戶登陸及調度構建任務;

  • 使用 Kubernetes 啟動額外的 Jenkins 從節點容器,用戶將在這些從節點容器中觸發任務并運行,當任務成功執行完成后,容器會被移除;

接下來我們看看如何進行配置。

創建 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 很簡單,不需要安裝任何軟件,因為主節點不用運行任何構建任務,而僅僅是管理各節點。你可以根據自己的需求修改。

自啟動 Jenkins 主節點運行實例

接下來使用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 &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

構建鏡像

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

將鏡像推送至中央倉庫

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

在Jenkins 上配置 Kubernetes 集群

從節點的運行鏡像已經推送至中央倉庫后,下一步就是在 Jenkins 上設置一旦有構建任務觸發時如何用 Kunernetes 啟動一個運行容器。主要步驟分為以下兩個步驟:

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

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

Kubernetes怎么構造可自由擴展的Jenkins

Kubernetes怎么構造可自由擴展的Jenkins

Kubernetes怎么構造可自由擴展的Jenkins

Kubernetes怎么構造可自由擴展的Jenkins

最后記得保存以上設置

禁用主節點執行器

為了確保主節點僅僅作為控制器而不執行具體的構建任務,我們需要將主節點的 executors 設置為0.

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

Kubernetes怎么構造可自由擴展的Jenkins

測試配置是否生效

創建一個自由風格任務,并命名為job-1,并根據以下步驟進行配置

Kubernetes怎么構造可自由擴展的Jenkins

Kubernetes怎么構造可自由擴展的Jenkins

創建一個和job-1完全一樣的任務,命名為job-2

Kubernetes怎么構造可自由擴展的Jenkins

同時啟動兩個任務,此時你會注意到這兩個構建任務都分別在 kubernetes 生成了一個新的 pod ,并且同時執行著。

Kubernetes怎么構造可自由擴展的Jenkins

在控制臺查看兩個任務的輸出:

Kubernetes怎么構造可自由擴展的Jenkins

到此,相信大家對“Kubernetes怎么構造可自由擴展的Jenkins”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

株洲县| 肃宁县| 婺源县| 定结县| 同心县| 贺兰县| 乐平市| 阿拉善左旗| 屏东市| 商都县| 辰溪县| 集贤县| 宜昌市| 高尔夫| 阿拉善左旗| 禄丰县| 华亭县| 健康| 社会| 伊宁县| 永康市| 兰溪市| 景谷| 久治县| 潞西市| 新邵县| 浦江县| 博客| 余庆县| 祁门县| 留坝县| 崇州市| 梅河口市| 白山市| 施秉县| 周宁县| 墨脱县| 德兴市| 武功县| 和田县| 怀来县|