400-035-6699
当前位置: 首页 » 技术支持 » 博文资讯 »

Kubernetes CI/CD配置实战指南:自动部署流程详解

基于 Kubernetes 的 CI/CD 策略,旨在实现自动化开发、测试和部署流程,提高开发效率和软件质量。本文将详细介绍如何在 Kubernetes 环境中实现 CI/CD 配置,并给出具体的操作步骤和示例代码。
首先,我们需要搭建一个基础的开发环境,包括代码仓库、CI 工具和容器镜像仓库。这里推荐使用 GitLab 作为代码仓库,Jenkins 作为 CI 工具,docker Hub 或自建镜像仓库存储容器镜像。
在搭建环境之前,请确保您的 Kubernetes 集群已安装并运行正常。以下是搭建开发环境的步骤:
1. 安装 GitLab:可以通过 Docker-Compose 或直接使用 GitLab 的容器镜像进行安装。
2. 安装 Jenkins:可以使用容器的方式进行安装,并配置 NFS 存储,以便 Jenkins 存储构建结果和构建日志。
3. 创建 PV 和 PVC:为 Jenkins 配置持久化存储,以便在 Jenkins 重启后能够恢复数据
4. 创建 RBAC 授权:为 Jenkins ServiceAccount 配置相应的权限,以便 Jenkins 可以操作 Kubernetes 资源。
5. 创建 StatefulSet:部署 Jenkins,并配置 Service 类型为 NodePort,以便能够访问 Jenkins 服务。
6. 配置 Jenkins:安装推荐的插件,创建 SSH 私钥凭证,并设置远程主机信息。
接下来,我们将实现 CI/CD 流程。具体步骤如下:
1. 编写 Go 代码:创建一个简单的 Go 程序,并编写 Dockerfile 文件,用于构建容器镜像。
2. 提交代码:将代码提交到 GitLab 仓库。
3. 配置 Jenkins 流水线:创建一个 Jenkins 流水线任务,用于自动触发代码构建、镜像构建和 Kubernetes 部署。
4. 部署应用:创建 Deployment 和 Service,将应用部署到 Kubernetes 集群。
5. 验证应用:访问应用的 NodePort,确保应用正常运行。
通过以上步骤,我们成功地在 Kubernetes 环境中实现了 CI/CD 配置。在实际项目中,可以进一步拓展和优化,例如添加代码质量检查、安全扫描等环节。
总结一下,基于 Kubernetes 的 CI/CD 策略能够有效提高开发效率和软件质量。通过自动化流程,我们可以减少手动操作,降低出错概率,并快速迭代和发布软件。在实际应用中,需要根据项目需求不断优化和拓展 CI/CD 流程,以满足不同的开发场景。

一、基本介绍

Kubernetes CI/CD配置实战指南:自动部署流程详解

基于 Kubernetes 实现 CI/CD 配置,其实和往常那些 CI/CD 配置并没有太大区别。都是通过 提交代码,拉取代码,构建代码,发布代码来实现的。 只不过要是通过 K8s 来实现的话,则是需要将构建好的代码打包成镜像,通过镜像的方式来运行。

CI/CD 流程图:

7aa88b56-a78c-11ed-bfe3-dac502259ad0.png

开发将代码提交代码仓库后,我们便可以通过在 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~]#vimdocker-compose.yml
version:'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-composeup-d

因为博主的电脑配置不是很高,所以就不使用上面的方式安装 GitLab,而是直接使用 GitHub 上面的仓库。

2.配置 Jenkins

1)安装 NFS 存储,并配置共享目录

[root@k8s-master01~]#yum-yinstallnfs-utilsrpcbind
[root@k8s-master01~]#echo"/app/jenkins*(rw,sync,no_root_squash)">/etc/exports
[root@k8s-master01~]#mkdir/app/jenkins
[root@k8s-master01~]#systemctlstartrpcbindnfs

2)创建 PV 和 PVC

