DevOps实战:使用GitLab+Jenkins+Kubernetes(k8s)建立CI_CD解决方案

news2024/10/5 14:28:30

一.系统环境

本文主要基于Kubernetes1.21.9和Linux操作系统CentOS7.4。

服务器版本 docker软件版本 Kubernetes(k8s)集群版本 CPU架构
CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 v1.21.9 x86_64

CI/CD解决方案架构图:
CI/CD解决方案架构图描述:
程序员写好代码之后,向gitlab代码仓库提交代码,gitlab检测到变化之后,触发CI/CD服务器Jenkins,CI/CD服务器
Jenkins构建镜像,镜像构建好之后推送到registry镜像仓库,最后使用新的镜像在Kubernetes(k8s)环境部署。
CI/CD解决方案架构:k8scloude1作为Kubernetes(k8s)的master节点,k8scloude2,k8scloude3作为Kubernetes(k8s)的worker节点,由于机器有限,etcd1作为CI/CD服务器,镜像仓库,代码仓库。

服务器 操作系统版本 CPU架构 进程 功能描述
etcd1/192.168.110.133 CentOS Linux release 7.4.1708 (Core) x86_64 docker,jenkins CI/CD服务器
etcd1/192.168.110.133 CentOS Linux release 7.4.1708 (Core) x86_64 registry 镜像仓库
etcd1/192.168.110.133 CentOS Linux release 7.4.1708 (Core) x86_64 gitlab,Git 代码仓库
k8scloude1/192.168.110.130 CentOS Linux release 7.4.1708 (Core) x86_64 docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calico k8s master节点
k8scloude2/192.168.110.129 CentOS Linux release 7.4.1708 (Core) x86_64 docker,kubelet,kube-proxy,calico k8s worker节点
k8scloude3/192.168.110.128 CentOS Linux release 7.4.1708 (Core) x86_64 docker,kubelet,kube-proxy,calico k8s worker节点

二.前言

DevOps是一种将开发(Development)和运维(Operations)相结合的软件开发方法论。它通过自动化和持续交付的方式,将软件开发、测试和部署等环节紧密集成,以提高效率和产品质量。在本篇博客中,我们将介绍如何使用GitLab、Jenkins和Kubernetes(k8s)来构建一个完整的CI/CD解决方案。
使用GitLab、Jenkins和Kubernetes(k8s)来构建CI/CD解决方案的前提是已经有一套可以正常运行的Kubernetes集群,关于Kubernetes(k8s)集群的安装部署,可以查看博客《Centos7 安装部署Kubernetes(k8s)集群》https://www.cnblogs.com/renshengdezheli/p/16686769.html。

三.DevOps简介

DevOps通过打破开发和运维之间的壁垒,促进了更紧密的合作和快速响应变化的能力。它强调团队间的协作、自动化和持续改进。通过引入DevOps实践,组织可以更快地交付软件,并确保高质量的发布。

四.CI/CD简介

CI/CD代表持续集成(Continuous Integration)和持续交付(Continuous Delivery)。持续集成是指团队成员将其工作频繁地集成到共享存储库中,并进行自动化构建和测试,以减少集成问题。持续交付是指将应用程序更频繁地交付给用户,以便快速获得反馈并提供新功能。本次使用的CI/CD工具为Jenkins。

五.安装并配置docker参数

etcd1机器作为集成服务器,需要下载大量镜像,所以首先需要安装docker,docker版本标识:社区版 docker-ce 和企业版 docker-ee。

[root@etcd1 ~]# yum -y install docker-ce

为了让镜像下载速度变快,需要配置镜像加速器,关于docker更多详细内容,请查看博客《一文搞懂docker容器基础:docker镜像管理,docker容器管理》。

[root@etcd1 ~]# vim /etc/docker/daemon.json

[root@etcd1 ~]# cat /etc/docker/daemon.json 
{
   
"registry-mirrors": ["https://frz7i079.mirror.aliyuncs.com"] 
}

重启docker使配置生效。

[root@etcd1 ~]# systemctl restart docker

