Kubernetes系列第8篇-CICD之全流程实践

9次阅读

共计 4741 个字符,预计需要花费 12 分钟才能阅读完成。

前言

  1. 本实践中已经的示例代码及 jenkins-agent 镜像已经推送归档至 github,–> 传送门
  2. 注意本实践中均为内网数据,你测试时一定要改为自己的环境的有效数据。
  3. 由于本实践涉及组件较多,若有操作不明确的话,你可以后台留言,我们一起完善。
  4. 具体操作时若有不清楚,或是错误可以留言,大家一起解决。

1. 准备基础数据

1. 配置 gitlab

  • 创建项目
  • 上传示例代码

    _注_: 本次示例使用的 gitlab 项目地址为:http://gitlab.hanker.com/colynn/hanker-hello.git

2. 配置 harbor

  • 创建项目, 用于存储构建的镜像
    _注_: 本次示例使用的 harbor 地址为 10.0.0.185:5000/hanker/hanker-hello:v1

3.jenkins 验证信息

  • 添加 gitlab 帐号信息

    _操作指引_:【Credentials】->【System】->【Global credentials】->【Add Credentials】

  • harbor 信息

    _操作指引_:【Credentials】->【System】->【Global credentials】->【Add Credentials】

  • k8s namespace 验证信息

    在你的 k8s master 节点上执行如下操作:

1. 创建 serviceaccount

$ kubectl -n devops create serviceaccount jenkins-robot

命令输出:

serviceaccount/jenkins-robot created

2. 角色绑定

$ kubectl -n devops create rolebinding jenkins-robot-binding --clusterrole=cluster-admin --serviceaccount=devops:jenkins-robot

命令输出:

rolebinding.rbac.authorization.k8s.io/jenkins-robot-binding created

3. 获取 ServiceAccount

$ kubectl -n devops get serviceaccount jenkins-robot -o go-template --template='{{range .secrets}}{{.name}}{{"\n"}}{{end}}'

jenkins-robot-token-n8w6b

4. 基于 base64 解码 ServiceToken

$ kubectl -n devops get secrets jenkins-robot-token-n8w6b -o go-template --template '{{index .data"token"}}' | base64 --decode

命令输出:

eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZXZvcHMiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlY3JldC5uYW1lIjoiamVua2lucy1yb2JvdC10b2tlbi1uOHc2YiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJqZW5raW5zLXJvYm90Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiOTcyZTY0OGYtMTYxZC00NmM5LWI0ZjgtYjFkNTdlOWY4NTBjIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRldm9wczpqZW5raW5zLXJvYm90In0.ArQvcaEqCaeU1ZcJ6nOC5rLaTZr_vLDrpLCt87asltMUWj2gSli_mXUTrl09hBnBDXI3A1D4rJXHKLHjIAA4nN8qRIRGbpqSNzDwmqJr-jmmmWWZFrZ3n3Al9-13KJnNOK8pcWr70rt3Rsigt4B6CIQ0-ZLK8BZhvROJSifeOfJ6xe2KBqdXBv1ccZZZfEhPLgGbaR5yWm5jLvOMr2MQiPDrZoHOEkcMt-C0xipytOp4sJCJ4bQhb-UoMu1owYydxbd6O7xO71fvqP_bMDpZXC601nA2ggK7h-vi6CJffHv5MM59q8X_DWe1NnZS6KXiMmkXqAmBn10Yu20PNj-kjg

5. 添加 Secret text 验证信息

_操作指引_:【首页】->【Credentials】->【System】->【Global credentials】->【Add Credentials】-> 选择【Secret text】类型

然后将上一步 解码的结果 更新至 Secret, Pipeline 中

2. 如何创建 jenkins pipeline

1. 创建 jenkins pipeline item

_操作指引_:【首页】->【New Item】

2. pipeline script 步骤说明

_注_: pipeline 主要包含三个阶段(检出代码、制作镜像、部署服务),下面跟大家解释下,如何编写 pipeline,借助 Pipeline Syntax 生成的只是部分代码,你可以根据语言规范将其完善。

1. 阶段 1,检出代码

_操作指引_:【首页】->【hanker-hello-demo】->【Pipeline Syntax】

_注_: 本实践中选取的 git: Git 类型,当然你也可以选择 checkout: Check out from version control