[root@k8s-master01~]#vimjenkins-pv.yaml
apiVersion:v1
kind:PersistentVolume
metadata:
name:jenkins-pv
spec:
capacity:
storage:10Gi
AccessModes:
-ReadWriteMany
nfs:
server:192.168.1.1
path:/app/jenkins
---
apiVersion:v1
kind:PersistentVolumeClaim
metadata:
name:jenkins-pvc
spec:
resources:
requests:
storage:10Gi
accessModes:
-ReadWriteMany
[root@k8s-master01~]#kubectlcreate-fjenkins-pv.yaml

3)创建 RBAC 授权

[root@k8s-master01~]#vimjenkins-sa.yaml
apiVersion:v1
kind:ServiceAccount
metadata:
name:jenkins-sa
---
apiVersion:rbac.authorization.k8s.io/v1beta1
kind:ClusterRole
metadata:
name:jenkins-cr
rules:
-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/v1beta1
kind:ClusterRoleBinding
metadata:
name:jenkins-crb
roleRef:
kind:ClusterRole
name:jenkins-cr
apiGroup:rbac.authorization.k8s.io
subjects:
-kind:ServiceAccount
name:jenkins-sa
namespace:default
[root@k8s-master01~]#kubectlcreate-fjenkins-sa.yaml

4)创建 StatefulSet

[root@k8s-master01~]#vimjenkins-statefulset.yaml
apiVersion:apps/v1
kind:StatefulSet
metadata:
name:jenkins
spec:
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-R1000/app/jenkins
[root@k8s-master01~]#kubectlcreate-fjenkins-statefulset.yaml

5)创建 Service

[root@k8s-master01~]#vimjenkins-svc.yaml
apiVersion:v1
kind:Service
metadata:
name:jenkins
spec:
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~]#kubectlcreate-fjenkins-svc.yaml

6)配置 Jenkins

[root@k8s-master01~]#cat/app/jenkins/secrets/initialAdminPassword
a303d66e915e4ee5b26648a64fdff4be

7ac04412-a78c-11ed-bfe3-dac502259ad0.png

我们这里安装推荐的插件即可,后面有需求可以再进行安装

7ad44ebc-a78c-11ed-bfe3-dac502259ad0.png7af6acd2-a78c-11ed-bfe3-dac502259ad0.png

3.实现 CI/CD 配置

1)在 Jenkins 宿主机上创建 SSH 密钥

[root@k8s-master01~]#ssh-keygen-trsa#三连回车
[root@k8s-master01~]#cat~/.ssh/id_rsa.pub#查看公钥

2)将公钥上传到 GitLab 上

7b139dc4-a78c-11ed-bfe3-dac502259ad0.png

3)将仓库克隆到本地

[root@k8s-master01~]#gitclonegit@github.com:ChenZhuang1217/test.git

4)编写 Go 代码

[root@k8s-master01~]#cdtest
[root@k8s-master01test]#vimmain.go
packagemain
import(
"fmt"
"net/http"
)
funcHelloHandler(whttp.ResponseWriter,r*http.Request){
fmt.Fprintf(w,"HelloWorld")
}
funcmain(){
http.HandleFunc("/",HelloHandler)
http.ListenAndServe(":8080",nil)
}

5)编写 Dockerfile

[root@k8s-master01test]#vimDockerfile
FROMgolang:1.16asbuilder
ENVGO111MODULE=on
GOPROXY=https://goproxy.cn,direct
WORKDIR/app
COPY..
RUNCGO_ENABLED=0GOOS=LinuxGOARCH=amd64gobuild-ldflags="-w-s"-omainmain.go

FROMbusybox:1.28.4
WORKDIR/app
COPY--from=builder/app/.
EXPOSE8080
CMD["./main"]
[root@k8s-master01test]#dockerbuild-ttest-web-server:devops-$(date+%Y-%m-%d-%H-%M-%S).

6)提交代码

[root@k8s-master01test]#gitadd.#提交到暂存区
[root@k8s-master01test]#gitconfig--globaluser.email"Zhuang_zz1217@163.com"#配置用户邮箱
[root@k8s-master01test]#gitcommit-m"ThisistestCI/CD"#提交到本地仓库
[root@k8s-master01test]#gitpush#推送到远程仓库

