關於Jenkins結合rancher進行應用的持續集成,整個流程事實上並不算復雜,只不過牽扯到的東西,以及需要注意到的地方太多,因此這篇文章就針對全局技能的掌握以及過程中的技巧的應用進行分享。
1,環境准備。
這次所做的實驗主機系統全部基於CentOS Linux release 7.6.1810 (Core)
。
1,關於應用的准備。
應用 | 版本 |
---|---|
Gitlab | latest |
Jenkins | 2.138 |
harbor | 1.7.1 |
rancher | 2.2.2 |
2,rancher-cli的准備。
想要使Jenkins與rancher打通,需要借助於rancher-cli這個工具,具體配置流程參考:rancher-cli的使用。
3,關於rancher環境存儲卷的准備。
- 1,創建存儲卷。
前邊已經搭建了一個完整可用的rancher集群,因為部署應用考慮到一個日志問題,所以這里准備一個存儲卷用於應用掛載。
首先進入到將要部署應用的集群(關於集群的規划問題,后續再深入研究摸索)當中,點擊應用商店
,選擇啟用
,搜索到nfs
,點擊詳情
進行部署。
部署完成之后,可以在集群的工作負載
之中看到對應的服務。
這個時候,還需要進行一些小調整,使得這個服務能夠固定地跑在某一個節點之上。我的考慮是這樣的,后續所有應用的日志都通過這個服務進行匯總,這樣以來開發同學面對應用的時候,就只需要在Jenkins界面點擊一下部署,然后去到一個統一的位置查看日志就行了,而不用考慮應用在這個過程中做了哪些事情。
所以我在集群的work-2
節點上加了一塊兒500G的硬盤,並掛載在了data
目錄下。
[root@work-2 ~]$df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/centos-root xfs 196G 12G 184G 6% /
devtmpfs devtmpfs 12G 0 12G 0% /dev
tmpfs tmpfs 12G 0 12G 0% /dev/shm
tmpfs tmpfs 12G 12M 12G 1% /run
tmpfs tmpfs 12G 0 12G 0% /sys/fs/cgroup
/dev/sda1 xfs 497M 208M 290M 42% /boot
/dev/sdb1 xfs 500G 33M 500G 1% /data
tmpfs tmpfs 2.4G 0 2.4G 0% /run/user/0
注意
:留意新增的分區文件系統,需要使用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]
接下來對剛剛在應用商店里部署的nfs服務進行一些小小的調整,從而滿足我們的需求,點擊升級可以更改應用的一些配置信息。
這里主要修改兩個地方。
- 主機調度:讓pod綁定在work-2上,從而始終在我們加了硬盤的主機之上。
- 數據卷:卷名可以自定義,主要是掛載路徑更改成我們預設的
/data
目錄,否則就會跑到它默認的/srv目錄下了。
調整之后,點擊升級就可以了,這樣就可以使用這個存儲卷了。
在rancher中有兩個關於存儲的名字,一個存儲類,一個持久卷。通俗一點理解的話,存儲類則像是邏輯卷,持久卷則像是從邏輯卷當中分出來的一個一個存儲分區,剛剛安裝的這個nfs屬於存儲類,后續需要的話,可以直接從里邊划分,非常方便,后邊部署應用的時候會用到,這里先說這么多。
- 2,添加持久卷。
上邊存儲卷配置完成之后還不能用,為了下邊部署應用順利,這里還需要添加一下持久卷。
來到集群的數據卷欄目,配置添加:
點擊創建之后,就能在持久卷當中看到一塊兒“磁盤”掛載了,后邊部署應用的時候也都可以使用了。
2,安裝服務。
各個服務安裝流程這里就不詳細說明了。不明白的,可以直接點擊下邊對應的地址進行參考:
3,進入正式配置。
如上我們已經准備了這么一堆的零件,現在該從何入手,仿佛一時間還有一些懵,這個時候,必然是先從最基礎的鏡像開始的,這是第一步。
思路大概應該是這樣,首先在Jenkins主機上將應用代碼克隆下來,然后進行編譯,接着編寫Dockerfile構建鏡像,然后跑一跑調試下,如果可以那么推到私服,接着就可以在rancher當中部署了,最后再整理一下流程當中的步驟,給它落實到Jenkins當中即可。
現在就遵照着上邊規划的思路,一步一步部署一個應用出來。
1,克隆代碼,構建應用。
因為最終這些都是落實到Jenkins當中的,所以制作鏡像也就直接在Jenkins身上完成了。
當然,這里的步驟,可以稍微省力的直接在Jenkins上進行調試,為了方便,我直接創建一個maven風格
的應用進行配置。
因為開始都是這些老生常談的幾項配置,所以就不再詳細敘述,直接通過下邊一個截圖看配置。
配置當中主要也就那么幾個事兒,保留8此構建歷史,添加文本參數實現代碼分支構建的需求,添加選項參數實現部署回滾的需求,添加git代碼地址,注意分支引用上邊文本參數的變量名稱,然后就是利用maven工具對項目進行編譯。
現在可以直接構建一次,讓應用包先打出來。
接着去到$WORKSPACE
里邊編寫Dockerfile。寫完之后進行一下構建,構建完成之后,run一下看看是否能夠正常跑起來,如果可以的話,就可以推到私服,進行部署的操作了。
把剛才說的這段話翻譯成shell腳本放進Jenkins,大概就是下邊的樣子:
#!/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="ebei-mudao"
version=`date +%Y%m%d%H%M%S`
echo -------------------------------------
# 進入項目target目錄
cd $WORKSPACE/$project-server/target/ && mv $project-server-1.0.jar app.jar
# 創建docker鏡像
cat > run.sh << EOF
#!/bin/bash
source /etc/profile
/opt/app.jar run
EOF
cat > app.conf << EOF
MODE=service
APP_NAME=$project-server
EOF
chmod +x run.sh app.jar
cat >Dockerfile << EOF
FROM 192.168.112.69/public/jdk:1.8
MAINTAINER eryajf <liqilong@edspay.com>
ENV LANG en_US.UTF-8
ADD app.jar /opt
ADD run.sh /
ADD app.conf /opt
EXPOSE 8004
ENTRYPOINT [ "sh", "-c", "/run.sh" ]
EOF
# 編譯鏡像
echoGreen "開始構建當次鏡像!"
docker build -t 192.168.112.69/mudao/$project:$version .
這里有一些個人小心得,特此表達一下。
1,包名優化。
因為同類應用最后生成的包名如下:
- ebei-a-server-1.0.jar
- ebei-b-server-1.0.jar
- ebei-c-server-1.0.jar
進入到容器之后就不必計較這些分別,所以就統一成了app.jar,從而讓腳本的通用性更強,在后續新增項目的時候,修改更少的代碼即能部署,以提高效率。
2,巧用cat的特性。
因為Dockerfile需要一些文件來輔助,創建這些文件的時候,我用到了cat
這個命令,上邊包名優化的時候可以一致,而下邊配置內容里邊,卻又要保證項目名稱保持原樣,於是調用一開始的project變量
,通過cat命令之后,會直接將APP_NAME=$project-server
執行為APP_NAME=ebei-mudao-server
,如此以來,其他應用部署的時候,這個配置就不用改了,只需更改一下開頭的project對應的名稱即可。
2,推送鏡像,部署應用。
鏡像制作完成並測試之后,就可以推送到私服當中了。
[root@jenkins target]$docker push 192.168.112.69/mudao/ebei-mudao:20190428190020
The push refers to a repository [192.168.112.69/mudao/ebei-mudao]
506b28e05d9d: Pushed
0f9f466d3574: Pushed
e2ba34130aac: Pushed
952ea0986f6c: Mounted from mudao/ebei-admin
2d0c92e53222: Mounted from mudao/ebei-admin
129b697f70e9: Mounted from mudao/ebei-admin
20190428190020: digest: sha256:25789d14f7be659c1c21bd4c48a853e147dd5be18b184133a41873526e048cb5 size: 1574
然后就可以來到rancher當中進行應用的部署了,因為rancher集成了很友好的UI界面,所以常規應用部署直接在UI中操作就可以了。
進入到集群中,在工作負載當中點擊部署應用,按照下圖內容進行配置:
- 1,定義將要部署的應用名稱,這里最好與上邊腳本中
$project
的值相等,以便於腳本的上下文調用。 - 2,填入剛剛生成的鏡像地址。
- 3,選擇應用所屬的命名空間,第一次可以新建一個。
- 4,填入容器當中應用的端口。
- 5,填入將要映射出來的端口,這個地方建議合理規划與使用。
- 6,通過端口檢查來做健康檢查,根據應用初始化情況合理設置后邊的時間。
- 7,在
添加卷
中選擇使用現有的持久卷
,卷名自定義。 - 8,下拉選擇一開始准備環境時添加的持久卷。
- 9,根據自己的需求掛載容器目錄,我這里是把應用的日志目錄掛載了出來。
- 10,定義掛載在持久卷中的目錄名稱。
接着點擊創建,即完成了應用的部署。
部署完成之后,也可以訪問一下,點擊應用名稱下邊的端口,即可直接跳轉訪問。
這樣,也就完成了一個應用的部署,剩下的事情,就是將剛剛遺留的一些東西放入到Jenkins腳本當中即可。
等等,在進行后邊的事情之前,先來看下日志的情況,首先在rancher當中可以直接查看。
接着再去我們一開始配置的存儲類對應的節點上看看日志是什么狀況。
[root@work-2 ebei-mudao]$ pwd
/data/pvc-3a632cf3-698c-11e9-a71b-0050568fa4d0/ebei-mudao
[root@work-2 ebei-mudao]$ ls
api.log error.log root.log
可以看到日志也如一開始預期的出現了,其中pvc-3a632cf3-698c-11e9-a71b-0050568fa4d0
是上邊創建的持久卷的名稱,ebei-mudao
則是剛剛部署應用時定義的。
3,完善腳本,一鍵部署。
因為上邊的腳本已經完成了大部分工作,剩下的無非就是補充一下推送鏡像的代碼以及部署的代碼。
整理之后的代碼完整內容如下:
#!/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="ebei-mudao"
version=`date +%Y%m%d%H%M%S`
echo -------------------------------------
# 進入項目target目錄
cd $WORKSPACE/$project-server/target/ && mv $project-server-1.0.jar app.jar
# 創建docker鏡像
cat > run.sh << EOF
#!/bin/bash
source /etc/profile
/opt/app.jar run
EOF
cat > app.conf << EOF
MODE=service
APP_NAME=$project-server
EOF
chmod +x run.sh app.jar
cat >Dockerfile << EOF
FROM 192.168.112.69/public/jdk:1.8
MAINTAINER eryajf <liqilong@edspay.com>
ENV LANG en_US.UTF-8
ADD app.jar /opt
ADD run.sh /
ADD app.conf /opt
EXPOSE 8004
ENTRYPOINT [ "sh", "-c", "/run.sh" ]
EOF
# 編譯鏡像
echoGreen "開始構建當次鏡像!"
docker build -t 192.168.112.69/mudao/$project:$version .
# 上傳到docker私服
echoGreen "開始將鏡像push到私服!"
docker push 192.168.112.69/mudao/$project:$version
[ $? != 0 ] && echoRed "請注意,在執行push上傳時出錯,故而退出!" && exit 1
docker rmi 192.168.112.69/mudao/$project:$version
#更新鏡像
echoGreen "開始將最新鏡像部署到遠端!"
rancher kubectl set image deployment/$project $project=192.168.112.69/mudao/$project:$version -n mudao
[ $? != 0 ] && echoRed "請注意,在執行鏡像更新時出錯,故而退出!" && exit 1
echoGreen "部署完成!"
簡單清晰,放入Jenkins,然后再次點擊一下構建,看看是否能夠將新的構建內容部署到rancher去。
點擊Jenkins構建日志看到流程是順利的。
然后來到rancher這邊,看到新的應用已經開始部署了。
由於之前配置的策略是滾動: 先啟動新Pod,再停止舊Pod
,所以整個部署過程是不會影響到業務的正常訪問的。
另一方面,因為整個全局都有在考慮着規范化的問題,所以這樣一個應用配置流程走完之后,以后再新增應用的時候,直接Jenkins復制Job,僅需要更改一些代碼地址,$project
的變量內容,然后rancher上復制應用,對應更改一些地方,一個新的應用就這么上線了,算起來,應該不會超過五分鍾的吧,與傳統方式對比起來,優勢立馬就顯出來了。
這就是幾個零散的工具之間聯動的整個流程,特此記錄。
突然想感慨一下,有的人稍有成就,便不再努力,混吃等死,墮入深淵,有的人則永不休止,不斷精進,最終走向人生巔峰。忽然感覺到,成功的路上,的確不太擁擠。
轉自大神,如有冒犯還請寬恕
Rancher-2.2.2學習筆記-Jenkins+rancher+harbor+Gitlab部署應用到生產 |坐而言不如起而行! 二丫講梵 http://www.eryajf.net/2746.html