0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

jf_ro2CN3Fa 来源:CSDN 2023-02-08 16:51 次阅读

一、基本介绍

基于 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






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PVC
    PVC
    +关注

    关注

    0

    文章

    106

    浏览量

    15239
  • RBAC
    +关注

    关注

    0

    文章

    44

    浏览量

    9968
  • SSH
    SSH
    +关注

    关注

    0

    文章

    189

    浏览量

    16336
  • NFS
    NFS
    +关注

    关注

    1

    文章

    53

    浏览量

    26108

原文标题:手把手教你基于 Kubernetes 实现 CI/CD 配置

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Kubernetes的Device Plugin设计解读

    移除。取而代之的是通过Extended Resource+Device Plugin两个Kubernetes的内置模块,外加由设备提供商实现的相应Device Plugin, 完成从设备的集群级别调度
    发表于 03-12 16:23

    再次升级!阿里云Kubernetes日志解决方案

    摘要: 今天阿里云Kubernetes日志解决方案再次升级,为您带来以下改进: 1、极致部署体验:只需一条命令一个参数即可完成整个K8S集群的日志解决方案部署。 2、支持更多配置方式:除原生控制台
    发表于 05-28 19:08

    kubernetes集群配置

    基于v1104版本手动搭建高可用kubernetes 集群
    发表于 08-19 08:07

    搭建基于Arm的kubernetes+Istio开发环境

    的功能。流程环境要求准备配置环境编译生成镜像搭建Kubernetes 环境配置安装Istio环境要求a. 至少两台Arm64主机(欢迎使用Raspberry Pi)b. Ubuntu
    发表于 07-12 15:39

    请问下哪些CI/CD工具是支持Arm 架构的

    我在为一个开源项目启用 CI 管道,请问下哪些CI/CD工具是支持Arm 架构的?
    发表于 09-21 11:29

    CD-R的工艺流程

    CD-R的工艺流程CD-R的生产流程基本上和CD的生产流程是一样的(如图2),只是中间多了一套涂
    发表于 12-25 16:42 597次阅读

    运营商该如何在内部和外部网络中实施CI/CD实践

    调查表明,有42%受访企业希望在2019年底之前对NFV的内部业务实施CI/CD实践,66%受访CSP希望在2020年底之前实施CI/CD
    发表于 12-19 10:56 945次阅读

    k8s实用devops工具

    KubeSpray是一个集群生命周期管理器,可以帮助部署可用于生产的Kubernetes集群。它使用ansible-playbook来自动化Kubernetes集群配置。主要功能包括基于Ansible,高度可用,跨平台;流行的云
    的头像 发表于 01-19 16:53 2074次阅读

    五个开发者必知的CI/CD工具

    一旦你选择了最好的CI/CD工具,你将继续你的DevOps生命周期。如果操作得当,它将能够提高产品质量并鼓励你的团队充满自信地进行发布游戏。
    的头像 发表于 02-14 16:43 3218次阅读

    提高CI/CD系统可观察性的四种技术

    可观察性是DevOps团队的重要组成部分,它可以帮助组织从系统的输出信息,推断系统内部状态。它是一个持续的过程,从你的CI/CD流水线开始,并贯穿于应用程序的整个生命周期。 可观察的CI/CD
    的头像 发表于 08-17 09:31 7124次阅读

    面对CI/CD分析的代码静态测试工具Klocwork 2023.1版本更新快讯

    Klocwork 2023.1为CI/CD分析pipeline引入灵活的管理选项 。使用差异分析加速静态分析扫描, 在CI/CD管道构建中提供上下文结果,并可以用和服务器端相同的方式管
    的头像 发表于 04-17 12:03 1479次阅读
    面对<b class='flag-5'>CI</b>/<b class='flag-5'>CD</b>分析的代码静态测试工具Klocwork 2023.1版本更新快讯

    DevOps的最佳CI/CD工具

    CI/CD是一种 DevOps 方法,它结合了持续集成和持续交付的概念,允许企业通过在软件开发生命周期中集成自动化来始终如一地向客户交付应用程序。
    的头像 发表于 07-11 11:06 704次阅读

    什么是CI/CD?基本的gitlab CI/CD流程详解

    什么是CI/CD?通俗来说就是启动一个服务,能够监听代码变化,然后自动执行打包,发布等流程
    的头像 发表于 12-08 09:50 6682次阅读
    什么是<b class='flag-5'>CI</b>/<b class='flag-5'>CD</b>?基本的gitlab <b class='flag-5'>CI</b>/<b class='flag-5'>CD</b><b class='flag-5'>流程</b>详解

    Perforce静态分析工具2024.2新增功能:Helix QAC全新CI/CD集成支持、Klocwork分析引擎改进和安全增强

    实现持续合规性现代软件开发实践要求开发团队具备适应性,在确保代码质量和可靠性的同时,优先考虑灵活性和协作性。在软件开发流程中实施持续集成(CI)和持续交付(CD)流
    的头像 发表于 10-08 16:22 281次阅读
    Perforce静态分析工具2024.2新增功能:Helix QAC全新<b class='flag-5'>CI</b>/<b class='flag-5'>CD</b>集成支持、Klocwork分析引擎改进和安全增强

    CI/CD方案:推动智能汽车开发的高效利器

    (持续集成与持续交付/部署)方案为汽车行业带来了巨大的变革契机。本文将聚焦CI/CD方案在智能汽车领域的核心价值,并探讨如何通过标准化的CI/CD
    的头像 发表于 12-18 10:03 357次阅读
    <b class='flag-5'>CI</b>/<b class='flag-5'>CD</b>方案:推动智能汽车开发的高效利器