Jenkins+Rancher+Harbor+Gitlab部署應用到生產環境


Jenkins結合rancher進行項目的持續集成,這個流程其實跟之前的java項目、React項目、安卓項目的持續集成都差不多。但是相較之前的項目部署來說,在流程上多了很多的步驟,需要注意的地方比較多,所以在這里以部署一個java的demo項目進行演示和記錄。

一、環境准備

本次實驗的主機系統全部為CentOS Linux release 7.6.1810 (Core)

1、需要用到的服務

應用 版本
Jenkins 2.213
Gitlab 11.9.9
Rancher 2.3.5
Harbor 1.10.0

2、准備rancher-cli

要想Jenkins能遠程控制rancher,需要借助rancher-cli這個工具來實現。具體的配置方法可以參考:rancher-cli的使用

3、准備rancher存儲類(StrongClass)

在k8s中,關於存儲的概念有3個:PV、PVC、StrongClass,在規划存儲之前,最好想了解下這三個概念,可以參考下這篇文章:Kubernetes PV與PVC

前面已經搭建了一個3個節點的rancher集群,因為考慮應用的日志問題,所以這里准備一個存儲類用於應用日志目錄的掛載。

首先進入到將要部署應用的集群中,點擊應用商店,選擇啟動,搜索nfs,點擊進去並拉到頁面最下方點擊啟動進行安裝,操作流程如下圖:
在這里插入圖片描述

部署完成后,可以在集群的工作負載中看到對應的服務。
在這里插入圖片描述
在這里做一個小小的規划:后續所有應用的日志都通過這個nfs服務進行匯總到一台主機這個nfs共享目錄中,這樣開發人員在點擊jenkins進行部署完成之后,不需要知道這中間復雜的過程,直接去一個統一的位置查看日志就行了。

所以我打算將rancher集群中的node2(192.168.0.52)/data目錄共享出來(當然比較好的做法是單獨的掛載一塊容量較大的硬盤到/data目錄)

注意:這個nfs共享的分區需要使用xfs格式,否則后期可能會出現pod掛載失敗的報錯。報錯的內容如下:

Unable to mount volumes for pod "isj-eureka-57fb65b885-wf77q_isj(b0b0594f-715e-11e9-884a-0050568fa4d0)": timeout expired waiting for volumes to attach or mount for pod "isj"/"isj-eureka-57fb65b885-wf77q". list of unmounted volumes=[eureka]. list of unattached volumes=[eureka default-token-9wmpb] 
  • 1

接着來對剛才在應用商店部署的nfs服務進行一些調整,來滿足上面的這個小小規划的需求。點擊右邊三個小點,選擇升級,然后更改一些配置信息。
在這里插入圖片描述

這里修改了兩個地方:

1)主機調度:讓pod綁定在node2(192.168.0.52)上。

2)數據卷:卷名可以自定義,主機路徑改成我們預設的/data目錄。

調整之后,點擊最下方的升級就生效了,這樣一個nfs的存儲類就創建完成了。后續需要用到存儲的時候,可以直接從這個存儲類中划分,非常方便。

4、添加持久卷聲明(PVC)

上面的存儲類配置之后不能直接應用,還需要添加持久卷聲明(PVC)才能用。

來到集群的PVC欄目中,點擊添加PVC
在這里插入圖片描述
配置如下:
在這里插入圖片描述
名稱:可以自定義。
命名空間:我這里是根據項目來規划命名空間的,所以選擇demo。如果沒有項目的命名空間,可以新建一個。
來源:選擇使用存儲類創建新的持久卷(PV)
存儲類:選擇剛才創建的nfs-provisioner
容量:因為這里上面nfs共享的分區的空間不大,我這里就限制為20G。

點擊創建,就能在PVC列表中看到一個20G大小的PVC了,后面的應用部署將會用到這個PVC。

二、相關服務安裝

需要用到的各個服務的詳細安裝這里就不講了,有需要的可以直接點擊參考一下:

三、正式配置

先來整理下思路:首先在Jenkins上將代碼克隆下來,進行編譯打包,然后編寫Dockerfile來構建鏡像並將鏡像推送到私服,接着就可以在rancher中部署項目了。

按照上面的思路,就可以一步步的把一個應用給部署好了。