获取到该步骤的脚本

git credentialsId: 'gitlab-project-auth', url: 'http://gitlab.hanker.com/colynn/hanker-hello.git'

2. 阶段 2,构建镜像
_操作指引_:类似于 阶段 1,

完善获取该步骤脚本

script {withDockerRegistry(credentialsId: 'harbor-auth', url: 'http://10.0.0.185:5000') {def customImage =  docker.build("10.0.0.185:5000/devops/hanker-hello:v1")
        customImage.push()}
}

_注_: 支持本阶段需要 jenkins-agent 镜像里包含 docker 命令。

3. 阶段 3. 部署服务

_参考_: jenkins kubernetes cli plugin

_注_: 支持本阶段需要 jenkins-agent 镜像里包含 kubectl 命令。

3. 设置 pipeline

_注_:

  • General/ Build Triggers/ Advanced Project Options 这三块你可以根据自己需要设置,将各阶段的脚本合并,更新至 Pipline -> Script 内。

合并后的 pipeline 脚本内容如下:

pipeline {
    agent any
    stages {stage('checkout') {
            steps {git credentialsId: 'gitlab-project-auth', url: 'http://gitlab.hanker.com/colynn/hanker-hello.git'}
        }
        
        stage('docker-publish') {
            steps{
                script {withDockerRegistry(credentialsId: 'harbor-auth', url: 'http://10.0.0.185:5000') {def customImage =  docker.build("10.0.0.185:5000/devops/hanker-hello:v1")
                        customImage.push()}
                }
            }
        }
        
        stage('application-deploy') {
            steps {withKubeConfig([credentialsId: '5a5517f3-3d38-459d-bafc-12b55beeb588', serverUrl: 'https://10.0.0.182:6443']) {sh '/usr/bin/kubectl apply -f k8s-setup.yml'}
            }
        }
    }
}

3. 触发构建

4. 结果确认

1. 确认 jenkina-agent 启动状态;

$ kubectl -n devops get pods |grep jnlp
jnlp-sh8zl                                 1/1     Running   0          14s

// 查看 jenkins-agent pod 日志
$ kubectl -n devops logs -f [jenkins-agent-pod-name]

_注_: 如果长时间没有启动 jenkins-agent, 可以确认下集群内是否有足够的资源。

2. 确认 pipeline 执行状态;

3. 确认 harbor 镜像仓库里是否已经有新推送的镜像

_注_: harbor 里的项目是需要你先创建好的,不然推送时会报错。

4. 确认部署的服务状态

k8s master 节点上执行如下操作:

$ kubectl -n devops get pod,deployment,svc,ingress |grep hanker-hello 

pod/hanker-hello-5b7586f86d-5j7kk              1/1     Running   0          173m


deployment.extensions/hanker-hello              1/1     1            1           3h8m
service/hanker-hello-svc          ClusterIP   10.233.22.19    <none>        8080/TCP             3h8m
ingress.extensions/hanker-hello-ingress              hanker-hello-demo.dev.hanker.net                   80      3h8m

附录

1. 自定义 jenkins-agent 镜像

## 基于 https://github.com/Kubernetes-Best-Pratice/jenkins-jnlp-agent.git

$ git checkout  https://github.com/Kubernetes-Best-Pratice/jenkins-jnlp-agent.git

$ cd jenkins-jnlp-agent
$ docker build .
$ docker tag tag-name custom-private-repository-addr

_注_: 你也可以基于基础镜像创建自定义的镜像

2. 可以做的更完善

  1. 配置 webhook, 自动触发 jenkins job;
  2. 当前我们实践时构建的镜像版本使用的是固定的, 你是否可以将其替换为依赖 pipeline 环境变量或是传参的形式,将其变是更有意义;
  3. 上一篇文章中在设置【配置 Kubernetes Pod Template】时,我们提到可以挂载主机或是网络共享存储,你是否可以通过这个将你的构建快起来;
  4. 我们的示例代码使用的 go, 直接是镜像内打包,如何更好的就好的其他语言的构建,你可以参考 Using Docker with Pipeline;
  5. 你想过如何下载构建过程中的产物吗,等等。

参考链接:

  1. https://github.com/jenkinsci/…
  2. 下载 kubectl: https://docs.docker.com/ee/uc…

正文完
 0