1. 程式人生 > 實用技巧 >Rancher-2.2.2學習筆記-Jenkins+rancher+harbor+Gitlab部署應用到生產【轉】

Rancher-2.2.2學習筆記-Jenkins+rancher+harbor+Gitlab部署應用到生產【轉】

關於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目錄下。

  1. [root@work-2 ~]$df -hT
  2. Filesystem Type Size Used Avail Use% Mounted on
  3. /dev/mapper/centos-root xfs 196G 12G 184G 6% /
  4. devtmpfs devtmpfs 12G 0 12G 0% /dev
  5. tmpfs tmpfs 12G 0 12G 0% /dev/shm
  6. tmpfs tmpfs 12G 12M 12G 1% /run
  7. tmpfs tmpfs 12G 0 12G 0% /sys/fs/cgroup
  8. /dev/sda1 xfs 497M 208M 290M 42% /boot
  9. /dev/sdb1 xfs 500G 33M 500G 1% /data
  10. tmpfs tmpfs 2.4G 0 2.4G 0% /run/user/0

注意:留意新增的分割槽檔案系統,需要使用xfs的,否則後期可能會出現pod掛載失敗的報錯。報錯內容如下:

  1. 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,大概就是下邊的樣子:

  1. #!/bin/bash
  2. source /etc/profile
  3. #
  4. ##set color##
  5. echoRed() { echo $'\e[0;31m'"$1"$'\e[0m'; }
  6. echoGreen() { echo $'\e[0;32m'"$1"$'\e[0m'; }
  7. echoYellow() { echo $'\e[0;33m'"$1"$'\e[0m'; }
  8. ##set color##
  9. #
  10. project="ebei-mudao"
  11. version=`date +%Y%m%d%H%M%S`
  12. echo -------------------------------------
  13. # 進入專案target目錄
  14. cd $WORKSPACE/$project-server/target/ && mv $project-server-1.0.jar app.jar
  15. # 建立docker映象
  16. cat > run.sh << EOF
  17. #!/bin/bash
  18. source /etc/profile
  19. /opt/app.jar run
  20. EOF
  21. cat > app.conf << EOF
  22. MODE=service
  23. APP_NAME=$project-server
  24. EOF
  25. chmod +x run.sh app.jar
  26. cat >Dockerfile << EOF
  27. FROM 192.168.112.69/public/jdk:1.8
  28. MAINTAINER eryajf <liqilong@edspay.com>
  29. ENV LANG en_US.UTF-8
  30. ADD app.jar /opt
  31. ADD run.sh /
  32. ADD app.conf /opt
  33. EXPOSE 8004
  34. ENTRYPOINT [ "sh", "-c", "/run.sh" ]
  35. EOF
  36. # 編譯映象
  37. echoGreen "開始構建當次映象!"
  38. 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,推送映象,部署應用。

映象製作完成並測試之後,就可以推送到私服當中了。

  1. [root@jenkins target]$docker push 192.168.112.69/mudao/ebei-mudao:20190428190020
  2. The push refers to a repository [192.168.112.69/mudao/ebei-mudao]
  3. 506b28e05d9d: Pushed
  4. 0f9f466d3574: Pushed
  5. e2ba34130aac: Pushed
  6. 952ea0986f6c: Mounted from mudao/ebei-admin
  7. 2d0c92e53222: Mounted from mudao/ebei-admin
  8. 129b697f70e9: Mounted from mudao/ebei-admin
  9. 20190428190020: digest: sha256:25789d14f7be659c1c21bd4c48a853e147dd5be18b184133a41873526e048cb5 size: 1574

然後就可以來到rancher當中進行應用的部署了,因為rancher集成了很友好的UI介面,所以常規應用部署直接在UI中操作就可以了。

