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.pswp.cn/web/40489.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40489.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40489.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ASP.NET MVC-razor編寫-2-svg中使用js+添加事件監聽

環境:win10 效果 初始狀態: 鼠標移入某個text(比如KS primer)時,text和連接的線條與箭頭都變色: 鼠標移出時回復正常。 如果是移入另一種紅色的text(比如Cell Sceening Tag)&…

創建本地倉庫

一、新建掛載目錄 二、將掛載本地鏡像掛載到目錄 三、配置yum倉庫 一、新建掛載目錄 mkdir /BenDiCangKu 二、將掛載本地鏡像掛載到目錄 1、先連接本地光盤 2、掛載光盤 mount /dev/sr0 /BenDiCangKu 3、查看掛載 由此可見掛載成功 三、配置yum倉庫 1、新建yum倉庫文件…

php簡單商城小程序系統源碼

🛍?【簡單商城小程序】🛍? 🚀一鍵開啟,商城搭建新體驗🚀 你還在為繁瑣的商城搭建流程頭疼嗎?現在,有了簡單商城系統小程序,一切變得輕松又快捷!無需復雜的編程知識&a…

構建Android studio版的CarSystemUI工程時因為包名一致導致BuildConfig問題

項目場景: 公司計劃開發杰發AC8025-Android 12版本車載平臺,前期預研需要構建Android studio版的CarSystemUI工程 問題描述 AAOS車載項目里面的CarSystemUI源碼默認無Android studio版本,為了后期快速開發調試需要構建Android studio能直接…

STM32基礎知識

一.STM32概述 第一款STM32單片機發布的時間為2007年6月11日。由意法半導體(ST)公司推出,是STM32系列中的首款產品,具體型號為STM32F1,它是一款基于Cortex-M內核的32位微控制器(MCU)。 STM32F1…

【openstack基礎操作】

openstack 常用命令 source ~/base/src/kayobe-config/etc/kolla/admin-openrc.sh https://docs.openstack.org//kayobe/latest/doc-kayobe.pdf 鏡像下載點 http://cloud.centos.org/centos/7/images/創建虛擬機 openstack server create --image 13d0686a-a7cc-4cc6-8bf7-76…

2024年【湖北省安全員-C證】考試資料及湖北省安全員-C證考試試卷

題庫來源:安全生產模擬考試一點通公眾號小程序 湖北省安全員-C證考試資料是安全生產模擬考試一點通生成的,湖北省安全員-C證證模擬考試題庫是根據湖北省安全員-C證最新版教材匯編出湖北省安全員-C證仿真模擬考試。2024年【湖北省安全員-C證】考試資料及…

JS+CSS+HTML項目-中國國家圖書館

頁面做的不多,CSS效果請看嗶哩嗶哩

英智玲瓏一體機在律所能做什么

只要不開庭,學習就不能停 好的律師是法律知識的百科全書 要精通、全面理解各類型的法律 還要不斷學習更新的條例釋義 一天即使工作24小時 也有忙不完的文書起草,資料核對,案情分析整理 有了英智玲瓏一體機,這些都不是難題&am…

MySQL8.0~open_files_limit 和 innodb_open_files 參數生效取值標準

前置條件 設置參數 /etc/security/limits.conf中設置如下 * soft nofile 100001 * hard nofile 100002 root soft nofile 100001 root hard nofile 100002 mysql soft nofile 65535 mysql hard nofile 65535my.cnf中設置如下 table_open_cache5000 open_files_limit20000 i…

一鍵式創建GTest測試平臺

適用于C GTest測試平臺搭建。直接上python腳本。 #!/usr/bin/env python3 # -*- coding: utf-8 -*-import argparse import os import platform import subprocess from xml.etree import ElementTree as ETdefault_root_path "d:\\test\\UTtest"class DeveloperTe…

init,service和systemctl的區別

1、service是一個腳本命令,分析service可知是去/etc/init.d目錄下執行相關程序。service和chkconfig結合使用。 服務配置文件存放目錄/etc/init.d/ 2、systemd centos7版本中使用了systemd,systemd同時兼容service,對應的命令就是systemctl systemctl命…

四款主流電腦監控軟件(電腦監控軟件主要優勢)

在現代企業環境中,確保員工的工作效率和企業信息的安全成為了管理者的重要任務。電腦監控軟件作為一種有效的管理工具,能夠幫助企業實現這些目標。固信電腦監控軟件在這方面表現尤為出色,本文將詳細介紹固信電腦監控軟件的優勢及其主要功能&a…

如何在DDD項目實戰中保證子系統/限界上下文的低耦合

如何在DDD項目實戰中保證子系統/限界上下文的低耦合,首先通過如下幾個層次和環節來保證。 1.業務需求分析階段 需求要理解透徹,哪些功能應該放在一起。識別哪些是易變需求,哪些是穩定需求。識別哪些是通用需求,哪些是定制需求。…

《NATURE丨使用 AlphaFold 3 準確預測生物分子相互作用的結構》

NATURE丨使用 AlphaFold 3 準確預測生物分子相互作用的結構 注意!:本文創作僅根據個人理解和網絡信息,如有錯誤懇請指正!謝謝! 大家好,今天分享的文獻是2024年5月發表在Nature上的“ Accurate structure …

(仿真+報告+源碼)基于51單片機的溫濕度監測系統

(仿真報告源碼)基于51單片機的溫濕度監測系統 付費后獲得百度網盤鏈接,網盤鏈接在最后,有問題私信哦~~~ 一.系統簡介 該系統由單片機、溫濕度傳感器器、液晶顯示器以及澆水控制電路組成。該系統使用AT89C51單片機作為控制核心&…

【楚怡杯】職業院校技能大賽 “Python程序開發”賽項樣題一

第一部分:產品需求文檔 第1題:補充產品需求文檔中的新增學生功能 將產品需求文檔中新增學生功能的詳細描述內容截圖并保存; 第2題:補充產品需求文檔中的校園卡列表功能 將產品需求文檔中校園卡列表功能的詳細描述內容截圖并保存&a…

Oracle 數據庫詳解:概念、結構、使用場景與常用命令

1. 引言 Oracle 數據庫作為全球領先的關系型數據庫管理系統(RDBMS),在企業級應用中占據了重要地位。本文將詳細介紹Oracle數據庫的核心概念、架構、常用操作及其廣泛的使用場景,旨在為讀者提供全面而深入的理解。 2. Oracle 數據…

windows上安裝Frida環境

python安裝 下載地址 Python Release Python 3.12.4 | Python.org python安裝好后,使用如下命令安裝frida客戶端 pip install frida-tools 使用frida --version 查看frida版本 安裝手機模擬器(雷電模擬器) 我的版本是4.0.61 查看CPU架構 adb …

一文了解常見DNS結構

很多企業忽略DNS這個關鍵的組件,而當DNS出現問題是,就會導致網站無法訪問、電子郵件無法發送和接收,從而影響到企業的正常運行。而網絡團隊成員如果想要處理DNS問題就必須對所在網絡的DNS架構有一定的理解。 主DNS服務器: 主DNS服…