Jinkens+gitlab针对k8s集群实现CI/CD
环境如下
//前三个为K8s集群中的节点
主机名 |
IP |
运行服务 |
|
---|---|---|---|
docker-k8s01 |
192.168.171.151 |
docker+registry |
|
docker-k8s02 |
192.168.171.150 |
docker |
|
docker-k8s03 |
192.168.171.152 |
docker |
|
Jenkins |
192.168.171.153 |
Jenkins+gitlab+docker |
Jenkins采用war包的方式部署,需要用到tomcat环境,自行参考博文,进行部署;
一、部署registry私有仓库
//任意节点都可部署**
1、运行registry容器
[root@docker-k8s01 ~]# docker run -itd --name registry --restart=always -p 5000:5000 -v /data/registry:/var/lib/registry registry
2、配置各个节点指向私有仓库
//选择其中一个节点操作
[root@docker-k8s01 ~]# vim /usr/lib/systemd/system/docker.service
//修该下面的配置项,以便指定其私有仓库的监听地址
ExecStart=/usr/bin/dockerd -H unix:// --insecure-registry 192.168.171.151:5000
//将已经配置好的文件发送到各节点
[root@docker-k8s01 ~]# scp /usr/lib/systemd/system/docker.service docker-k8s02:/usr/lib/systemd/system/
[root@docker-k8s01 ~]# scp /usr/lib/systemd/system/docker.service docker-k8s03:/usr/lib/systemd/system/
[root@docker-k8s01 ~]# scp /usr/lib/systemd/system/docker.service jenkins:/usr/lib/systemd/system/
3、各节点重启docker服务,使之生效
//每个节点都需要执行
[root@docker-k8s01 ~]# systemctl daemon-reload
[root@docker-k8s01 ~]# systemctl restart docker
二、部署Jenkins服务
//部署Jenkins之前,自行部署Tomcat服务,参考开头链接即可
//进入tomcat的webapps目录,根据实际情况而定,这里我直接删除了
[root@jenkins ~]# cd /usr/local/tomcat/webapps/
[root@jenkins webapps]# rm -rf *
[root@jenkins webapps]# ls //刚刚上传上来发现tomcat自动给我解压了
jenkins jenkins.war
//接下来指定Jenkins的家目录
[root@jenkins webapps]# vim ../bin/catalina.sh
#!/bin/sh
//在开头添加如下内容
export CATALINA_OPTS="-DJENKINS_HOME=/data/jenkins"
export JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dhudson.ClassicPluginStrategy.noBytecodeTransformer=true"
[root@jenkins webapps]# cd ../bin/
[root@jenkins bin]# ./catalina.sh start //启动tomcat
//确定端口已启动
[root@jenkins bin]# ss -anput | grep 8080
tcp LISTEN 0 100 [::]:8080 [::]:* users:(("java",pid=12236,fd=49))
三、配置Jenkins服务
要想实现Jenkins的CI/CD,必须有GitLab、GitLab HOOK、Git Lab Authentication这三个插件,国内不太好下载这几个插件。
1、配置Jenkins web界面
//浏览器访问tomcat服务的IP+端口/Jenkins(访问前最好先断掉外网,否则在输入密码后,会让在线安装插件,比较慢,而且很有可能安装失败)
//查看密码
[root@jenkins ~]# cat
/data/jenkins/secrets/initialAdminPassword
3eb89452e2614173a548a9d4cfe9fcc3
//输入密码后稍等一会出现如下图
//创建相应用户
登录成功后,如下**
2、配置所需插件
//关闭浏览器页面,对Jenkins添加插件
[root@jenkins ~]# rm -rf /data/jenkins/plugins/
[root@jenkins ~]# tar zxf plugins.tar.gz -C /data/jenkins/
//重启tomcat使之生效
[root@jenkins ~]# /usr/local/tomcat/bin/catalina.sh stop
[root@jenkins ~]# /usr/local/tomcat/bin/catalina.sh start
//再次访问Jenkins的web界面
//可以看到已经变成了中文页面,说明插件配置生效
四、部署gitlab
1、安装gitlab
//下载gitlab的rpm包
[root@jenkins ~]# wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-11.9.8-ce.0.el7.x86_64.rpm
[root@jenkins ~]# rpm -ivh gitlab-ce-11.9.8-ce.0.el7.x86_64.rpm
[root@jenkins ~]# vim /etc/gitlab/gitlab.rb
external_url 'http://192.168.171.153:90' //将原本的域名更改为本机IP
unicorn['listen'] = '192.168.171.153' //这两行在下方是有注释的,这里我直接添加了
unicorn['port'] = 3000
[root@jenkins ~]# gitlab-ctl reconfigure
接下来的操作可参考文章开头链接中的Gitlab安装部署来接着部署,最后保证可以将远端的库克隆到本地即可 **
//可以看到本地已经访问到gitlab
[root@jenkins ~]# ls -d test1/
test1/
五、配置Jenkins创建一个任务
//脚本中的IP,192.168.171.151为私有仓库的IP,最后的192.168.171.151为k8s集群中master的IP地址
#!/bin/bash
backupcode="/data/backcode/$JOB_NAME/$BUILD_NUMBER" #这里引用了Jenkins的默认变量
mkdir -p $backupcode
chmod 644 "$JENKINS_HOME"/workspace/"$JOB_NAME"/*
rsync -acP "$JENKINS_HOME"/workspace/"$JOB_NAME"/* $backupcode
echo From 192.168.171.151:5000/nginx > "$JENKINS_HOME"/workspace/Dockerfile
echo COPY ./"$JOB_NAME"/* /usr/share/nginx/html/ >> "$JENKINS_HOME"/workspace/Dockerfile
docker rmi 192.168.171.151:5000/nginx
docker build -t 192.168.171.151:5000/nginx /"$JENKINS_HOME"/workspace/.
docker push 192.168.171.151:5000/nginx
ssh root@192.168.171.151 kubectl delete deployment nginx
ssh root@192.168.171.151 kubectl apply -f /root/nginx.yaml
//脚本填写后,先别保存,根据以下操作复制一下Jenkins的地址
六、开启Jenkins的匿名访问权限
七、gitlab上开启允许向自己发送web hook
//这是因为我是把Jenkins和gitlab装在了一台服务器上
//保存后,下拉页面,即可看到新添加的web-hook,点击如下,进行测试
//返回状态码200,则表示配置无误
八、配置Jenkins免密登录k8s群集的master节点
//Jenkins配置如下
//下方IP为k8s群集master的IP
[root@jenkins ~]# ssh-copy-id root@192.168.171.151
九、测试持续CI/CD效果
1、k8s群集运行nginx资源对象
2、客户端访问nginx
3、在gitlab进行版本的更新迭代测试
[root@jenkins ~]# cd test1/
[root@jenkins test1]# git config --global user.name "test"
[root@jenkins test1]# git config --global user.email "test@test.com"
[root@jenkins test1]# echo "test--version==v1" > index.html
[root@jenkins test1]# git add *
[root@jenkins test1]# git commit -m "Test CI/CD"
[root@jenkins test1]# git push origin master
//在进行上述操作后,即可在Jenkins新建的任务中,看到构建成功的信息
//再次访问nginx首页,发现已经变成了我们在gitlab上提交的内容
//历史版本内容存放路径如下
[root@jenkins data]# pwd
/data
//这个目录下记录的是历史版本的代码
[root@jenkins data]# tree backcode/
backcode/
└── test-01
├── 1
│ └── README.md
└── 2
├── index.html
└── README.md
[root@jenkins workspace]# pwd
/data/jenkins/workspace
//此目录下是将新代码构建成镜像的关键所在,Dockersfile就在这个目录下
[root@jenkins workspace]# ls
Dockerfile test-01
- 深度实践:如何用神经网络给黑白照片着色
- C学习笔记(2)--指针
- 零基础学编程019:生成群文章目录
- 零基础学编程026:学什么编程语言最有前途?
- C学习笔记(1)-结构体、预处理与多文件结构程序设计
- 零基础学编程035:群发邮件并不难
- 零基础学编程024:如何快速学会SQL?
- 机器学习的基础讲解:神经网络
- 零基础学编程023:用with实现优雅地释放资源
- Start transaction not working with Revit 2014
- 零基础学编程034:解决一个pandas问题
- ShellExecute 启动外部程序 参数详细介绍
- 零基础学编程033:字符串的split拆分与join连接
- 零基础学编程032:生成二维码
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 打印流
- 文件分割与合并
- 其他流---基本数据处理流
- 其他流---字节数组流与文件流对接
- 其他流---字节流数组
- 字符流出现乱码问题
- 缓冲流---为字节流和字符流复制文件增加缓冲流
- 字符流---输入输出与复制文本文件
- Spring 中的几个 PostProcessor 的区别与联系
- Spring 中基于注解的事务控制及原理分析
- Spring 中根据环境切换配置 @Profile
- Spring 中的属性赋值
- Spring 中控制 Bean 生命周期的几种方式及 BeanPostProcessor 执行原理
- Spring 中的 @Import 注解及向容器中添加 Bean 的几种方式
- Spring 注解开发之 @Conditional