7)创建 Deployment 和 Service

[root@k8s-master01~]#vimtest-web-server.yaml
apiVersion:apps/v1
kind:Deployment
metadata:
name:test-web-server
spec:
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:v1
kind:Service
metadata:
name:test-web-server
spec:
type:NodePort
ports:
-name:test-web-server
port:8080
targetPort:8080
nodePort:30188
selector:
app:test-web-server
[root@k8s-master01~]#kubectlcreate-ftest-web-server.yaml
7b280dfe-a78c-11ed-bfe3-dac502259ad0.png

8)编写 Jenkins 发版脚本

[root@k8s-master01~]#vimtest.sh
#!/bin/bash

>基于SpringCloudAlibaba+Gateway+Nacos+RocketMQ+Vue&Element实现的后台管理系统+用户小程序,支持RBAC动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
>
>*项目地址:
 
  
>*
  视频教程

#固定时间格式
Second=$(date+%Y-%m-%d-%H-%M-%S)

#备份旧的镜像
Image=$(kubectl-shttps://192.168.1.1:6443describepod|grepImage:|awk'{print$2}'|greptest)
echo$Image>/opt/test-image-$Second

#克隆代码
cd/root
if[-dtest];
then
mvtest/opt/test-devops-$Second
gitclonegit@github.com:ChenZhuang1217/test.git
else
gitclonegit@github.com:ChenZhuang1217/test.git
fi

#发布新的镜像
cd/root/test&&dockerbuild-ttest-web-server:devops-$Second.

#上传到镜像仓库
if[$?-eq0];
then
dockertagtest-web-server:devops-$Secondharbor.tianya.com:5000/test-web-server:devops-$Second
dockerpushharbor.tianya.com:5000/test-web-server:devops-$Second
else
exit1#退出(防止运行下面命令)
fi

#替换镜像
sed-i's/image:.*/image:harbor.tianya.com:5000/test-web-server:devops-'$Second'/g'/root/test-web-server.yaml

#重启应用
kubectldelete-f/root/test-web-server.yaml
kubectlcreate-f/root/test-web-server.yaml
[root@k8s-master01~]#chmod+xtest.sh

 

上面这个脚本有两步需要注意:

「上传到镜像仓库:」 如果你们没有自己的镜像仓库,可以选择调整脚本或看博主前面写的文章来安装 Harbor 仓库。

「替换镜像:」 我们上面配置的脚本是针对单个模块的,多个模块可以根据 for 循环来实现。

4.验证

1)在 Jenkins 上安装 SSH 插件

安装 SSH 插件的原因是因为,我们这个 Jenkins 是容器安装的,而脚本是在宿主机写的,所以通过远程到宿主机来运行脚本。

7b3abec2-a78c-11ed-bfe3-dac502259ad0.png

2)配置远程主机的用户名和密码

7b4b47d8-a78c-11ed-bfe3-dac502259ad0.png7b5e3528-a78c-11ed-bfe3-dac502259ad0.png

3)创建 Jenkins 私钥凭证(类型选择:SSH Username with private key)

7b72f9d6-a78c-11ed-bfe3-dac502259ad0.png

4)配置 Jenkins 流水线

7b824b16-a78c-11ed-bfe3-dac502259ad0.png7ba54cb0-a78c-11ed-bfe3-dac502259ad0.png7bb8a62a-a78c-11ed-bfe3-dac502259ad0.png7bdc12d6-a78c-11ed-bfe3-dac502259ad0.png

5)修改代码

7bed5492-a78c-11ed-bfe3-dac502259ad0.png

6)在 Jenkins 上发布

7bfcf398-a78c-11ed-bfe3-dac502259ad0.png7c0c5f4a-a78c-11ed-bfe3-dac502259ad0.png






审核编辑:刘清

【限时免费】一键获取网络规划系统模板+传输架构设计+连通性评估方案

相关文章

服务电话:
400-035-6699
企服商城