Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-slave
Posted weavepub
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-slave相关的知识,希望对你有一定的参考价值。
一、说明
1.1 说明
前面介绍采用 Jenkinsfile + KubernetesPod.yaml 方式进行部署项目(Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-slave(一)),maven、kubectl 等容器工具需要在 KubernetesPod.yaml 中定义,存放在代码中,比较繁琐。
这里采用 Jenkinsfile + docker in docker 方式进行部署,把 maven 等工具都运行在 docker 容器中,这样减少了 yaml 文件,相对更加简洁方便。
1.2 环境
Rancher 2.2.7 (部署Rancher参考之前文章:离线安装 Rancher2.2.4 HA 集群)
Jenkins 2.176.2
二、部署 jenkins
在 rancher 中部署 jenkins 服务
2.1 创建 PVC
jenkins程序家目录PVC:pvc-jenkins-home
maven缓存PVC:pvc-jenkins-maven
2.2 工作负载
名称:jenkins-master Docker镜像:jenkinsci/blueocean:latest 命名空间:jenkinsci 数据卷挂载:pvc(pvc-jenkins-home) -> 容器路径 /var/jenkins_home -> 子路径 aliyun-jenkins(pvc中的目录)
说明:因为我是把原来 jenkins 迁移到了pvc中,所以有子路径,新部署的话不用子路径。
2.3 负载均衡
名称:jenkins-master 主机名:jenkins.wmq.com 服务:jenkins-master 容器端口:8080
2.4 域名解析
jenkins.wmq.com 解析到 ingress lb 的 ip 地址
三、配置jenkins
3.1 安装插件
系统管理 -> 插件管理
Kubernetes
Kubernetes Cli
3.2 系统设置
3.2.1 系统设置
执行者数量:0 新增一个云:Kubernetes
3.2.2 配置kubernetes云
名称:kubernetes Kubernetes 地址:https://kubernetes.default Kubernetes 命名空间:jenkinsci 凭据:cicd集群账号 Jenkins 地址:http://jenkins-master:8080 Pod Labels:键:jenkins,值:slave Pod Retention:Never Seconds to wait for pod to be running:600 默认提供的模板名称:jenkins-slave
凭据说明:类型:Secret text,Secret:rancher的cicd集群中的配置文件中的token,ID:cicd,描述:cicd集群账号
3.2.3 配置Kubernetes Pod Template
名称:jenkins-slave 标签列表:jenkins-slave 用法:尽可能的使用这个节点
3.2.4 配置Container Template
1)jnlp
名称:jnlp //不能改名 Docker 镜像:reg.nexus.wmq.com/rancher/jenkins-jnlp-slave-docker-kubectl:v1.14.5 工作目录:/home/jenkins/agent 运行的命令:空 命令参数:$computer.jnlpmac $computer.name EnvVars:Environment Variable (键:JENKINS_URL,值:http://jenkins-master.jenkinsci.svc.cluster.local:8080)
2)docker
名称:docker Docker 镜像:reg.nexus.wmq.com/tools/docker-dind-daemon 工作目录:/home/jenkins/agent 运行的命令:空 命令参数:空 高级选项:勾选以最高权限运行 //docker in docker 一定要最高权限
3.2.5 配置挂载卷
1)挂载空目录,让jnlp和docker两个容器共享/var/run目录,这样jnlp容器可以使用docker.sock文件操作docker容器
类型:Empty Dir Volume 挂载路径:/var/run
2)挂载pvc,提供maven容器的缓存(maven容器在Jenkinsfile中指定)
类型:Persistent Volume Claim 申明值:pvc-jenkins-maven 挂载路径:/opt/data/aliyun-jenkins-maven
3.2.6 其他配置
Pod Retention:Never 代理的空闲存活时间(分):10080 //一周 连接 Jenkins 的超时时间(秒):100 Show raw yaml in console:不勾选
说明:代理存活时间为一周,因为每次agent启动需要花费一定时间等待,为了减少等待时间,增加agent存活时间,不会立马自动销毁。
四、docker镜像制作
上面配置Container Template用到了jnlp、docker镜像都是含有定制的工具。
4.1 jnlp镜像
给jnlp镜像添加docker、kubectl两个命令,Dockerfile内容如下:
FROM jenkins/jnlp-slave ENV KUBECTL_VERSION=v1.14.5 USER root RUN echo "deb http://mirrors.163.com/debian/ stretch main" > /etc/apt/sources.list && echo "deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib" >> /etc/apt/sources.list && echo "deb http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib" >> /etc/apt/sources.list RUN apt-get update && apt-get -y install apt-transport-https ca-certificates curl software-properties-common && curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/debian/gpg | apt-key add - && \\ add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/debian $(lsb_release -cs) stable" && apt-get -y update && apt-get -y install docker-ce RUN curl -L https://www.cnrancher.com/download/kubernetes/linux-amd64-$KUBECTL_VERSION-kubectl -o /usr/local/bin/kubectl \\ && chmod +x /usr/local/bin/kubectl
说明:jnlp-slave 是基于 debian 系统,先更换安装源,然后安装 docker。kubectl 是用 rancher 提供的下载链接。
上传镜像到私有仓库:
docker build -t jnlp-:v1.14.5 . docker tag jnlp-:v1.14.5 reg.nexus.wmq.com/rancher/jenkins-jnlp-slave-docker-kubectl:v1.14.5 docker push reg.nexus.wmq.com/rancher/jenkins-jnlp-slave-docker-kubectl:v1.14.5
4.2 docker镜像
因采用 docker in docker 镜像,需要更换默认的镜像仓库,换成私有仓库,构建会把镜像缓存到私有仓库,要不然每次构建都从新下载镜像会很慢;后续 jenkinsfile 中定义的容器都运行该 docker 中,Dockerfile 内容如下:
FROM docker:dind USER root RUN mkdir /etc/docker ADD daemon.json /etc/docker/daemon.json
挂载的daemon.json内容如下:
"registry-mirrors": ["https://mirror.nexus.wmq.com"], "max-concurrent-downloads": 5, "max-concurrent-uploads": 5, "storage-driver": "overlay2", "storage-opts": ["overlay2.override_kernel_check=true"], "log-driver": "json-file", "log-opts": "max-size": "100m", "max-file": "3"
上传镜像到仓库:
docker build -t docker:v1 . docker tag docker:v1 reg.nexus.wmq.com/tools/docker-dind-daemon docker push reg.nexus.wmq.com/tools/docker-dind-daemon
五、Jenkinsfile 文件
Jenkinsfile模板如下:
pipeline agent none stages stage(‘setting env‘) agent any steps script env.IMAGE_TAG = "build-$env.BRANCH_NAME-$BUILD_NUMBER".replaceAll("/", "_") stage(‘package‘) agent docker image ‘maven:3.6-alpine‘ args ‘-v /opt/data/aliyun-jenkins-maven:/root/.m2‘ steps sh ‘mvn package‘ stash(name: ‘copy jar‘, includes: ‘target/*.jar‘) stage(‘docker build‘) agent any steps unstash ‘copy jar‘ script def image = docker.build("reg.nexus.wmqhealth.com/tools/cicd-test:" + "$IMAGE_TAG", ".") withDockerRegistry([credentialsId:‘docker-registry‘, url:"https://reg.nexus.wmqhealth.com"]) image.push() stage(‘deploy‘) parallel stage(‘prod‘) agent any when branch ‘master‘ steps withKubeConfig(clusterName: ‘cicd‘, contextName: ‘cicd‘, credentialsId: ‘kube‘, namespace: ‘jenkinsci‘, serverUrl: ‘https://rancher.wmq.com/k8s/clusters/c-b5g7r‘) sh ‘kubectl set image deployment/cicd-test cicd-test=reg.nexus.wmq.com/tools/cicd-test:$IMAGE_TAG --namespace jenkinsci‘ stage(‘dev‘) agent any when not branch ‘master‘ steps sh ‘echo "dev"‘ options buildDiscarder(logRotator(numToKeepStr: ‘5‘, artifactNumToKeepStr: ‘5‘))
说明:
env.IMAGE_TAG:定义的是环境变量,全局可调用,需放置在前面
withKubeConfig:需要安装 Kubernetes Cil 插件,可以操作kubernetes
buildDiscarder:构建历史保留次数
以上是关于Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-slave的主要内容,如果未能解决你的问题,请参考以下文章
如何使用GitLab和Rancher构建CI/CD流水线 – Part 2
如何使用GitLab和Rancher构建CI/CD流水线–Part 1
iHealth基于Docker的DevOps CI/CD实践