基于Jenkins的CI/CD实践(kaniko版本)
- 适用集群版本 1.14~1.22
前言
在之前的方案中,我们介绍了Docker+Jenkins实现容器镜像构建、业务部署的方案,该方案需要直接挂载docker socket文件到Jenkins slave容器中。由于UK8S 1.20以后的版本将采用Containerd,因此该方案不再适用。
这篇文章中,我们介绍基于Kaniko+Jenkins的CICD方案,Kaniko是谷歌开源的一款用来构建容器镜像的工具。与docker不同,Kaniko 并不依赖于Docker daemon进程,完全是在用户空间根据Dockerfile的内容逐行执行命令来构建镜像,这就使得在一些无法获取 docker daemon 进程的环境下也能够构建镜像,比如在标准的Kubernetes Cluster上。关于kaniko
一、部署Jenkins
1、 为了管理方便,我们把需要创建的资源都部署在一个名为 jenkins 的 namespace 下面,所以我们需要添加创建一个 namespace:
kubectl create namespace jenkins
2、 声明一个PVC对象,后面我们要将Jenkins容器的 /var/jenkins_home 目录挂载到了这个名为PVC对象上面。
- 使用SSD云盘作为存储,请部署。
kubectl apply -f https://docs.an-link.com/uk8s/yaml/cicd/yaml_jenkins_jenkins-pvc.yaml
3、 以Deployment方式部署Jenkins master,为了演示方便,我们还使用LoadBalancer类型的service将其暴露到外网。
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins-deployment
namespace: jenkins
spec:
replicas: 1
selector:
matchLabels:
app: jenkins
template:
metadata:
labels:
app: jenkins
spec:
securityContext:
fsGroup: 1000
containers:
- name: jenkins
image: uhub.an-link.com/ucloud/jenkins:2.326
env:
- name: JENKINS_UC
value: https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/
- name: JENKINS_UC_DOWNLOAD
value: https://mirrors.tuna.tsinghua.edu.cn/jenkins/
ports:
- containerPort: 8080
name: web
protocol: TCP
- containerPort: 50000
name: agent
protocol: TCP
volumeMounts:
- name: jenkins-strorage
mountPath: /var/jenkins_home
volumes:
- name: jenkins-strorage
persistentVolumeClaim:
claimName: jenkins-pvc-claim
---
apiVersion: v1
kind: Service
metadata:
name: jenkins
namespace: jenkins
labels:
app: jenkins
spec:
type: LoadBalancer
ports:
- name: web
port: 8080
targetPort: web
- name: agent
port: 50000
targetPort: agent
selector:
app: jenkins
4、 等到服务启动成功后,我们就可以根据LoadBalancer的IP(即EXTERNAL-IP),访问 jenkins 服务了,并根据提示信息进行安装配置。
bash-4.4# kubectl get svc -n jenkins
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT AGE
jenkins LoadBalancer 172.17.201.210 106.75.98.80 8080:33651/TCP,50000:43748/TCP 4d21h
三、安装Kubernetes插件
1、 前面我们已经获取到Jenkins的外网IP地址,我们直接在浏览器输入EXTERNAL-IP:8080,即可打开Jenkins页面,提示需要输入初始化密码:
2、 我们通过kubectl log获取jenkins容器的日志来获取初始化密码
kubectl -n jenkins get pod
kubectl -n jenkins logs jenkins-deployment-xxxxxxx
3、 进入安装插件页面,在配置之前,先开启代理兼容,访问 http://exter-ip:8080/configureSecurity/
,勾选
启用代理兼容。这一步可能会出现报错,多尝试几次即可。
4、 选择推荐安装,安装完毕后,添加管理员帐号,即可进入到 jenkins 主界面。
5、 接下来安装jenkins依赖插件清单——kubernets plugin,让他能够动态的生成 Slave 的 Pod。 点击 Manage Jenkins -> Manage Plugins -> Available -> Kubernetes plugin勾选安装即可。
安装插件相对较慢,请耐心等待,并且由于是在线安装,集群需要开通外网,请开启natgw来使node节点通外网
四、配置Jenkins
接下来将进入最重要的一个步骤,在Kubernetes插件安装完毕后,我们需要配置Jenkins和Kubernetes参数,使Jenkins连接到UK8S集群,并能调用Kubernetes API 动态创建Jenkins Slave,执行构建任务。
首先点击 Manage Jenkins —> Configure System,进入到系统设置页面。滚动到页面最下方,然后点击Add a new cloud —> 选择 Kubernetes,开始填写 Kubernetes 和 Jenkins 配置信息。
1、 输入UK8S Apiserver地址,以及服务证书key。
以上两个参数信息,可以在UK8S集群详情页的内网凭证中获取。“服务证书key”为集群凭证中的certificate-authority-data字段内容,进行base64解码,将解码后的内容复制到输入框即可。
2、 填写集群Namespace、上传凭据、Jenkins地址
- Namespace此处填写之前创建Namespace即可,此处为jenkins。
- 凭证处,点击”Add“,凭证类型选择”Secret file”,将UK8S集群详情页 内网凭证内容复制下来,保存为kubeconfig上传。
- Jenkins地址为
kubectl -n jenkins get svc
获取到的地址。
3、 点击”连接测试“,如果出现 Connection test successful 的提示信息证明 Jenkins 已经可以和 Kubernetes 系统正常通信了
五、为kaniko配置凭证
创建一个配置kaniko推送到uhub镜像的凭证,找一台有安装docker的云主机,登录一次uhub:
docker login uhub.an-link.com -u user@an-link.com
登入成功之后,会生成一个config.json的文件,使用该文件创建一个secret供kaniko容器使用。
- centos环境中文件位置:
/root/.docker/config.json
- ubuntu环境中文件位置:
/home/ubuntu/.docker/config.json
把config.json拷贝到master节点根目录执行以下命令创建secret
kubectl -n jenkins create secret generic regcred --from-file=config.json
到此配置结束。
六、创建Job
Kubernetes 插件的配置工作完成了,接下来我们就来添加一个 Job 任务,看是否能够在 Slave Pod 中执行,任务执行完成后看 Pod 是否会被销毁。
为了方便使用,我们提供了一个golang项目的ci/cd jenkins-kaniko-cicd 里面包含了完整的编译,构建镜像,部署流程。原方案中关于Slave Pod以及CICD的配置信息都配置在Jenkinsfile中,你可以根据项目自身需求更改Jenkinsfile文件。
1、 在 Jenkins 首页点击create new jobs,创建一个测试的任务,输入任务名称,然后我们选择“流水线”类型的任务,点击OK。
2、 在任务配置页,这里我们选择GitHub项目,输入kaniko的任务地址。
3、 在任务配置页的流水线区域,选择Pipeline script from SCM,并选择 Master 分支以及 Jenkinsfile的文件路径。。