溫馨提示×

溫馨提示×

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

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

微服務(wù)如何自動化部署CI/CD

發(fā)布時間:2021-11-18 09:49:30 來源:億速云 閱讀:316 作者:小新 欄目:大數(shù)據(jù)

這篇文章將為大家詳細講解有關(guān)微服務(wù)如何自動化部署CI/CD,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。


環(huán)境:
    ubuntu16.04
    docker18.04
    k8s1.13.x +

1. 準備
以上系統(tǒng)環(huán)境準備好,本文講述的是用k8s來進行部署jenkins

2. 部署jenkins

新建部署腳本jenkins.yaml:

apiVersion: v1

kind: Service

metadata:

  name: jenkins-service

  namespace: default

  labels:

    app: jenkins

spec:

  type: NodePort

  ports:

  - port: 8080

    targetPort: 8080

    protocol: TCP

    nodePort: 30600

    name: jenkins

  - port: 30000

    targetPort: 30000

    nodePort: 30000

    protocol: TCP

    name: agent

  selector:

    app: jenkins

    tier: jenkins

---

apiVersion: apps/v1

kind: Deployment

metadata:

  name: jenkins-deployment

  labels:

    app: jenkins

spec:

  replicas: 1

  strategy:

    type: Recreate

  template:

    metadata:

      labels:

        app: jenkins

        tier: jenkins

    spec:

      containers:

      - name: jenkins

        image: jenkinsci/blueocean:latest

        imagePullPolicy: Always

        ports:

        - containerPort: 8080

          name: jenkins

        - containerPort: 30000

          name: agent

        volumeMounts:

        - mountPath: /var/jenkins_home

          name: jenkins-data

        - mountPath: /data/jenkins

          name: jenkins-log-path

      volumes:

      - name: jenkins-data

        hostPath:

          path: /home/demo/jenkins

      - name: jenkins-log-path

        hostPath:

          path: /data/jenkins


執(zhí)行腳本:
kubectl apply -f jenkins.yaml
kubectl get pod 會看到部署成功的pod

微服務(wù)如何自動化部署CI/CD

同時會看到一個service生成,映射端口到外部  

微服務(wù)如何自動化部署CI/CD

接下來通過頁面訪問該服務(wù),首次打開后,會讓輸入一個admin的密鑰,這一串字符可以在日志中找到,執(zhí)行kubectl logs -f test-jenkins-c6bd58bf9-tgmsa即可,輸入一串字符后,進入下一步,需要安裝一些插件,在安裝插件的時候,需要注意的是,選擇jenkins的image不同,其所需安裝的插件也是不一樣的,有的可能image已經(jīng)存在了。

具體請看:https://jenkins.io/zh/doc/book/installing/

安裝完插件后,進入下一步,創(chuàng)建第一個賬戶,管理員賬戶,一般建議創(chuàng)建,方便后面使用,注:郵箱也需要填寫。

完成以上后,我們進入正式界面:

微服務(wù)如何自動化部署CI/CD

第一步:點擊系統(tǒng)管理--->插件管理,添加一些插件,這里有用到kubernetes的插件,故安裝了kubernetes plugins,其他的可根據(jù)自行項目確定下載、安裝。


第二步:點擊系統(tǒng)管理--->系統(tǒng)設(shè)置

微服務(wù)如何自動化部署CI/CD

添加jenkins的地址以及郵件地址

第三步:拉動滾動框到最下面,新增一個云

微服務(wù)如何自動化部署CI/CD

這里我加了kubernetes的配置,為什么后面會講。

第四步:新建任務(wù)

微服務(wù)如何自動化部署CI/CD

在觸發(fā)器中新增規(guī)則,最下面要生成token。

第五步:

微服務(wù)如何自動化部署CI/CD

接下來就是選擇與gitlab互動,gitlab的地址以及憑據(jù),憑據(jù)可通過首頁加上可訪問gitlab的用戶信息,腳本路徑需要根據(jù)自身的Jenkinsfile路徑情況填寫。

第六步:

微服務(wù)如何自動化部署CI/CD

