1. 程式人生 > >Jenkins CI/CD on Kubernetes with dynamic slaves

Jenkins CI/CD on Kubernetes with dynamic slaves

number lock tmp ply server 單擊 admin 動態 crmsh

本文檔介紹如何通過在 Kubernetes 集群上創建並配置 Jenkins Server 實現應用開發管理的 CI/CD 流程,並且利用 Kubernetes-Jenkins-Plugin 實現動態按需擴展 jenkins-slave。

步驟 1 安裝 Kubernetes 集群

如果您沒有 Kubernetes 集群,您需要先創建一個。具體操作參見 部署 Kubernetes 集群。

步驟 2 連接 Kubernetes 集群

有關如何連接到 Kubernetes 集群,參見 通過 kubectl 連接 Kubernetes 集群。

步驟 3 創建 NAS 持久化卷

註意:為了讓您的 Jenkins Server 可以具有 Fail Over 的能力,建議您將 Jenkins 的數據存儲到阿裏雲 NAS 存儲上。

有關如何創建 Kubernetes 持久化 NAS 存儲卷,參見 使用 NAS 數據卷。

假設您已經在阿裏雲控制臺上面創建了您自己的 NAS 存儲,其掛載點為 yournas-xxxx.cn-hangzhou.nas.aliyuncs.com。執行下面的命令下載一個 persistent volume 模板,替換裏面的 server 的值為您的掛載點,然後執行 kubectl apply -f pv.yml 創建持久化 NAS 卷。

  1. root@iZbp:~/jenkins# curl -L http://aliacs-k8s.oss.aliyuncs.com/conf%2Fjenkins%2Fpersistent-volume.yml > pv.yml
  2. root@iZbp:~/jenkins# vi pv.yml
  3. root@iZbp:~/jenkins# kubectl apply -f pv.yml
  4. root@iZbp:~/jenkins# kubectl get pv -n ci

步驟 4 創建 Jenkins Server

通過以下命令啟動一個 Jenkins Server。該命令會創建一個阿裏雲公網負載均衡,方便您從公網訪問 Jenkins 服務。如果不需要公網訪問請將 Service 的 type 更改為 NodePort。

  1. root@iZbp:~/jenkins# curl -L http://aliacs-k8s.oss.aliyuncs.com/conf%2Fjenkins%2Fjenkins.yml > jenkins.yml
  2. root@iZbp:~/jenkins# kubectl apply -f jenkins.yml
  3. root@iZbp:~/jenkins# kubectl get po -n ci
  4. root@iZbp:~/jenkins# kubectl get svc -n ci
  5. NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  6. jenkins 172.19.0.10 40.112.120.10 53/UDP,53/TCP 34m

然後,您就可以通過地址 http://40.112.120.10 訪問 Jenkins 服務了。

步驟 5 配置 Jenkins

  1. 訪問上面的 Jenkins 地址 http://40.112.120.10,如下圖所示。

    技術分享圖片

  2. 您需要使用 token 來初始化 Jenkins。該 token 文件存放在 secrets/initialAdminPassword 下,您需要手動掛載 NAS 到本地目錄後查看 token 的內容。您需要將以下命令中的 yournas-xxxx.cn-hangzhou.nas.aliyuncs.com 替換為您自己的掛載點。

    1. root@iZbp:~/jenkins# mkdir -p mnt
    2. root@iZbp:~/jenkins# mount.nfs yournas-xxxx.cn-hangzhou.nas.aliyuncs.com:/ mnt
    3. root@iZbp:~/jenkins# cat mnt/secrets/initialAdminPassword
    4. 7b48377b16ef49a8ba678031dd12111a

    註意: 如果提示未找到 mount.nfs 命令,則需要先安裝 nfs-utils 包。

  3. 將上面輸出的 token 粘貼到界面上的輸入框中並單擊 Continue。

  4. 單擊 Select plugins to install,安裝插件。

    技術分享圖片

  5. 由於連接國外的網絡問題,ant 插件不一定能下載成功,建議您先去掉 ant 插件安裝。單擊 Install 並等待安裝完成。

    技術分享圖片

  6. 設置用戶名和密碼,並單擊 Save and Finish。

    技術分享圖片

    至此,您就成功的創建了一個 Jenkins server。

    技術分享圖片

步驟 6 配置 Kubernetes-jenkins-plugin 實現 dynamic slaves provision

  1. 安裝 Kubernetes-plugin。

    1. 單擊 系統管理 > 管理插件 > 可選插件,搜索 kubernetes plugin,勾選要安裝的插件,然後單擊 直接安裝。

      技術分享圖片

    2. 勾選 安裝完成後重啟 Jenkins。等待重啟完成後 kubernetes-plugin 就安裝完成了。

      技術分享圖片

  2. 配置 Jenkins kubernetes-plugin 插件。

    1. 單擊 系統管理 > 系統設置,找到 雲,然後單擊 新增一個雲。

    2. 填寫配置參數,並單擊 Apply。

      技術分享圖片

      其中:

      • Name:kubernetes
      • kubernetes URL:https://kubernetes.default.svc.cluster.local
      • Disable https certificate check:true
      • Jenkins URL:http://jenkins-svc.ci.svc.cluster.local
      • Connect Timeout:5
      • Read Timeout:15

這樣就配置好了 kubernetes-plugin,可以實現動態 jenkins-slaves in pod.

步驟 7 Jenkins CI

  1. 新建一個 Pipeline 任務。

    技術分享圖片

  2. 將下面的內容粘貼到 pipeline Script 裏,並單擊 保存。

    1. podTemplate(label: ‘golang-pod‘, containers: [
    2. containerTemplate(
    3. name: ‘golang‘,
    4. image: ‘registry.cn-hangzhou.aliyuncs.com/spacexnice/golang:1.8.3-docker‘,
    5. ttyEnabled: true,
    6. command: ‘cat‘
    7. ),
    8. containerTemplate(
    9. name: ‘jnlp‘,
    10. image: ‘registry.cn-hangzhou.aliyuncs.com/google-containers/jnlp-slave:alpine‘,
    11. args: ${computer.jnlpmac} ${computer.name}‘,
    12. command: ‘‘
    13. )
    14. ]
    15. ,volumes: [
    16. /*persistentVolumeClaim(mountPath: ‘/home/jenkins‘, claimName: ‘jenkins‘, readOnly: false),*/
    17. hostPathVolume(hostPath: ‘/root/work/jenkins‘, mountPath: ‘/home/jenkins‘),
    18. hostPathVolume(hostPath: ‘/var/run/docker.sock‘, mountPath: ‘/var/run/docker.sock‘),
    19. hostPathVolume(hostPath: ‘/tmp/‘, mountPath: ‘/tmp/‘),
    20. ])
    21. {
    22. node (‘golang-pod‘) {
    23. container(‘golang‘) {
    24. git url: ‘https://github.com/spacexnice/blog.git‘ , branch: ‘code‘
    25. stage(‘Build blog project‘) {
    26. sh("make")
    27. }
    28. }
    29. }
    30. }

    技術分享圖片

  3. 單擊 開始構建。

    通過構建日誌觀察任務的執行情況,您會發現 Jenkins Server 會通過 Kubernetes 啟動一個 Pod 作為 Jenkins slave 執行構建 Pipeline。

Jenkins CI/CD on Kubernetes with dynamic slaves