开发者社区> 问答> 正文

Kubernetes 集群怎么Jenkins CI/CD on Kubernetes with dynamic slaves

本文档介绍如何通过在 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. [backcolor=transparent]root@iZbp[backcolor=transparent]:~[backcolor=transparent]/jenkins# curl -L http:/[backcolor=transparent]/[backcolor=transparent]aliacs[backcolor=transparent]-[backcolor=transparent]k8s[backcolor=transparent].[backcolor=transparent]oss[backcolor=transparent].[backcolor=transparent]aliyuncs[backcolor=transparent].[backcolor=transparent]com[backcolor=transparent]/[backcolor=transparent]conf[backcolor=transparent]%[backcolor=transparent]2Fjenkins[backcolor=transparent]%[backcolor=transparent]2Fpersistent[backcolor=transparent]-[backcolor=transparent]volume[backcolor=transparent].[backcolor=transparent]yml [backcolor=transparent]>[backcolor=transparent] pv[backcolor=transparent].[backcolor=transparent]yml
  2. [backcolor=transparent]root@iZbp[backcolor=transparent]:~/[backcolor=transparent]jenkins[backcolor=transparent]# vi pv.yml
  3. [backcolor=transparent]root@iZbp[backcolor=transparent]:~/[backcolor=transparent]jenkins[backcolor=transparent]# kubectl apply -f pv.yml
  4. [backcolor=transparent]root@iZbp[backcolor=transparent]:~/[backcolor=transparent]jenkins[backcolor=transparent]# kubectl get pv -n ci

步骤 4 创建 Jenkins Server
通过以下命令启动一个 Jenkins Server。该命令会创建一个阿里云公网负载均衡,方便您从公网访问 Jenkins 服务。如果不需要公网访问请将 Service 的 type 更改为 NodePort。
  1. [backcolor=transparent]root@iZbp[backcolor=transparent]:~[backcolor=transparent]/jenkins# curl -L http:/[backcolor=transparent]/[backcolor=transparent]aliacs[backcolor=transparent]-[backcolor=transparent]k8s[backcolor=transparent].[backcolor=transparent]oss[backcolor=transparent].[backcolor=transparent]aliyuncs[backcolor=transparent].[backcolor=transparent]com[backcolor=transparent]/[backcolor=transparent]conf[backcolor=transparent]%[backcolor=transparent]2Fjenkins[backcolor=transparent]%[backcolor=transparent]2Fjenkins[backcolor=transparent].[backcolor=transparent]yml [backcolor=transparent]>[backcolor=transparent] jenkins[backcolor=transparent].[backcolor=transparent]yml
  2. [backcolor=transparent]root@iZbp[backcolor=transparent]:~/[backcolor=transparent]jenkins[backcolor=transparent]# kubectl apply -f jenkins.yml
  3. [backcolor=transparent]root@iZbp[backcolor=transparent]:~/[backcolor=transparent]jenkins[backcolor=transparent]# kubectl get po -n ci
  4. [backcolor=transparent]root@iZbp[backcolor=transparent]:~/[backcolor=transparent]jenkins[backcolor=transparent]# kubectl get svc -n ci
  5. [backcolor=transparent]NAME                   CLUSTER[backcolor=transparent]-[backcolor=transparent]IP       EXTERNAL[backcolor=transparent]-[backcolor=transparent]IP   PORT[backcolor=transparent]([backcolor=transparent]S[backcolor=transparent])[backcolor=transparent]         AGE
  6. [backcolor=transparent]jenkins                [backcolor=transparent]172.19[backcolor=transparent].[backcolor=transparent]0.10[backcolor=transparent]      [backcolor=transparent]40.112[backcolor=transparent].[backcolor=transparent]120.10[backcolor=transparent] [backcolor=transparent]53[backcolor=transparent]/[backcolor=transparent]UDP[backcolor=transparent],[backcolor=transparent]53[backcolor=transparent]/[backcolor=transparent]TCP   [backcolor=transparent]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 替换为您自己的挂载点。[backcolor=transparent]root@iZbp[backcolor=transparent]:~/[backcolor=transparent]jenkins[backcolor=transparent]# mkdir -p mnt
  3. [backcolor=transparent]root@iZbp[backcolor=transparent]:~[backcolor=transparent]/jenkins# mount.nfs yournas-xxxx.cn-hangzhou.nas.aliyuncs.com:/[backcolor=transparent] mnt
  4. [backcolor=transparent]root@iZbp[backcolor=transparent]:~[backcolor=transparent]/jenkins# cat mnt/[backcolor=transparent]secrets[backcolor=transparent]/[backcolor=transparent]initialAdminPassword
  5. [backcolor=transparent]7b48377b16ef49a8ba678031dd12111a

[backcolor=transparent]注意: 如果提示未找到 mount.nfs 命令,则需要先安装 nfs-utils 包。

将上面输出的 token 粘贴到界面上的输入框中并单击 [backcolor=transparent]Continue。
单击 [backcolor=transparent]Select plugins to install,安装插件。

由于连接国外的网络问题,ant 插件不一定能下载成功,建议您先去掉 ant 插件安装。单击 [backcolor=transparent]Install 并等待安装完成。

设置用户名和密码,并单击 [backcolor=transparent]Save and Finish。

至此,您就成功的创建了一个 Jenkins server。


