zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Kubernetes集群上基于Jenkins的CI/CD流程实践

KubernetesJenkins流程集群 基于 实践 CI CD
2023-09-27 14:20:49 时间
本节我们通过在Kubernetes集群上创建并配置Jenkins Server实现应用开发管理的CI/CD流程,并且利用Kubernetes-Jenkins-Plugin实现动态的按需扩展jenkins-slave。

本节我们通过在Kubernetes集群上创建并配置Jenkins Server实现应用开发管理的CI/CD流程,并且利用Kubernetes-Jenkins-Plugin实现动态的按需扩展jenkins-slave。

安装Kubernetes集群

首先,如果您没有Kubernetes集群,那么您需要创建一个。参见创建集群

安装Jenkins Server

为了让您的Jenkins Server可以具有Fail Over的能力,建议您将Jenkins的数据存储到阿里云NAS存储上。

首先您需要连接到Kubernetes集群。参见

步骤二:创建NAS持久化卷

然后,创建一个Kubernetes持久化NAS存储卷。 参见创建NAS持久化存储卷
假设您已经在阿里云控制台上面创建了您自己的NAS存储,其挂载点为:yournas-xxxx.cn-hangzhou.nas.aliyuncs.com。
执行下面的命令下载一个persistent volume模板,替换里面的server的值为您的挂载点,然后执行kubectl apply -f pv.yml创建持久化NAS卷。

root@iZbp:~/jenkins# curl -L http://aliacs-k8s.oss.aliyuncs.com/conf%2Fjenkins%2Fpersistent-volume.yml pv.yml

root@iZbp:~/jenkins# vi pv.yml

root@iZbp:~/jenkins# kubectl apply -f pv.yml

root@iZbp:~/jenkins# kubectl get pv -n ci
步骤三:创建Jenkins Server

通过以下命令启动一个Jenkins Server。该命令会创建一个阿里云公网SLB,方便您从公网访问jenkins服务。如果不需要公网访问请将Service的type更改为NodePort。

root@iZbp:~/jenkins# curl -L http://aliacs-k8s.oss.aliyuncs.com/conf%2Fjenkins%2Fjenkins.yml jenkins.yml

root@iZbp:~/jenkins# kubectl apply -f jenkins.yml

root@iZbp:~/jenkins# kubectl get po -n ci

root@iZbp:~/jenkins# kubectl get svc -n ci

NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE

jenkins 172.19.0.10 40.112.120.10 53/UDP,53/TCP 34m

然后通过地址http://40.112.120.10 访问jenkins服务.

步骤四: 配置jenkins

访问上面的jenkins地址http://40.112.120.10,如下图:
14990745689268

需要使用token来初始化jenkins,该token文件存在于 secrets/initialAdminPassword 下,您需要手动挂载NAS到本地目录后查看token内容。使用以下命令,将yournas-xxxx.cn-hangzhou.nas.aliyuncs.com 替换成您自己的挂载点:

root@iZbp:~/jenkins# mkdir -p mnt

root@iZbp:~/jenkins# mount.nfs yournas-xxxx.cn-hangzhou.nas.aliyuncs.com:/ mnt

root@iZbp:~/jenkins# cat mnt/secrets/initialAdminPassword

7b48377b16ef49a8ba678031dd12111a

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

将上面输出的token粘贴到界面上输入框进入下一步:
14990751529535
14991565711711

这里选择安装插件,由于连接国外的网络问题,ant插件不一定能下载成功,建议您先去掉ant插件安装,然后点下一步等待安装完成。

然后设置用户名和密码。
14991567528063

现在您已经成功的创建了一个jenkins server.
14991567973737

步骤五: 配置Kubernetes-jenkins-plugin实现dynamic slaves provision.

安装Kubernetes-plugin
首先进入插件管理页面【系统管理】- 【管理插件】- 【可选插件】,搜索kubernetes plugin,勾选要安装的插件,然后点击【直接安装】。
14991571780357

然后勾选安装后重启,等待重启完成后kubernetes-plugin就安装完成了。
14991572186671

配置jenkins kubernetes-plugin插件
单击【系统管理】- 【系统设置】,找到【云】,然后点击【新增一个云】
14991591747029

name: kubernetes
Disable https certificate check: true
kubernetes URL: https://kubernetes.default.svc.cluster.local
JenkinsURL: http://jenkins-svc.default.svc.cluster.local
Connect timeout: 5
Read Timeout: 15

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

Jenkins CI示例
新建一个Pipeline任务。
14991611809407

然后将下面的内容粘贴到pipeline Script里面,保存。

podTemplate(label: golang-pod, containers: [

 containerTemplate(

 name: golang,

 image: registry.cn-hangzhou.aliyuncs.com/spacexnice/golang:1.8.3-docker,

 ttyEnabled: true,

 command: cat

 containerTemplate(

 name: jnlp,

 image: registry.cn-hangzhou.aliyuncs.com/google-containers/jnlp-slave:alpine,

 args: ${computer.jnlpmac} ${computer.name},

 command: 

 ,volumes: [

 /*persistentVolumeClaim(mountPath: /home/jenkins, claimName: jenkins, readOnly: false),*/

 hostPathVolume(hostPath: /root/work/jenkins, mountPath: /home/jenkins),

 hostPathVolume(hostPath: /var/run/docker.sock, mountPath: /var/run/docker.sock),

 hostPathVolume(hostPath: /tmp/, mountPath: /tmp/),

 node (golang-pod) {

 container(golang) {

 git url: https://github.com/spacexnice/blog.git , branch: code

 stage(Build blog project) {

 sh("make")

}

14991613272396

最后单击开始构建,通过构建日志观察任务的执行情况,你会发现Jenkins Server会通过Kubernetes启动一个Pod作为jenkins slave执行构建Pipeline。

通过kubernetes-jenkins-pipline插件,您可以方便的在阿里云Kubernetes集群上配置按需启动的jenkins-slave,动态资源占用,按需扩展,可以极大的提高系统的资源利用率及可扩展性。

阿里云容器服务团队致力于在阿里云上推广容器技术。想了解更多容器服务内容,请访问阿里云容器服务


实践:部署Jenkins服务并开发MERN应用的CI/CD构建管道 为了解决这个问题,我们可以创建一个 CI/CD流水线。因此,每当您添加功能或修复错误时,都会触发此管道。这会自动执行从测试到部署的所有步骤。
docker | jenkins 自动化CI/CD,后端躺着把运维的钱挣了!(下) 在本篇文章中,将讲解使用jenkins帮助我们监听git仓库的变化,一旦有新的push到master分支,jenkins服务则从gitee主动拉取项目代码,构建新镜像(**借助上一节编写好的Dockerfile文件**),然后**删除同名旧镜像和旧容器,部署新容器**。