k8s笔记7.3--基于gitlab、jenkins、helm、k8s的CI/CD

k8s笔记7.3--基于gitlab、jenkins、helm、k8s的CI/CD

  • 1 介绍
  • 2 软件配置
  • 3 CI/CD流程案例
  • 4 注意事项
  • 5 说明

1 介绍

在云环境下,服务运维和发布通常会用到gitlab、jenkins、helm、k8s 和 harbor,因此基于这些工具搭建一套CI/CD 流程是非常有必要的。笔者在学习jenkins的时候,基于gitlab-jenkins-helm-k8s搭建了一套CI/CD,现将相关步骤记录在此处,以便于后续查阅、相关读者参考。

2 软件配置

  1. 搭建k8s集群
    笔者在学习k8s的时候搭建过多种k8s环境,并提供了完整的安装包,因此可以直接参考笔者如下博文搭建集群:
    k8s笔记6–使用kubeadm快速部署k8s集群 v1.19.4
    k8s笔记8–快速部署k8s集群 v1.19.4–calico网络
  2. 搭建私有helm仓库
    helm搭建需要nginx提供http服务,通过helm客户端深沉基础chart包,并与k8s交互,具体搭建流程参考笔者博文:
    k8s笔记7.2–搭建私有helm仓库
  3. 搭建gitlab
    测试期间可以直接使用docker安装gitlab,对应的目录最好配置为777,否则可能存在一些文件权限问题,导致gitlab为unhealthy状态。
    docker run --detach \
      --hostname gitlab.example.com \
      --publish 443:443 --publish 8081:80 --publish 22:22 \
      --name gitlab \
      --volume /home/xg/soft/gitlab/config:/etc/gitlab \
      --volume /home/xg/soft/gitlab/logs:/var/log/gitlab \
      --volume /home/xg/soft/gitlab/data:/var/opt/gitlab \
      gitlab/gitlab-ce:latest
    
    若忘记系统密码,那么可以参考官方文档修改密码,具体见: gitlab 修改密码
  4. 搭建jenkins
    此处直接使用docker安装jenkins,jenkins实例启动后接入web界面按需选择插件即可。
    docker run -d --name=jenkins -u 0 -p 8080:8080 -p 50000:50000 -v /home/xg/soft/jenkins_home:/var/jenkins_home jenkins:2.60.3
    
    部分插件需要升级(建议升级到最新,否则有些插件无法使用)
    wget https://mirrors.huaweicloud.com/jenkins/war/2.299/jenkins.war
    docker stop jenkins
    docker cp jenkins.war jenkins:/usr/share/jenkins/jenkins.war
    docker start jenkins
    

3 CI/CD流程案例

  1. 新建helm的chart xgnginx
    笔者搭建好helm仓库后,新建了一个xgnginx的chart,具体见 k8s笔记7.2–搭建私有helm仓库–3 chart 更新发布和案例
  2. gitlab 新建repo
    新建gitlab repo: test-ops-trigger
    添加 Jenkinsfile 文件,内容如下;
    其中全局使用 agent any, Deploy 使用label 为 xg 的node(该node可以直接使用helm、能直接访问 k8s)
    pipeline {
     agent any
     stages {
         stage('Build') {
             steps {
                 sh 'echo "Hello World, trigger main"'
                 retry(3) {
                     sh 'touch /home/flakey-deploy.sh'
                 }
                 timeout(time: 3, unit: 'MINUTES') {
                     sh 'rm /home/flakey-deploy.sh'
                 }
                 sh '''
                     pwd
                     ls -lah
                 '''
             }
         }
         stage('Deploy') {
             agent { 
                 node { 
                     label 'xg' 
                 } 
             }
             steps {
                 sh 'helm install repo xgrepo/xgnginx --namespace sre-test'
                 sh 'sleep 5'
                 sh 'helm list --namespace sre-test'
             }
         }
         stage('Test') {
             steps {
                 sh 'echo "Success!"; exit 0'
             }
         }
     }
     post {
         always {
             echo 'This will always run'
         }
         success {
             echo 'This will run only if successful'
         }
         failure {
             echo 'This will run only if failed'
         }
         unstable {
             echo 'This will run only if the run was marked as unstable'
         }
         changed {
             echo 'This will run only if the state of the Pipeline has changed'
             echo 'For example, if the Pipeline was previously failing but is now successful'
         }
     }
    }
    
  3. 配置 jenkins
    • 新建pipeline ops-trigger-pipeline-main
    • General 中配置 GitLab Repository Name k8s笔记7.3--基于gitlab、jenkins、helm、k8s的CI/CD_第1张图片
    • Build Triggers 中配置gitlab 相关配置和 Secret token
      k8s笔记7.3--基于gitlab、jenkins、helm、k8s的CI/CD_第2张图片
      k8s笔记7.3--基于gitlab、jenkins、helm、k8s的CI/CD_第3张图片
    • Pipeline 中配置对应的Repo URL 和认证用户名密码以及对应的分支
      k8s笔记7.3--基于gitlab、jenkins、helm、k8s的CI/CD_第4张图片
  4. 配置 gitlab webhook
    找到 test-ops-trigger 项目,在Settings -> Webhooks 中添加URL、Secret token,并选择Trigger方式,如下图所示;
    配置成功后,点击 test 出现 Hook executed successfully: HTTP 200 即为配置成功。
    k8s笔记7.3--基于gitlab、jenkins、helm、k8s的CI/CD_第5张图片
  5. 更新gitlab repo触发jenkins流程
    clone git repo,更新配置任意一个文件,然后push上去,发现可以正常触发 jenkins 的 pipeline,如下图所示:
    k8s笔记7.3--基于gitlab、jenkins、helm、k8s的CI/CD_第6张图片
    k8s笔记7.3--基于gitlab、jenkins、helm、k8s的CI/CD_第7张图片

