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