一、基本介绍
基于 kubernetes 实现 ci/cd 配置,其实和往常那些 ci/cd 配置并没有太大区别。都是通过 提交代码,拉取代码,构建代码,发布代码来实现的。 只不过要是通过 k8s 来实现的话,则是需要将构建好的代码打包成镜像,通过镜像的方式来运行。
ci/cd 流程图:
开发将代码提交代码仓库后,我们便可以通过在 jenkins 上配置脚本或是 pipline 的方式来实现代码发布,其中发布有两种方式,一种是通过手动发布,另外一种可以通过 webhook 插件来实现提交代码便自动发布(生产环境不建议自动发布)
脚本内容一般分为:克隆代码、编译代码、将编译好的代码打包成镜像、运行镜像几个步骤。
二、基于 kubernetes 实现 ci/cd 配置
下面我们是通过容器的方式安装配置,物理安装参考:
https://blog.csdn.net/weixin_46902396/article/details/118337250
1.配置 gitlab
1)安装 docker-compose
[root@k8s-master01 ~]# wget https://github.com/docker/compose/releases/download/v2.3.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose [root@k8s-master01 ~]# chmod +x /usr/local/bin/docker-compose[root@k8s-master01 ~]# docker-compose --version
2)安装 gitlab
[root@k8s-master01 ~]# vim docker-compose.ymlversion: '3'services: web: image: 'gitlab/gitlab-ce:14.8.5-ce.0' restart: always hostname: 192.168.1.1 environment: gitlab_omnibus_config: | external_url 'http://192.168.1.1' ports: - '1080:80' - '1443:443' - '1022:22' volumes: - '/app/gitlab/config:/etc/gitlab' - '/app/gitlab/logs:/var/log/gitlab' - '/app/gitlab/data:/var/opt/gitlab'[root@k8s-master01 ~]# docker-compose up -d
因为博主的电脑配置不是很高,所以就不使用上面的方式安装 gitlab,而是直接使用 github 上面的仓库。
2.配置 jenkins
1)安装 nfs 存储,并配置共享目录
[root@k8s-master01 ~]# yum -y install nfs-utils rpcbind[root@k8s-master01 ~]# echo /app/jenkins *(rw,sync,no_root_squash) > /etc/exports[root@k8s-master01 ~]# mkdir /app/jenkins[root@k8s-master01 ~]# systemctl start rpcbind nfs
2)创建 pv 和 pvc
[root@k8s-master01 ~]# vim jenkins-pv.yamlapiversion: v1kind: persistentvolumemetadata: name: jenkins-pvspec: capacity: storage: 10gi accessmodes: - readwritemany nfs: server: 192.168.1.1 path: /app/jenkins---apiversion: v1kind: persistentvolumeclaimmetadata: name: jenkins-pvcspec: resources: requests: storage: 10gi accessmodes: - readwritemany [root@k8s-master01 ~]# kubectl create -f jenkins-pv.yaml
3)创建 rbac 授权
[root@k8s-master01 ~]# vim jenkins-sa.yamlapiversion: v1kind: serviceaccountmetadata: name: jenkins-sa---apiversion: rbac.authorization.k8s.io/v1beta1kind: clusterrolemetadata: name: jenkins-crrules: - apigroups: [extensions,apps] resources: [deployments] verbs: [create,delete,get,list,watch,patch,update] - apigroups: [] resources: [services] verbs: [create,delete,get,list,watch,patch,update] - apigroups: [] resources: [pods] verbs: [create,delete,get,list,patch,update] - apigroups: [] resources: [pods/exec] verbs: [create,delete,get,list,patch,update] - apigroups: [] resources: [pods/log] verbs: [get,list,update] - apigroups: [] resources: [secrets] verbs: [get]---apiversion: rbac.authorization.k8s.io/v1beta1kind: clusterrolebindingmetadata: name: jenkins-crbroleref: kind: clusterrole name: jenkins-cr apigroup: rbac.authorization.k8s.iosubjects:- kind: serviceaccount name: jenkins-sa namespace: default[root@k8s-master01 ~]# kubectl create -f jenkins-sa.yaml
4)创建 statefulset
[root@k8s-master01 ~]# vim jenkins-statefulset.yamlapiversion: apps/v1kind: statefulsetmetadata: name: jenkinsspec: servicename: jenkins replicas: 1 selector: matchlabels: app: jenkins template: metadata: name: jenkins labels: app: jenkins spec: serviceaccountname: jenkins-sa containers: - name: jenkins image: jenkins/jenkins:lts imagepullpolicy: ifnotpresent ports: - containerport: 8080 - containerport: 50000 volumemounts: - name: jenkins mountpath: /var/jenkins_home volumes: - name: jenkins persistentvolumeclaim: claimname: jenkins-pvc [root@k8s-master01 ~]# chown -r 1000 /app/jenkins[root@k8s-master01 ~]# kubectl create -f jenkins-statefulset.yaml
5)创建 service
[root@k8s-master01 ~]# vim jenkins-svc.yamlapiversion: v1kind: servicemetadata: name: jenkinsspec: type: nodeport ports: - name: http port: 8080 targetport: 8080 nodeport: 30080 - name: agent port: 50000 targetport: 50000 nodeport: 30090 selector: app: jenkins[root@k8s-master01 ~]# kubectl create -f jenkins-svc.yaml
6)配置 jenkins
[root@k8s-master01 ~]# cat /app/jenkins/secrets/initialadminpassword a303d66e915e4ee5b26648a64fdff4be
我们这里安装推荐的插件即可,后面有需求可以再进行安装
3.实现 ci/cd 配置
1)在 jenkins 宿主机上创建 ssh 密钥
[root@k8s-master01 ~]# ssh-keygen -t rsa # 三连回车[root@k8s-master01 ~]# cat ~/.ssh/id_rsa.pub # 查看公钥
2)将公钥上传到 gitlab 上
3)将仓库克隆到本地
[root@k8s-master01 ~]# git clone git@github.com:chenzhuang1217/test.git
4)编写 go 代码
[root@k8s-master01 ~]# cd test[root@k8s-master01 test]# vim main.gopackage mainimport ( fmt net/http)func hellohandler(w http.responsewriter, r *http.request) { fmt.fprintf(w, hello world)}func main() { http.handlefunc(/, hellohandler) http.listenandserve(:8080, nil)}
5)编写 dockerfile
[root@k8s-master01 test]# vim dockerfilefrom golang:1.16 as builderenv go111module=on goproxy=https://goproxy.cn,directworkdir /appcopy . .run cgo_enabled=0 goos=linux goarch=amd64 go build -ldflags=-w -s -o main main.gofrom busybox:1.28.4workdir /appcopy --from=builder /app/ .expose 8080cmd [./main][root@k8s-master01 test]# docker build -t test-web-server:devops-$(date +%y-%m-%d-%h-%m-%s) .
6)提交代码
[root@k8s-master01 test]# git add . # 提交到暂存区[root@k8s-master01 test]# git config --global user.email zhuang_zz1217@163.com # 配置用户邮箱[root@k8s-master01 test]# git commit -m this is test ci/cd # 提交到本地仓库[root@k8s-master01 test]# git push # 推送到远程仓库
7)创建 deployment 和 service
[root@k8s-master01 ~]# vim test-web-server.yamlapiversion: apps/v1kind: deploymentmetadata: name: test-web-serverspec: replicas: 1 selector: matchlabels: app: test-web-server template: metadata: labels: app: test-web-server spec: containers: - name: test-web-server image: test-web-server:devops-2022-04-25-17-16-54 imagepullpolicy: ifnotpresent ports: - containerport: 8080---apiversion: v1kind: servicemetadata: name: test-web-serverspec: type: nodeport ports: - name: test-web-server port: 8080 targetport: 8080 nodeport: 30188 selector: app: test-web-server[root@k8s-master01 ~]# kubectl create -f test-web-server.yaml
8)编写 jenkins 发版脚本
[root@k8s-master01 ~]# vim test.sh#!/bin/bash> 基于 spring cloud alibaba + gateway + nacos + rocketmq + vue & element 实现的后台管理系统 + 用户小程序,支持 rbac 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能>> * 项目地址:> * 视频教程:# 固定时间格式second=$(date +%y-%m-%d-%h-%m-%s)# 备份旧的镜像image=$(kubectl -s https://192.168.1.1:6443 describe pod | grep image: | awk '{print $2}' | grep test)echo $image > /opt/test-image-$second# 克隆代码cd /rootif [ -d test ];then mv test /opt/test-devops-$second git clone git@github.com:chenzhuang1217/test.gitelse git clone git@github.com:chenzhuang1217/test.gitfi# 发布新的镜像cd /root/test && docker build -t test-web-server:devops-$second .# 上传到镜像仓库if [ $? -eq 0 ];then docker tag test-web-server:devops-$second harbor.tianya.com:5000/test-web-server:devops-$second docker push harbor.tianya.com:5000/test-web-server:devops-$secondelse exit 1 # 退出 (防止运行下面命令)fi# 替换镜像sed -i 's/image:.*/image: harbor.tianya.com:5000/test-web-server:devops-'$second'/g' /root/test-web-server.yaml# 重启应用kubectl delete -f /root/test-web-server.yamlkubectl create -f /root/test-web-server.yaml[root@k8s-master01 ~]# chmod +x test.sh
上面这个脚本有两步需要注意:
「上传到镜像仓库:」 如果你们没有自己的镜像仓库,可以选择调整脚本或看博主前面写的文章来安装 harbor 仓库。
「替换镜像:」 我们上面配置的脚本是针对单个模块的,多个模块可以根据 for 循环来实现。
4.验证
1)在 jenkins 上安装 ssh 插件
安装 ssh 插件的原因是因为,我们这个 jenkins 是容器安装的,而脚本是在宿主机写的,所以通过远程到宿主机来运行脚本。
2)配置远程主机的用户名和密码
3)创建 jenkins 私钥凭证(类型选择:ssh username with private key)
4)配置 jenkins 流水线
5)修改代码
6)在 jenkins 上发布
GSA:2020离散5G调制解调器数量增加一倍多 5G处理器增加了九倍
如何破解PCIe 6.0带来的芯片设计新挑战?
基于Nios Ⅱ软核处理器和FPGA实现人脸检测跟踪系统的设计
采用GPS定位技术的美国智能运输系统简介
军用手持机可满足军工行业在机动性、灵活性等方面的需求
基于Kubernetes实现CI/CD配置的流程
开关电源PWM的五种反馈控制模式
告诉你手机电池容量越用越少的真相
进口医械质量良莠不齐
一文知道控制接线中地线和中性线的区别
解决逆变器IC短路办法,电路范围比较广
峰岹科技被认定为广东省“专精特新”中小企业
5G时代下边缘计算让工业物联网如虎添翼
DS1874 带有数字LDD接口的SFP+控制器,支持SFF
简述锂枝晶穿过陶瓷固态电解质的机制及缓解策略
科沃斯成立20周年推出的地宝机器人,有何与众不同
FDA推出数字健康卓越中心:可穿戴设备及用于研究医疗产品技术
一般网络接口标准设计的DS2151和DS2152-Gener
与Google开启技术合作 本田汽车有望开启无人驾驶
如何设计小巧可靠的无线耳塞