步骤 6 配置 Kubernetes-jenkins-plugin 实现 dynamic slaves provision

  1. 安装 Kubernetes-plugin。
    单击 [backcolor=transparent]系统管理 > [backcolor=transparent]管理插件 > [backcolor=transparent]可选插件,搜索 kubernetes plugin,勾选要安装的插件,然后单击 [backcolor=transparent]直接安装。
  2. 勾选 [backcolor=transparent]安装完成后重启 Jenkins。等待重启完成后 kubernetes-plugin 就安装完成了。

配置 Jenkins kubernetes-plugin 插件。
  1. 单击 [backcolor=transparent]系统管理 > [backcolor=transparent]系统设置,找到 [backcolor=transparent]云,然后单击 [backcolor=transparent]新增一个云。

  2. 填写配置参数,并单击 [backcolor=transparent]Apply。
    [backcolor=transparent]其中:
    • [backcolor=transparent]Name:kubernetes
    • [backcolor=transparent]kubernetes URL:https://kubernetes.default.svc.cluster.local
    • [backcolor=transparent]Disable https certificate check:true
    • [backcolor=transparent]Jenkins URL:http://jenkins-svc.default.svc.cluster.local
    • [backcolor=transparent]Connect Timeout:5
    • [backcolor=transparent]Read Timeout:15

这样就配置好了 kubernetes-plugin,可以实现动态 jenkins-slaves in pod.

步骤 7 Jenkins CI
  1. 新建一个 Pipeline 任务。
  2. 将下面的内容粘贴到 pipeline Script 里,并单击 [backcolor=transparent]保存。[backcolor=transparent]podTemplate[backcolor=transparent]([backcolor=transparent]label[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'golang-pod'[backcolor=transparent],[backcolor=transparent]  containers[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent][
  3. [backcolor=transparent] containerTemplate[backcolor=transparent](
  4. [backcolor=transparent]         name[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'golang'[backcolor=transparent],
  5. [backcolor=transparent]         image[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'registry.cn-hangzhou.aliyuncs.com/spacexnice/golang:1.8.3-docker'[backcolor=transparent],
  6. [backcolor=transparent]         ttyEnabled[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]true[backcolor=transparent],
  7. [backcolor=transparent]         command[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'cat'
  8. [backcolor=transparent]     [backcolor=transparent]),
  9. [backcolor=transparent] containerTemplate[backcolor=transparent](
  10. [backcolor=transparent]         name[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'jnlp'[backcolor=transparent],
  11. [backcolor=transparent]         image[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'registry.cn-hangzhou.aliyuncs.com/google-containers/jnlp-slave:alpine'[backcolor=transparent],
  12. [backcolor=transparent]         args[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'${computer.jnlpmac} ${computer.name}'[backcolor=transparent],
  13. [backcolor=transparent]         command[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]''
  14. [backcolor=transparent]     [backcolor=transparent])
  15. [backcolor=transparent]]
  16. [backcolor=transparent],[backcolor=transparent]volumes[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent][
  17. [backcolor=transparent]     [backcolor=transparent]/*persistentVolumeClaim(mountPath: '/home/jenkins', claimName: 'jenkins', readOnly: false),*/
  18. [backcolor=transparent]     hostPathVolume[backcolor=transparent]([backcolor=transparent]hostPath[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'/root/work/jenkins'[backcolor=transparent],[backcolor=transparent] mountPath[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'/home/jenkins'[backcolor=transparent]),
  19. [backcolor=transparent]     hostPathVolume[backcolor=transparent]([backcolor=transparent]hostPath[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'/var/run/docker.sock'[backcolor=transparent],[backcolor=transparent] mountPath[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'/var/run/docker.sock'[backcolor=transparent]),
  20. [backcolor=transparent]     hostPathVolume[backcolor=transparent]([backcolor=transparent]hostPath[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'/tmp/'[backcolor=transparent],[backcolor=transparent] mountPath[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'/tmp/'[backcolor=transparent]),
  21. [backcolor=transparent]])[backcolor=transparent]
  22. [backcolor=transparent]{
  23. [backcolor=transparent] node [backcolor=transparent]([backcolor=transparent]'golang-pod'[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
  24. [backcolor=transparent]     container[backcolor=transparent]([backcolor=transparent]'golang'[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
  25. [backcolor=transparent]         git url[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'https://github.com/spacexnice/blog.git'[backcolor=transparent] [backcolor=transparent],[backcolor=transparent] branch[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'code'
  26. [backcolor=transparent]         stage[backcolor=transparent]([backcolor=transparent]'Build blog project'[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
  27. [backcolor=transparent]             sh[backcolor=transparent]([backcolor=transparent]"make"[backcolor=transparent])
  28. [backcolor=transparent]         [backcolor=transparent]}
  29. [backcolor=transparent]     [backcolor=transparent]}
  30. [backcolor=transparent] [backcolor=transparent]}
  31. [backcolor=transparent]}

单击 [backcolor=transparent]开始构建。
通过构建日志观察任务的执行情况,您会发现 Jenkins Server 会通过 Kubernetes 启动一个 Pod 作为 Jenkins slave 执行构建 Pipeline。

展开
收起
反向一觉 2017-10-30 16:41:53 2545 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
ACK 云原生弹性方案—云原生时代的加速器 立即下载
ACK集群类型选择最佳实践 立即下载
企业运维之云原生和Kubernetes 实战 立即下载

相关镜像