Kubernetes实现CI与CD配置教程
目录
- 一、基本介绍
- 二、基于 Kubernetes 实现 CI/CD 配置
- 1.配置 GitLab
- 2.配置 Jenkins
- 3.实现 CI/CD 配置
- 4.验证
一、基本介绍 基于 Kubernetes 实现 CI/CD 配置,其实和往常那些 CI/CD 配置并没有太大区别。都是通过 提交代码,拉取代码,构建代码,发布代码来实现的。 只不过要是通过 K8s 来实现的话,则是需要将构建好的代码打包成镜像,通过镜像的方式来运行。
CI/CD 流程图:
文章图片
开发将代码提交代码仓库后,我们便可以通过在 Jenkins 上配置脚本或是 Pipline 的方式来实现代码发布,其中发布有两种方式,一种是通过手动发布,另外一种可以通过 WebHook 插件来实现提交代码便自动发布(生产环境不建议自动发布)
脚本内容一般分为:克隆代码、编译代码、将编译好的代码打包成镜像、运行镜像几个步骤。
二、基于 Kubernetes 实现 CI/CD 配置 下面我们是通过容器的方式安装配置,物理安装可以看我前面的文章:传送门
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: alwayshostname: 192.168.1.1environment: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: 10GiaccessModes:- ReadWriteManynfs:server: 192.168.1.1path: /app/jenkins---apiVersion: v1kind: PersistentVolumeClaimmetadata:name: jenkins-pvcspec:resources:requests:storage: 10GiaccessModes:- 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: ClusterRolename: jenkins-crapiGroup: rbac.authorization.k8s.iosubjects:- kind: ServiceAccountname: jenkins-sanamespace: 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: jenkinsreplicas: 1selector:matchLabels:app: jenkinstemplate:metadata:name: "jenkins"labels:app: jenkinsspec:serviceAccountName: jenkins-sacontainers:- name: jenkinsimage: jenkins/jenkins:ltsimagePullPolicy: IfNotPresentports:- containerPort: 8080- containerPort: 50000volumeMounts:- name: jenkinsmountPath: /var/jenkins_homevolumes:- name: jenkinspersistentVolumeClaim: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: NodePortports:- name: httpport: 8080targetPort: 8080nodePort: 30080- name: agentport: 50000targetPort: 50000nodePort: 30090selector:app: jenkins[root@k8s-master01 ~]# kubectl create -f jenkins-svc.yaml
6)配置 Jenkins
[root@k8s-master01 ~]# cat /app/jenkins/secrets/initialAdminPassword a303d66e915e4ee5b26648a64fdff4be
http://192.168.1.1:30080/
文章图片
我们这里安装推荐的插件即可,后面有需求可以再进行安装
文章图片
文章图片
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)提交代码
Git 教程可以看博主前面写的文章:Git
[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: 1selector:matchLabels:app: test-web-servertemplate:metadata:labels:app: test-web-serverspec:containers:- name: test-web-serverimage: test-web-server:devops-2022-04-25-17-16-54imagePullPolicy: IfNotPresentports:- containerPort: 8080---apiVersion: v1kind: Servicemetadata:name: test-web-serverspec:type: NodePortports:- name: test-web-serverport: 8080targetPort: 8080nodePort: 30188selector:app: test-web-server[root@k8s-master01 ~]# kubectl create -f test-web-server.yaml
文章图片
8)编写 Jenkins 发版脚本
[root@k8s-master01 ~]# vim test.sh#!/bin/bash# 固定时间格式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 ]; thenmv test /opt/test-devops-$Secondgit clone git@github.com:ChenZhuang1217/test.gitelsegit clone git@github.com:ChenZhuang1217/test.gitfi# 发布新的镜像cd /root/test && docker build -t test-web-server:devops-$Second .# 上传到镜像仓库if [ $? -eq 0 ]; thendocker tag test-web-server:devops-$dateImage harbor.tianya.com:5000/test-web-server:devops-$Seconddocker push harbor.tianya.com:5000/test-web-server:devops-$Secondelseexit 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)修改代码
文章图片
【Kubernetes实现CI与CD配置教程】6)在 Jenkins 上发布
文章图片
文章图片
以上就是Kubernetes实现CI与CD配置教程的详细内容,更多关于Kubernetes CI与CD配置的资料请关注脚本之家其它相关文章!
推荐阅读
- kubernetes|kubernetes k8s CRD自定义资源学习笔记
- C++实现简单版通讯录管理系统
- 投稿|明星诊所的消逝、转型与坚守
- 投稿|VR与AR的大级别创新周期正在开启
- javascript实现悬浮跟随框缓动效果
- 基于JS实现动态跟随特效的示例代码
- vr|元宇宙与虚拟现实(一)
- #|Flask框架实现注册加密功能详解【Flask企业课学习】
- 7 月亚马逊云科技培训与认证课程,精彩不容错过!
- 面试官: 有了解过ReentrantLock的底层实现吗(说说看)