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

一.系统环境

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

服务器版本docker软件版本Kubernetes(k8s)集群版本CPU架构
CentOS Linux release 7.4.1708 (Core)Docker version 20.10.12v1.21.9x86_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.133CentOS Linux release 7.4.1708 (Core)x86_64docker,jenkinsCI/CD服务器
etcd1/192.168.110.133CentOS Linux release 7.4.1708 (Core)x86_64registry镜像仓库
etcd1/192.168.110.133CentOS Linux release 7.4.1708 (Core)x86_64gitlab,Git代码仓库
k8scloude1/192.168.110.130CentOS Linux release 7.4.1708 (Core)x86_64docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calicok8s master节点
k8scloude2/192.168.110.129CentOS Linux release 7.4.1708 (Core)x86_64docker,kubelet,kube-proxy,calicok8s worker节点
k8scloude3/192.168.110.128CentOS Linux release 7.4.1708 (Core)x86_64docker,kubelet,kube-proxy,calicok8s 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 EngineLoaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)Active: active (running) since 六 2022-03-26 17:53:49 CST; 40s agoDocs: https://docs.docker.comMain PID: 1495 (dockerd)Memory: 32.9MCGroup: /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 EngineLoaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)Active: active (running) since 二 2022-03-29 11:37:51 CST; 20s agoDocs: https://docs.docker.comMain PID: 8083 (dockerd)Memory: 36.8MCGroup: /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 EngineLoaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)Active: active (running) since 二 2022-03-29 11:51:36 CST; 4s agoDocs: https://docs.docker.comMain PID: 57510 (dockerd)Memory: 63.6MCGroup: /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 EngineLoaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)Active: active (running) since 二 2022-03-29 15:55:13 CST; 5s agoDocs: https://docs.docker.comMain PID: 9099 (dockerd)Memory: 43.1MCGroup: /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.rhkb.cn/news/372955.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习数据库2

在数据库中创建一个表student,用于存储学生信息 查看建表结果 向student表中添加一条新记录 记录中id字段的值为1,name字段的值为"monkey",grade字段的值为98.5 并查看结果 向student表中添加多条新记录 2,"bob"…

算法之工程化内容(2)—— Git常用命令

目录 1. git初始化配置 2. 新建仓库 3. 工作区——>暂存区——>本地仓库 4. git reset回退版本 5. 查看差异 git diff 6. 删除文件git rm 7. .gitignore 8. vscode操作git 9. git分支、合并和删除 10. 解决合并冲突 11. 回退和rebase 12. 添加远程仓库 参考链接&#xff…

用于视频生成的扩散模型

学习自https://lilianweng.github.io/posts/2024-04-12-diffusion-video/ 文章目录 3D UNet和DiTVDMImagen VideoSora 调整图像模型生成视频Make-A-Video(对视频数据微调)Tune-A-VideoGen-1视频 LDMSVD稳定视频扩散 免训练Text2Video-ZeroControlVideo 参…

C++deque容器

文章目录 deque容器概念deque操作deque对象的带参数构造deque头部和末尾的添加移除操作deque的数据存取deque与迭代器deque赋值deque插入deque删除 deque容器概念 deque是双端数组,而vector是单端的。 deque头部和尾部添加或移除元素都非常快速, 但是在中部安插元…

一个php文件怎么实现联系表单自动发送邮件

学习PHP:如何编写一个自动发送邮件的联系表单处理器? 无论是反馈意见、业务咨询,还是技术支持,联系表单都能为用户提供便捷的交流途径。AokSend将探讨如何通过一个PHP文件实现联系表单的自动发送邮件功能。 php文件:…

Java实战:寻找完美数