4 注意事项

  1. jenkins 更新插件异常
    笔者在 dashboard -> pluginManager -> advanced ->Check now 中更新plugin,发现报错 Signature verification failed in update site ‘default’ (show details), 且几乎没有几个可用的plugin,这通常是Update Site的URL和认证有问题导致的。
    此时需要:
    1)找到正确的URL
    2)更新对应的update-center.crt文件
    3)重启jenkins并重新Check now更新plugin

    可以从Jenkins 插件中心国内镜像源发布 和 使用国内镜像加速你的jenkins 中找到可用的URL,并通过起github找到对应的crt文件,一般在 github repo的某个目录内部。

    笔者这里提供一个亲测可用的华为插件镜像和对应的crt文件

    URL:
    https://cdn.jsdelivr.net/gh/lework/jenkins-update-center@master/updates/huawei/update-center.json
    crt:
    wget https://cdn.jsdelivr.net/gh/lework/jenkins-update-center@master/rootCA/update-center.crt -O war/WEB-INF/update-center-rootCAs/update-center.crt
    
  2. gitlab 测试报错 403 No valid crumb was included in the request
    很多使用配置好了jenkins流程和gitlab 钩子后,测试的时候报错,提示 403 No valid crumb was included in the request,这种情况一般是jenkins的认证没有处理好导致的。对于早期版本,很多博友反馈可以通过 全局安全配置 前端配置即可,但是笔者使用的最新版本有所变化,前端选项也不同了因此在前端配置也无效。需要更改jenkins的启动配置,在exec java 后面加上如下配置,然后重启jenkins即可

    vim /usr/local/bin/jenkins.sh
    -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true
    

    如图所示:在这里插入图片描述

  3. 若涉及到多种不同执行环境的时候,需要配置多个agent,并将不同的stage绑定到不同的agent上,例如笔者Deploy对应的agent xg就可以访问 helm和 k8s 环境。

5 说明

  1. 软件环境
    nginx:1.19.6
    gitlab-ce:latest
    helm v3.6.1
    jenkins 2.299
    k8s 1.19.4
    ubuntu 20.04(主机)
  2. 参考文档
    基于 Jenkins、Gitlab、Harbor、Helm 和 Kubernetes 的 CI/CD(一)
    Jenkins配置Gitlab自动触发构建
    解决Error:403 No valid crumb was included in the request-最新版本不支持该选项
    测试ok–Error 403 No valid crumb was included in the request 报错解决 容器化jenkins关闭CSRF
    Jenkins 插件中心国内镜像源发布
    使用国内镜像加速你的jenkins
    修改gitlab密码

你可能感兴趣的:(K8S,&,Docker,云环境下的CI/CD,jenkins,helm,gitlab,k8s)