1.簡介
基于k8s搭建的一套CI/CD系統(tǒng),其目的是方便k8s和服務(wù)端相關(guān)技術(shù)的實(shí)踐,在搭建過程中會(huì)涉及docker、dockerhub、k8s、github、jenkins、kubesphere
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ì)是有益的。