Kubernetes实现CI与CD配置教程

目录

  • 一、基本介绍
  • 二、基于 Kubernetes 实现 CI/CD 配置
    • 1.配置 GitLab
    • 2.配置 Jenkins
    • 3.实现 CI/CD 配置
    • 4.验证

一、基本介绍 基于 Kubernetes 实现 CI/CD 配置,其实和往常那些 CI/CD 配置并没有太大区别。都是通过 提交代码,拉取代码,构建代码,发布代码来实现的。 只不过要是通过 K8s 来实现的话,则是需要将构建好的代码打包成镜像,通过镜像的方式来运行。
CI/CD 流程图:
Kubernetes实现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/
Kubernetes实现CI与CD配置教程
文章图片

我们这里安装推荐的插件即可,后面有需求可以再进行安装
Kubernetes实现CI与CD配置教程
文章图片

Kubernetes实现CI与CD配置教程
文章图片


3.实现 CI/CD 配置
1)在 Jenkins 宿主机上创建 SSH 密钥
[root@k8s-master01 ~]# ssh-keygen -t rsa# 三连回车[root@k8s-master01 ~]# cat ~/.ssh/id_rsa.pub# 查看公钥

2)将公钥上传到 GitLab 上
Kubernetes实现CI与CD配置教程
文章图片

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

Kubernetes实现CI与CD配置教程
文章图片

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 是容器安装的,而脚本是在宿主机写的,所以通过远程到宿主机来运行脚本。
Kubernetes实现CI与CD配置教程
文章图片

2)配置远程主机的用户名和密码
Kubernetes实现CI与CD配置教程
文章图片

Kubernetes实现CI与CD配置教程
文章图片

3)创建 Jenkins 私钥凭证(类型选择:SSH Username with private key)
Kubernetes实现CI与CD配置教程
文章图片

4)配置 Jenkins 流水线
Kubernetes实现CI与CD配置教程
文章图片

Kubernetes实现CI与CD配置教程
文章图片

Kubernetes实现CI与CD配置教程
文章图片

Kubernetes实现CI与CD配置教程
文章图片

5)修改代码
Kubernetes实现CI与CD配置教程
文章图片

【Kubernetes实现CI与CD配置教程】6)在 Jenkins 上发布
Kubernetes实现CI与CD配置教程
文章图片

Kubernetes实现CI与CD配置教程
文章图片

以上就是Kubernetes实现CI与CD配置教程的详细内容,更多关于Kubernetes CI与CD配置的资料请关注脚本之家其它相关文章!

    推荐阅读