[root@etcd1 ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since 六 2022-03-26 17:53:49 CST; 40s ago
     Docs: https://docs.docker.com
 Main PID: 1495 (dockerd)
   Memory: 32.9M
   CGroup: /system.slice/docker.service
           └─1495 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

设置docker开机自启动

[root@etcd1 ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

修改docker启动脚本,–insecure-registry=192.168.110.133:5000是镜像仓库的地址, 我们使用registry搭建镜像仓库,添加了–insecure-registry=192.168.110.133:5000参数之后,就可以使用http的方式拉取镜像,不然默认使用https的方式拉取镜像。
jenkins需要做的工作:构建,编译,推送,这些操作都需要借助docker去完成,但是jenkins自身是没有docker命令的,要让jenkins连接到物理机的docker上,需要添加参数:-H tcp://0.0.0.0:2376。

[root@etcd1 ~]# vim /usr/lib/systemd/system/docker.service

[root@etcd1 ~]# cat /usr/lib/systemd/system/docker.service
.....
ExecStart=/usr/bin/dockerd --insecure-registry=192.168.110.133:5000 -H tcp://0.0.0.0:2376  -H fd:// --containerd=/run/containerd/containerd.sock
.....

重新加载配置文件,重启docker。

[root@etcd1 ~]# systemctl daemon-reload ;systemctl restart docker

查看状态可以发现:8083 /usr/bin/dockerd --insecure-registry=192.168.110.133:5000 -H tcp://0.0.0.0:2376 -H fd:// --containerd=/run/containerd/containerd.sock,修改参数成功。

[root@etcd1 ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since 二 2022-03-29 11:37:51 CST; 20s ago
     Docs: https://docs.docker.com
 Main PID: 8083 (dockerd)
   Memory: 36.8M
   CGroup: /system.slice/docker.service
           └─8083 /usr/bin/dockerd --insecure-registry=192.168.110.133:5000 -H tcp://0.0.0.0:2376 -H fd:// --containerd=/run/containerd/containerd.sock

我们把镜像推送到registry镜像仓库之后,k8s集群的worker节点会向registry镜像仓库拉取镜像,默认使用https的方式从镜像仓库拉取镜像,需要在k8s的worker节点修改docker启动参数,添加–insecure-registry=192.168.110.133:5000,让其使用http的方式从registry镜像仓库拉取镜像。

[root@k8scloude2 ~]# vim /usr/lib/systemd/system/docker.service

[root@k8scloude2 ~]# cat /usr/lib/systemd/system/docker.service
......
ExecStart=/usr/bin/dockerd --insecure-registry=192.168.110.133:5000  -H fd:// --containerd=/run/containerd/containerd.sock
......

[root@k8scloude2 ~]# grep ExecStart /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry=192.168.110.133:5000  -H fd:// --containerd=/run/containerd/containerd.sock

重新加载配置文件,重启docker。

[root@k8scloude2 ~]# systemctl daemon-reload ;systemctl restart docker

[root@k8scloude2 ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since 二 2022-03-29 11:51:36 CST; 4s ago
     Docs: https://docs.docker.com
 Main PID: 57510 (dockerd)
   Memory: 63.6M
   CGroup: /system.slice/docker.service
           ├─57510 /usr/bin/dockerd --insecure-registry=192.168.110.133:5000 -H fd:// --containerd=/run/containerd/containerd.sock
           ├─57759 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip 172.17.0.2 -container-port 80
           └─57767 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 80 -container-ip 172.17.0.2 -container-port 80

k8scloude3节点也需要修改docker启动参数,添加–insecure-registry=192.168.110.133:5000,让其使用http的方式从registry镜像仓库拉取镜像。

[root@k8scloude3 ~]# vim /usr/lib/systemd/system/docker.service

[root@k8scloude3 ~]# grep ExecStart /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry=192.168.110.133:5000  -H fd:// --containerd=/run/containerd/containerd.sock

重新加载配置文件,重启docker。

[root@k8scloude3 ~]# systemctl daemon-reload ;systemctl restart docker

[root@k8scloude3 ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since 二 2022-03-29 15:55:13 CST; 5s ago
     Docs: https://docs.docker.com
 Main PID: 9099 (dockerd)
   Memory: 43.1M
   CGroup: /system.slice/docker.service
           └─9099 /usr/bin/dockerd --insecure-registry=192.168.110.133:5000 -H fd:// --containerd=/run/containerd/containerd.sock

现在k8s集群的所有worker节点都加上了–insecure-registry=192.168.110.133:5000参数。
在etcd1机器拉取nginx镜像,之后做web容器的时候会用到。

[root@etcd1 ~]# docker pull nginx
Using default tag: latest
......
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

[root@etcd1 ~]# docker images | grep nginx
nginx                            latest                605c77e624dd   3 months ago   141MB

六.使用registry搭建镜像仓库

本次使用registry搭建镜像仓库,也可以使用harbor搭建镜像仓库,功能更丰富,关于harbor的详细内容,请查看博客《搭建docker镜像仓库(二):使用harbor搭建本地镜像仓库》。
拉取registry镜像

[root@etcd1 ~]# docker pull hub.c.163.com/library/registry:latest      

[root@etcd1 ~]# docker images | grep registry
hub.c.163.com/library/registry   latest                751f286bc25e   4 years ago    33.2MB

注意:registry的数据卷为:VOLUME [/var/lib/registry],不能是其他的。
创建registry容器,registry镜像生成容器作为私有仓库,-p 5000:5000做端口映射,物理机端口5000:容器端口5000,
-v /myregistry:/var/lib/registry数据卷挂载,物理机目录/myregistry:容器目录/var/lib/registry。

[root@etcd1 ~]# docker run -d --name registry -p 5000:5000 --restart=always -v /myregistry:/var/lib/registry hub.c.163.com/library/registry
3aa799d1974611fc403ce38aa19a156cb165a82573b84b16fde665d9e3b62eb0

现在registry镜像仓库就搭建好了。

[root@etcd1 ~]# docker ps | grep registry
3aa799d19746   hub.c.163.com/library/registry   "/entrypoint.sh /etc…"   8 seconds ago   Up 7 seconds           0.0.0.0:5000->5000/tcp, :::5000->5000/tcp                                                                         registry

此时镜像仓库下还没有任何文件

[root@etcd1 ~]# ls /myregistry/

七.安装部署gitlab代码仓库

7.1 创建gitlab容器

在etcd1机器下载gitlab中文版镜像

[root@etcd1 ~]# docker pull beginor/gitlab-ce     

[root@etcd1 ~]# docker images | grep gitlab
beginor/gitlab-ce                latest                5595d4ff803e   3 years ago    1.5GB

创建gitlab配置文件目录,日志目录,代码目录

[root@etcd1 ~]# mkdir -p /data/gitlab/etc /data/gitlab/log /data/gitlab/data

给gitlab配置文件目录,日志目录,代码目录授予777权限

[root@etcd1 ~]# chmod 777 /data/gitlab/etc /data/gitlab/log /data/gitlab/data

创建gitlab容器,使用–privileged=true参数,使container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。–privileged=true启动的容器,可以看到很多host上的设备,并且可以执行mount。甚至允许你在docker容器中启动docker容器。
-v指定数据卷,gitlab容器的配置文件,日志文件,数据文件也都存储到了物理机上,我们修改对应数据卷的内容,gitlab容器的相关内容也随之改变。-p指定端口映射。

[root@etcd1 ~]# docker run -dit --name=gitlab --restart=always -p 8443:443 -p 80:80 -p 222:22 -v /data/gitlab/etc:/etc/gitlab -v /data/gitlab/log:/var/log/gitlab -v /data/gitlab/data:/var/opt/gitlab --privileged=true beginor/gitlab-ce

查看gitlab容器

[root@etcd1 ~]# docker ps | grep gitlab
d23f2df47e42   beginor/gitlab-ce                "/assets/wrapper"        22 hours ago    Up 6 hours (healthy)   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:222->22/tcp, :::222->22/tcp, 0.0.0.0:8443->443/tcp, :::8443->443/tcp   gitlab

现在gitlab配置文件目录,日志目录,代码目录都有相关文件了。

[root@etcd1 ~]# ls /data/gitlab/etc/
gitlab.rb  gitlab-secrets.json  ssh_host_ecdsa_key  ssh_host_ecdsa_key.pub  ssh_host_ed25519_key  ssh_host_ed25519_key.pub  ssh_host_rsa_key  ssh_host_rsa_key.pub  trusted-certs

[root@etcd1 ~]# ls /data/gitlab/log/
gitaly  gitlab-monitor  gitlab-rails  gitlab-shell  gitlab-workhorse  logrotate  nginx  node-exporter  postgres-exporter  postgresql  prometheus  reconfigure  redis  redis-exporter  sidekiq  sshd  unicorn

[root@etcd1 ~]# ls /data/gitlab/data/
backups       gitaly    gitlab-ci       gitlab-rails  gitlab-workhorse  nginx          postgres-exporter  prometheus              redis
bootstrapped  git-data  gitlab-monitor  gitlab-shell  logrotate         node-exporter  postgresql         public_attributes.json  trusted-certs-directory-hash

7.2 修改gitlab容器配置文件

注意先让gitlab容器运行一段时间,让其数据进行初始化,然后再停止gitlab容器,修改配置文件。

[root@etcd1 ~]# docker stop gitlab

下面开始修改gitlab的配置文件。
修改/data/gitlab/etc/gitlab.rb&#x

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1901273.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

测试几个 ocr 对日语的识别情况

测试几个 ocr 对日语的识别情况 1. EasyOCR2. PaddleOCR3. Deepdoc(识别pdf中图片)4. Deepdoc(识别pdf中文字)5. Nvidia neva-22b6. Claude 3.5 sonnet 识别图片中的文字7. Claude 3.5 sonnet 识别 pdf 中表格8. OpenAI gpt-4o 识…

CMS Made Simple v2.2.15 远程命令执行漏洞(CVE-2022-23906)

前言 CVE-2022-23906 是一个远程命令执行(RCE)漏洞,存在于 CMS Made Simple v2.2.15 中。该漏洞通过上传头像功能进行利用,攻击者可以上传一个经过特殊构造的图片文件来触发漏洞。 漏洞详情 CMS Made Simple v2.2.15 中的头像上…

verilog读写文件注意事项

想要的16进制数是文本格式提供的文件,想将16进制数提取到变量内, 可以使用 f s c a n f ( f d 1 , " 也可以使用 fscanf(fd1,"%h",rd_byte);实现 也可以使用 fscanf(fd1,"也可以使用readmemh(“./FILE/1.txt”,mem);//fe放在mem[0…

alphazero学习

AlphaGoZero是AlphaGo算法的升级版本。不需要像训练AlphaGo那样,不需要用人类棋局这些先验知识训练,用MCTS自我博弈产生实时动态产生训练样本。用MCTS来创建训练集,然后训练nnet建模的策略网络和价值网络。就是用MCTSPlayer产生的数据来训练和…

VRPTW(MATLAB):常春藤算法(IVY)求解带时间窗的车辆路径问题VRPTW,MATLAB代码

详细介绍 VRPTW(MATLAB):常春藤算法(Ivy algorithm,IVY)求解带时间窗的车辆路径问题VRPTW(提供MATLAB代码)-CSDN博客 ********************************求解结果******************…

web零碎知识2

不知道我的这个axios的包导进去没。 找一下关键词: http请求协议:就是进行交互式的格式 需要定义好 这个式一发一收短连接 而且没有记忆 这个分为三个部分 第一个式请求行,第二个就是请求头 第三个就是请求体 以get方式进行请求的失手请求…

C语言 -- 深入理解指针(一)

C语言 -- 深入理解指针(一) 1.内存和地址1.1 内存1.2 究竟该如何理解编址 2. 指针变量和地址2.1 取地址操作符(&)​2.2 指针变量和解引用操作符(*)​​2.2.1 指针变量2.2.2 如何拆解指针类型2.2.3 解引…

Java语言程序设计基础篇(第10版)编程练习题13.18(使用 Rational 类)

第十三章第十八题(使用 Rational 类) 题目要求: 编写程序,使用 Rational 类计算下面的求和数列: 你将会发现输出是不正确的 ,因为整数溢出(太大了)。为了解决这个问题 ,参见编程练习題13.15。代码参考: package cha…

羊大师:小暑至,热浪涌,三伏悠长防暑忙

随着夏日的脚步悄然加速,我们迎来了小暑节气。小暑,一个预示着盛夏正式拉开序幕的时节,它携带着滚滚热浪,让大地仿佛置身于火炉之中。而随之而来的三伏天,更是长达40天的酷热考验,让人不禁感叹夏日的漫长与…

文件、文本阅读与重定向、路径与理解指令——linux指令学习(一)

前言:本节内容标题虽然为指令,但是并不只是讲指令, 更多的是和指令相关的一些原理性的东西。 如果友友只想要查一查某个指令的用法, 很抱歉, 本节不是那种带有字典性质的文章。但是如果友友是想要来学习的,…

记录第一次使用air热更新golang项目

下载 go install github.com/cosmtrek/airlatest 下载时提示: module declares its path as: github.com/air-verse/air but was required as: github.com/cosmtrek/air 此时,需要在go.mod中加上这么一句: replace github.com/cosmtrek/air &…

VitePress美化

参考资料: https://blog.csdn.net/weixin_44803753/article/details/130903396 https://blog.csdn.net/qq_30678861/category_12467776.html 站点信息修改 首页部分的修改基本都在.vitepress/config.mts,这个文件内修改。 title 站点名称 description 描述 top…

轻松快速上手Thekey库,实现数据加密无忧

Thekey的概述: Thekey库是一个Python库,旨在简化数据加密、解密、签名和验证的过程。它提供了一套简洁易用的接口,用于处理各种加密任务,适合需要在应用程序中实现安全数据处理的开发人员. 安装Thekey库 pip install thekey使用Thekey库进行基本加密和解密操作的…

一种一维时间序列信号变化/事件/异常检测方法(MATLAB)

随着工业物联网、大数据和人工智能的发展,传统工业正在向数字化和智能化升级,从而创造了大量的时间序列数据。通过分析这些数据,可以提供准确可靠的信息服务和决策依据,促进制造业的转型升级。工业物联网在传统工业向“工业 4.0”…

Java+ Idea+ Vue产科信息管理系统源码 什么是产科信息管理系统的门诊管理?

Java Idea Vue产科信息管理系统源码 什么是产科信息管理系统的门诊管理? 产科信息管理系统 门诊管理是现代医疗服务的重要组成部分,它借助信息技术手段,对产科门诊的各个环节进行优化和重构,以提高医疗服务效率、提升患者体验、加…

Windows安装超好用的截图工具——Snipaste

1、下载 官网:https://zh.snipaste.com/ 2、安装 (1)解压下载的压缩包 (2)选中Snipaste.exe文件,右键发送到 -- > 桌面快捷方式 (3)双击桌面Snipaste图标,桌面右下…

Qt 基础组件速学 事件过滤器

学习目标:理解事件过滤器 前置环境 运行环境:qt creator 4.12 学习内容和效果演示: Qt 提供了事件过滤器的机制,允许我们在事件到达目标对象之前对事件进行拦截和处理。这在以下情况下非常有用: 全局事件处理: 我们可以在应用程序级别安装一个事件过…

从文本到安全图像:自动提示优化防止不当内容生成

T2I生成技术已经得到了广泛关注,并见证了如GLIDE、Imagen、DALL-E 2、Stable Diffusion等大型生成模型的发展。尽管这些模型能够根据文本描述生成高质量的图像,促进了书籍插图、品牌标识设计、游戏场景创作等多种实际应用,但它们也被恶意用户…

html+js+css做的扫雷

做了个扫雷&#x1f4a3; 88大小 源代码在文章最后 界面 先点击蓝色开局按钮 然后就可以再扫雷的棋盘上玩 0代表该位置没有雷 其他数字代表周围雷的数量 源代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8&qu…

vue事件参数

事件参数 事件参数可以获取event对象和通过事件传递数据 获取event对象 <template> <buttonclick"addCount">点击</button><p>count is: {{ count }}</p><p>{{ coutent_e }}</p> </template> <script>expor…