基于K8s的CI/CD系統(tǒng)

1.簡介

基于k8s搭建的一套CI/CD系統(tǒng),其目的是方便k8s和服務(wù)端相關(guān)技術(shù)的實(shí)踐,在搭建過程中會(huì)涉及docker、dockerhub、k8s、github、jenkins、kubesphere


image.png

1.1.硬件

一臺(tái)Mac物理機(jī)+3臺(tái)Centos虛擬機(jī)

  • Mac物理機(jī) 安裝了Docker、在Docker中啟動(dòng)Jenkins容器(使用windows、linux也是ok的)
  • 3臺(tái)Centos虛擬機(jī) 部署k8s集群,集群中一個(gè)master節(jié)點(diǎn),兩個(gè)工作節(jié)點(diǎn)

1.2.軟件

  • docker 容器引擎
  • dockerhub 官方的docker鏡像注冊服務(wù)器(可以在本地搭建Harbor代替)
  • k8s 一個(gè)容器編排管理工具,用于部署應(yīng)用程序
  • github 源代碼倉庫(可以在本地搭建gitlab代替)
  • jenkins 發(fā)布工具
  • kubesphere k8s的web管理工具

2.搭建過程

2.1.Docker安裝

Docker是這個(gè)教程的基石,對(duì)Docker一點(diǎn)都不了解的同學(xué),建議去B站看一下我發(fā)布的Docker小白快速入門+實(shí)戰(zhàn),課程比較簡潔,主要幫助不了解Docker的同學(xué)快速掌握并應(yīng)用
安裝命令如下

sudo yum install -y yum-utils  
sudo yum-config-manager  --add-repo https://download.docker.com/linux/centos/docker-ce.repo  
sudo yum install -y docker-ce docker-ce-cli containerd.io  
sudo systemctl enable docker  
sudo systemctl start docker  
sudo docker run hello-world

2.2.k8s集群搭建

k8s是一個(gè)容器編排工具,可以輕松實(shí)現(xiàn)應(yīng)用的擴(kuò)/縮容、集群等,具體安裝方式參考文檔我的k8s集群安裝

2.3.基于k8s安裝kubersphere

這是k8s的一個(gè)web管理界面,用于簡化k8s的操作。

2.3.1.搭建nfs服務(wù)

在k8s繼續(xù)的所有節(jié)點(diǎn)上都需要安裝nfs-utils、rpcbind,搭建步驟參考我的Centos7搭建NFS服務(wù)端

2.3.2.創(chuàng)建基于NFS的DefaultStorageclass

kubesphere明確說明基于k8s安裝需要配置DefaultStorageclass,創(chuàng)建步驟參考我的k8s基于NFS創(chuàng)建Storageclass

2.3.3.安裝kubesphere

安裝時(shí)間會(huì)有一點(diǎn)長,安裝步驟參考我的k8s集群安裝Kubersphere

2.4.基于Docker安裝Jenkins

jenkins在這里是作為一個(gè)紐帶的作用,因?yàn)閖enkins在構(gòu)建項(xiàng)目時(shí)可以執(zhí)行shell腳本,因此通過shell腳本輕松的將github、docker注冊服務(wù)器、k8s集群三者關(guān)聯(lián)起來,從而簡化jenkins的使用(就是一個(gè)偏運(yùn)維的工具而已)

這里之所以使用Docker安裝Jenkins,是因?yàn)槲也幌朐谖锢頇C(jī)上安裝jenkins(畢竟只是一個(gè)工具),而虛擬機(jī)已經(jīng)啟動(dòng)了三臺(tái),再創(chuàng)建就會(huì)影響我的物理機(jī)性能,所以這里直接使用物理機(jī)的Docker跑Jenkins,用完就刪了。
安裝步驟參考我的基于Docker安裝Jenkins

2.4.1.配置免密訪問

免密訪問k8s集群的master服務(wù)器
參考我的Linux配置免密登錄,這里需要進(jìn)入jenkins容器內(nèi)部進(jìn)行操作

配置github的ssh key訪問

# 生成ssh的公鑰和私鑰
ssh-keygen -t rsa -C "你的郵箱"
# 根據(jù)提示進(jìn)入公鑰所在目錄
# 拷貝公鑰并在github上進(jìn)行配置

2.4.2.k8s上創(chuàng)建docker注冊服務(wù)器的Secret

kubectl create secret docker-registry pwz-secret  \
--docker-server=index.docker.io \
--docker-username=pingwazi0101 \
--docker-password=***\
-n pingwazi

2.4.3.編寫jenkins部署腳本

在jenkins創(chuàng)建一個(gè)自由風(fēng)格的軟件->填寫倉庫地址->編寫如下腳本

echo "開始部署"
projectName="gocode" # 項(xiàng)目名稱
branchName="main" # 分支名稱
env="qa" # 發(fā)布環(huán)境
k8sHost="172.16.255.**"  #k8s集群的master節(jié)點(diǎn)ip 
k8sUser="root" # k8s集群的master節(jié)點(diǎn)的登錄賬號(hào)
k8sDeployPath="/usr/local/k8s/deploy/" # k8s集群的部署目錄
latestCommitID=$(git rev-parse --short HEAD)  # 最近一次提交id
workDir="${k8sDeployPath}${projectName}" # 發(fā)布操作的工作目錄
imageNameTemplate="pingwazi0101/imagename" # yaml文件中的進(jìn)行名占位內(nèi)容
imageName="pingwazi0101/${projectName}:${branchName}${latestCommitID}" # 進(jìn)行名


# 上傳文件到k8s服務(wù)器
scp -r ./ ${k8sUser}@${k8sHost}:${workDir}

ssh ${k8sUser}@${k8sHost} <<eof
# 跳轉(zhuǎn)到工作目錄
cd ${workDir}
# 構(gòu)建鏡像
docker build -t ${imageName} .
# 登錄鏡像服務(wù)器
cat /usr/local/password/dockerhub|docker login -u pingwazi0101 --password-stdin 
#推送進(jìn)行
docker push ${imageName}
# 刪除本地鏡像
docker rmi -f ${imageName}
# 退出登錄鏡像服務(wù)器
docker logout

#構(gòu)建部署文件并部署
kubectl  kustomize ./deploy/overlays/${env}/ |sed  "s#${imageNameTemplate}#${imageName}#" - | kubectl apply -f -  

# 清空當(dāng)前目錄下的所有文件
rm -rf *
# 退出
exit
eof
echo "部署完成"

3.Over

一個(gè)簡單的CI/CD系統(tǒng)就搭建完成了,后面可以把更多的重心放在k8s資源文件的編寫上,理解yaml中各節(jié)點(diǎn)的含義也是一項(xiàng)不小的工作量,搞清楚k8s的各個(gè)模塊,對(duì)服務(wù)端的架構(gòu)設(shè)計(jì)是有益的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容