進入到叢集中,在工作負載當中點選部署應用,按照下圖內容進行配置:

  • 1,定義將要部署的應用名稱,這裡最好與上邊指令碼中$project的值相等,以便於指令碼的上下文呼叫。
  • 2,填入剛剛生成的映象地址。
  • 3,選擇應用所屬的名稱空間,第一次可以新建一個。
  • 4,填入容器當中應用的埠。
  • 5,填入將要映射出來的埠,這個地方建議合理規劃與使用。
  • 6,通過埠檢查來做健康檢查,根據應用初始化情況合理設定後邊的時間。
  • 7,在添加捲中選擇使用現有的持久卷,卷名自定義。
  • 8,下拉選擇一開始準備環境時新增的持久卷。
  • 9,根據自己的需求掛載容器目錄,我這裡是把應用的日誌目錄掛載了出來。
  • 10,定義掛載在持久卷中的目錄名稱。

接著點選建立,即完成了應用的部署。

部署完成之後,也可以訪問一下,點選應用名稱下邊的埠,即可直接跳轉訪問。

這樣,也就完成了一個應用的部署,剩下的事情,就是將剛剛遺留的一些東西放入到Jenkins腳本當中即可。

等等,在進行後邊的事情之前,先來看下日誌的情況,首先在rancher當中可以直接檢視。

接著再去我們一開始配置的儲存類對應的節點上看看日誌是什麼狀況。

  1. [root@work-2 ebei-mudao]$ pwd
  2. /data/pvc-3a632cf3-698c-11e9-a71b-0050568fa4d0/ebei-mudao
  3. [root@work-2 ebei-mudao]$ ls
  4. api.log error.log root.log

可以看到日誌也如一開始預期的出現了,其中pvc-3a632cf3-698c-11e9-a71b-0050568fa4d0是上邊建立的持久卷的名稱,ebei-mudao則是剛剛部署應用時定義的。

3,完善指令碼,一鍵部署。

因為上邊的指令碼已經完成了大部分工作,剩下的無非就是補充一下推送映象的程式碼以及部署的程式碼。

整理之後的程式碼完整內容如下:

  1. #!/bin/bash
  2. source /etc/profile
  3. #
  4. ##set color##
  5. echoRed() { echo $'\e[0;31m'"$1"$'\e[0m'; }
  6. echoGreen() { echo $'\e[0;32m'"$1"$'\e[0m'; }
  7. echoYellow() { echo $'\e[0;33m'"$1"$'\e[0m'; }
  8. ##set color##
  9. #
  10. project="ebei-mudao"
  11. version=`date +%Y%m%d%H%M%S`
  12. echo -------------------------------------
  13. # 進入專案target目錄
  14. cd $WORKSPACE/$project-server/target/ && mv $project-server-1.0.jar app.jar
  15. # 建立docker映象
  16. cat > run.sh << EOF
  17. #!/bin/bash
  18. source /etc/profile
  19. /opt/app.jar run
  20. EOF
  21. cat > app.conf << EOF
  22. MODE=service
  23. APP_NAME=$project-server
  24. EOF
  25. chmod +x run.sh app.jar
  26. cat >Dockerfile << EOF
  27. FROM 192.168.112.69/public/jdk:1.8
  28. MAINTAINER eryajf <liqilong@edspay.com>
  29. ENV LANG en_US.UTF-8
  30. ADD app.jar /opt
  31. ADD run.sh /
  32. ADD app.conf /opt
  33. EXPOSE 8004
  34. ENTRYPOINT [ "sh", "-c", "/run.sh" ]
  35. EOF
  36. # 編譯映象
  37. echoGreen "開始構建當次映象!"
  38. docker build -t 192.168.112.69/mudao/$project:$version .
  39. # 上傳到docker私服
  40. echoGreen "開始將映象push到私服!"
  41. docker push 192.168.112.69/mudao/$project:$version
  42. [ $? != 0 ] && echoRed "請注意,在執行push上傳時出錯,故而退出!" && exit 1
  43. docker rmi 192.168.112.69/mudao/$project:$version
  44. #更新映象
  45. echoGreen "開始將最新映象部署到遠端!"
  46. rancher kubectl set image deployment/$project $project=192.168.112.69/mudao/$project:$version -n mudao
  47. [ $? != 0 ] && echoRed "請注意,在執行映象更新時出錯,故而退出!" && exit 1
  48. 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