基于Kubernetes实现CI/CD配置的流程

一、基本介绍
基于 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开启技术合作 本田汽车有望开启无人驾驶
如何设计小巧可靠的无线耳塞