1、克隆代碼,構建鏡像

Jenkins想必都是很熟悉的了,我這里選擇了一個自由風格的項目進行配置(我個人比較愛用自由風格的)。廢話不多說,直接上Jenkins的配置。
在這里插入圖片描述
其實這就是一般Jenkins的配置,這里就不講了。

我這里要說的是在構建中的執行shell中要寫的腳本,將需求具體化成步驟:

1)到項目的$WORKSPACE目錄中去執行打包命令。
2)進入到target目錄編寫Dockerfile。
3)打鏡像,並推送到Harbor上。

注意:如果不是用的Harbor的默認自帶項目library的話,需要先在的Harbor上創建項目,我這里是在Harbor新建一個demo項目。

先暫時到這里吧,上面步驟的shell腳本如下:

#!/bin/bash source /etc/profile ##set color## echoRed() { echo $'\e[0;31m'"$1"$'\e[0m'; } echoGreen() { echo $'\e[0;32m'"$1"$'\e[0m'; } echoYellow() { echo $'\e[0;33m'"$1"$'\e[0m'; } ##set color## # 設置變量 project="demo" version=`date +%Y%m%d%H%M%S` port=9001 echo ------------------------------------- # mvn打包 cd $WORKSPACE mvn clean install -DskipTests=true if [ $? -eq 0 ];then echoGreen "mvn package is success!" else echoRed "mvn package is Failed!" && exit 1 fi sleep 2 # 進入target目錄 cd $WORKSPACE/target/ && mv $project-0.0.1-SNAPSHOT.jar app.jar # 創建docker鏡像 cat > run.sh << EOF #!/bin/bash source /etc/profile java -jar /opt/app.jar --server.port=${port} EOF chmod +x run.sh cat >Dockerfile << EOF FROM 192.168.0.153/public/jdk:1.8 MAINTAINER wc <123@qq.com> ENV LANG en_US.UTF-8 ADD app.jar /opt ADD run.sh / EXPOSE 9001 ENTRYPOINT [ "sh", "-c", "/run.sh" ] EOF # 編譯鏡像 echoGreen "開始構建當次鏡像!" docker build -t 192.168.0.153/demo/$project:$version . 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

好了,Jenkins執行下構建,構建完成之后去Harbor上看一眼。
在這里插入圖片描述
最下面這個鏡像就是剛才推送到Harbor上的。

2、部署應用

好了,鏡像已經打好了,下面的步驟就是要在rancher中進行應用的部署了,因為rancher集成了很友好的UI界面,所以常規應用的部署直接在UI中操作就可以了。

進入到集群中,在工作負載中點擊部署服務,配置見下圖:
在這里插入圖片描述
1:定義將要部署應用的名稱,這里最好與上面腳本中$project的值相等,便於腳本上下文的調用。

2:填入剛才生成的鏡像的地址。

3:選擇應用要用的命名空間,如果沒有想要的,可以新建一個。

4:端口名稱,自定義即可。

5:填入容器中應用的端口。

6:填入將要映射出來的端口,建議合理規划一下映射的端口。

7:通過端口檢查來做健康檢查,后面的時間可以根據應用初始化情況進行合理調整。

8:在添加卷中選擇使用現有PVC,卷名自定義即可。

9:選擇之前創建的PVC。

10:根據自己的需求掛載容器目錄,我這里把應用的日志目錄掛載出來。

11:定義掛載在持久卷中的目錄名稱。

然后點擊啟動,就完成應用的部署了。稍等一會,就可以在工作負載中看到這個剛部署的應用了。
在這里插入圖片描述
部署完成之后,可以訪問下試試,點擊應用名稱下邊的端口,就可以直接跳轉訪問。
在這里插入圖片描述
再來看看應用的日志情況:
在這里插入圖片描述

接着去我們一開始配置的存儲類對應的節點(192.168.0.52)上看看是否有日志文件。

[root@node2 demo]# pwd /data/pvc-33ac32cb-ff71-412b-98e5-bd4b5e16751f/demo [root@node2 demo]# ls demo.log 
  • 1
  • 2
  • 3
  • 4