文章目录 一、何谓完美数二、寻找完美数(一)编程思路(二)编写程序(三)运行程序 三、实战小结 一、何谓完美数 完美数是一种特殊的自然数,它等于其所有正除数(不包括其本身&#xff…

数据结构作业/2024/7/9

2>实现双向循环链表的创建、判空、尾插、遍历、尾删、销毁 fun.c #include "head.h" //1.双向循环链表的创建 doubleloop_ptr create_list() …

数据结构——顺序表【C】

顺序表 1. 顺序表的概念以及结构1.1概念1.2静态顺序表和动态顺序表 2. 顺序表接口模拟实现接口总览2.1 初始化数据和销毁容器 2.2 顺序表的尾插和尾删2.3 头插和头删2.4 任意位置插入和删除数据2.5 查找数据 3. 顺序表的问题 : 1. 顺序表的概念以及结构 1.1概念 顺…

利用亚马逊云科技云原生Serverless代码托管服务开发OpenAI ChatGPT-4o应用

今天小李哥继续介绍国际上主流云计算平台亚马逊云科技AWS上的热门生成式AI应用开发架构。上次小李哥分享​了利用谷歌云serverless代码托管服务Cloud Functions构建Gemini Pro API​,这次我将介绍如何利用亚马逊的云原生服务Lambda调用OpenAI的最新模型ChatGPT 4o。…

初识SpringBoot

1.Maven Maven是⼀个项⽬管理⼯具, 通过pom.xml⽂件的配置获取jar包,⽽不⽤⼿动去添加jar包 主要功能 项⽬构建管理依赖 构建Maven项目 1.1项目构建 Maven 提供了标准的,跨平台(Linux, Windows, MacOS等)的⾃动化项⽬构建⽅式 当我们开发了⼀个项⽬之后, 代…

LLM指令微调Prompt的最佳实践(六):基于ChatGPT搭建聊天机器人

文章目录 1. 前言2. Prompt定义3. 搭建聊天机器人Chatbot3.1 角色定义1. system2. assistant3. user4. 总结 3.2 初始函数3.3 讲笑话机器人3.4 订餐机器人 4. 参考 1. 前言 前情提要: 《LLM指令微调Prompt的最佳实践(一):Prompt原…

Apache AGE 安装部署

AGE概述 概述 我们可以通过源码安装、拉取docker镜像运行、直接使用公有云三种方式中的任意一种来使用Apache AGE 获取 AGE 发布版本 可以在 https://github.com/apache/age/releases 找到发布版本和发布说明。 源代码 源代码可以在 https://github.com/apache/age 找到…

万字长文整理Java多线程相关面试题

目录 ​1. 什么是线程和进程? 线程与进程有什么区别? 那什么是上下文切换? 进程间怎么通信? 什么是用户线程和守护线程? 2. 并行和并发的区别? 3. 创建线程的几种方式? Runnable接口和C…

Codeforces Round 954 (Div. 3) F. Non-academic Problem

思路&#xff1a;考虑缩点&#xff0c;因为是无向图&#xff0c;所以双连通分量缩完点后是一棵树&#xff0c;我们去枚举删除每一条树边的答案&#xff0c;然后取最小值即可。 #include <bits/stdc.h>using namespace std; const int N 3e5 5; typedef long long ll; …

3-6 构建线性模型解决温度计示数转换问题

3-6 构建线性模型解决温度计示数转换问题 直接上源码 %matplotlib inline import numpy as np import torch torch.set_printoptions(edgeitems2, linewidth75)导入必要的库并设置 PyTorch 的打印选项&#xff0c;确保在打印张量时显示边缘项和行宽。 #%% t_c [0.5, 14.0,…

gpt-4o看图说话-根据图片回答问题

问题&#xff1a;中国的人口老龄化究竟有多严重&#xff1f; 代码下实现如下&#xff1a;&#xff08;直接调用openai的chat接口&#xff09; import os import base64 import requests def encode_image(image_path): """ 对图片文件进行 Base64 编码 输入…

phpexcel导入导出

前言&#xff1a; 如果你到处的excel软件打开有问题&#xff0c;下面有介绍解决办法 导入 1. composer init 初始化 2. 下载phpspreadsheet 这里需要注意php版本&#xff0c;需要大于7.2 composer require phpoffice/phpspreadsheet3. 编写代码 <?php require vendo…

Linux多进程和多线程(八)多线程

多线程 线程定义线程与进程线程资源 线程相关命令 pidstat 命令 top 命令ps 命令常见的并发方案 1. 多进程模式2. 多线程模式 创建线程 1. pthread_create() 示例:创建一个线程 2. pthread_exit() 退出线程3. pthread_join() 等待线程结束 示例: 线程分离 创建多个线程 示例 1:…

“郑商企航”暑期社会实践赴美丽美艳直播基地开展调研

马常旭文化传媒网讯&#xff08;记者张明辉报道&#xff09;导读&#xff1a;2024 年 7 月 3 日&#xff0c;商学院暑期社会实践团“郑商企航”在河南省郑州市新密市岳村镇美丽美艳直播基地&#xff0c;展开了一场意义非凡的考察活动&#xff0c;团队成员深度调研了直播基地的产…

CTF php RCE(二)

0x04 php伪协议 这种我们是先看到了include才会想到&#xff0c;利用伪协议来外带文件内容&#xff0c;但是有些同学会问&#xff0c;我们怎么知道文件名是哪个&#xff0c;哪个文件名才是正确的&#xff0c;那么这里我们就得靠猜了 include函数 因为 include 是一个特殊的语…