如果啟用全局安全,這個端口本身是50000,但由于k8s的默認nodePort范圍是30000-32767,故可以修改在這區(qū)間內(nèi),比如:30000,這也是為什么上面創(chuàng)建時service的nodePort是30000了。

至此,jenkins環(huán)境配置完成

第七步:配置gitlab

微服務(wù)如何自動化部署CI/CD

這里的url就是在新建任務(wù)時生成的Gitlab webhook,token就是上面截圖生成的token,最后add webhook。

第八步:

關(guān)于Harbor,自己可以簡單搭建一個harbor服務(wù),找度娘問一下很多,此處略。

第九步:

新建Jenkinsfile文件,如果剛才的路徑是在項目根目錄,則直接在項目根目錄下創(chuàng)建Jenkinsfile文件

def label = "mypod-${UUID.randomUUID().toString()}"

def k8sPodYaml = """

    apiVersion: "v1"

    kind: "Pod"

    metadata:

      labels:

        jenkins: "slave"

      name: "${label}"

    spec:

      containers:

      - env:

        - name: "CI_ENV"

          value: "YES"

        - name: "JENKINS_AGENT_WORKDIR"

          value: "/home/jenkins/agent"

        image: "jenkins/jnlp-slave"

        imagePullPolicy: "Always"

        name: "jnlp"

        resources:

          limits: {}

          requests: {}

        securityContext:

          privileged: false

        tty: false

        volumeMounts:

        - mountPath: "/home/jenkins/.kube"

          name: "volume-2"

          readOnly: false

        - mountPath: "/var/run/docker.sock"

          name: "volume-0"

          readOnly: false

        - mountPath: "/var/inference/config"

          name: "volume-1"

          readOnly: false

        - mountPath: "/usr/local/bin/kubectl"

          name: "volume-3"

          readOnly: false

        - mountPath: "/home/jenkins/agent"

          name: "workspace-volume"

          readOnly: false

        workingDir: "/home/jenkins/agent"

      nodeSelector: {}

      restartPolicy: "Never"

      volumes:

      - hostPath:

          path: "/var/run/docker.sock"

        name: "volume-0"

      - hostPath:

          path: "/home/leinao/.kube"

        name: "volume-2"

      - hostPath:

          path: "/home/leinao/inference-deploy/output_config"

        name: "volume-1"

      - emptyDir: {}

        name: "workspace-volume"

      - hostPath:

          path: "/usr/local/bin/kubectl"

        name: "volume-3"

"""

****************

下面是自己的任務(wù)構(gòu)建項目時的邏輯,由于我們這塊用了自己的框架寫的編譯邏輯,故比較簡單的,這里不合適公開,但是邏輯都差不多,大家可自行編寫。

這塊解釋上面的k8s的yaml,這個就是為了在k8s中啟動一個pod,通過該pod來執(zhí)行構(gòu)建邏輯的過程。

到此,關(guān)于Jenkins結(jié)合harbor、gitlab、k8s來實現(xiàn)CI/CD結(jié)束了,有幾點注意的地方:

    1. 如果jenkins是在容器中啟動的一定要記得將這個端口(30000)暴露到外部,不然jenkins-master會不知道slave是否已經(jīng)啟動,會反復(fù)去創(chuàng)建pod直到超過重試次數(shù)。

    2. 如果提示Jenkins doesn’t have label jenkins-jnlp-slave,可能原因:

        1). 因為slave節(jié)點無法鏈接到j(luò)enkins節(jié)點開放端口50000導(dǎo)致

        2). 因為slave鏡像中slave啟動失敗導(dǎo)致的

        3). 因為jenkins和k8s通信有延時導(dǎo)致超時jenkins會反復(fù)創(chuàng)建pod

        4). 因為slave pod啟動失敗

        5). 因為pipeline中指定的label與配置中的不一致導(dǎo)致

    3. 也可以通過Ingress暴露的方式來進行暴露。

關(guān)于“微服務(wù)如何自動化部署CI/CD”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節(jié)

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

AI