可以看到日志和一開始預期的一樣出現了,其中pvc-33ac32cb-ff71-412b-98e5-bd4b5e16751f就是上面創建的持久卷聲明(PVC)的名稱,demo是剛才在rancher上部署應用時定義的。

3、完善腳本

OK,上面的都沒問題。這樣就完成了一個應用的部署,剩下的事情就是把剛才的shell腳本補充完整(剛才的shll腳本只寫到推送鏡像到Harbor為止),達到一鍵部署的效果。

這里之后的shell腳本的完整內容如下:

#!/bin/bash source /etc/profile ##set color## echoRed() { echo $'\e[0;31m'"$1"$'\e[0m'; } echoGreen() { echo $'\e[0;32m'"$1"$'\e[0m'; } echoYellow() { echo $'\e[0;33m'"$1"$'\e[0m'; } ##set color## # 設置變量 project="demo" version=`date +%Y%m%d%H%M%S` port=9001 harbor_user="admin" harbor_pwd="Harbor12345" harbor_host="192.168.0.153" echo ---------------------------------------------- # mvn打包 cd $WORKSPACE mvn clean install -DskipTests=true if [ $? -eq 0 ];then echoGreen "mvn package is success!" else echoRed "mvn package is Failed!" && exit 1 fi sleep 2 # 進入target目錄 cd $WORKSPACE/target/ && mv $project-0.0.1-SNAPSHOT.jar app.jar # 創建docker鏡像 cat > run.sh << EOF #!/bin/bash source /etc/profile java -jar /opt/app.jar --server.port=${port} EOF chmod +x run.sh cat >Dockerfile << EOF FROM 192.168.0.153/public/jdk:1.8 MAINTAINER wc <123@qq.com> ENV LANG en_US.UTF-8 ADD app.jar /opt ADD run.sh / EXPOSE 9001 ENTRYPOINT [ "sh", "-c", "/run.sh" ] EOF # 編譯鏡像 echoGreen "開始構建本次鏡像!" docker build -t $harbor_host/demo/$project:$version . [ $? != 0 ] && echoRed "請注意,打鏡像時出錯,故而退出!" && exit 1 # 登錄遠程Harbor倉庫 echoGreen "開始登錄遠程Harbor倉庫!" docker login -u $harbor_user -p $harbor_pwd $harbor_host [ $? != 0 ] && echoRed "請注意,登錄Harbor時出錯,故而退出!" && exit 1 # 上傳到docker私服 echoGreen "開始push新鏡像到私服!" docker push $harbor_host/demo/$project:$version [ $? != 0 ] && echoRed "請注意,在執行push上傳時出錯,故而退出!" && exit 1 docker rmi $harbor_host/demo/$project:$version # 更新鏡像 echoGreen "開始將新鏡像部署到遠端!" rancher kubectl set image deployment/$project $project=192.168.0.153/demo/$project:$version -n demo [ $? != 0 ] && echoRed "請注意,在執行鏡像更新時出錯,故而退出!" && exit 1 echoGreen "部署完成!" 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69

這里先說一下,因為應用時放在單獨的容器中執行的,所以jar包的名稱無關緊要,我這里直接把jar包的名稱改為app.jar,這樣在寫dockerfile和運行的時候都是用的app.jar這個名稱,以后即使不同的項目,都不需要對shell腳本中的jar包名稱進行更改了。

把上面這個shell腳本放到Jenkins的執行shell中,然后再點擊一下構建,看看是不是能把新構建的鏡像部署到rancher中去。

查看Jenkins的控制台輸出,可以看到流程一切順利。
在這里插入圖片描述
然后來看rancher這邊,可以看到新的應用已經開始部署了。
在這里插入圖片描述

因為之前在rancher中配置應用時使用的縮放/升級策略滾動: 先啟動新Pod,再停止舊Pod,所以整個部署過程是不會影響到業務的正常訪問的。

再來談談規范化的問題,整個過程中都在考慮規范化的問題,以后再新增應用的時候,直接Jenkins復制Job,僅僅需要更改一些git倉庫的地址,以及shell腳本中的一些變量的值,然后rancher上復制應用,對應的更改一些地方,一個新的應用的部署就這么完成了, 其實並不復雜。

參考文章:
http://www.eryajf.net/2746.html
https://i4t.com/4467.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM