天天看點

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

【玩轉容器持久化存儲】

點我進入活動頁面

目錄和架構(文章最後可擷取更多資料)

本文分為7個段落,完成前5個段落即可實作标準的CI/CD環境,最後2個段落驗證CI/CD環境的pipeline。

一、建立NAS資源

二、建立ACK叢集

三、配置NAS挂載資訊

四、建立GitLab平台

五、建立Jenkins平台

六、配置demo應用的CI/CD環境

七、示範demo應用的CI/CD的pipeline

CI/CD架構圖:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

1. 開通NAS服務

阿裡雲檔案存儲NAS是一個可共享通路,彈性擴充,高可靠,高性能的分布式檔案系統。它可以為容器提供持久化的存儲服務。在接下來的操作裡,您的網頁檔案将會被儲存在NAS檔案系統中,當容器pod被建立後即可直接調用NAS裡的檔案,并且在pod被銷毀後,NAS裡的檔案也會繼續留存。

如果您還沒有開通NAS服務,請登入

NAS開通頁面

,點選“立即開通”按鈕,完成開通流程。

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

2. 建立極速型NAS

網站服務需要存儲系統提供低延遲時間性能,是以極速型檔案系統(時延0.3毫秒)最适合這種場景。其他NAS類型,如通用容量型主要适用于大容量檔案存儲類應用,通用性能型主要适用于高帶寬檔案通路類應用。

在您開通NAS服務之後,請登入

NAS控制台

,點選“建立極速型NAS檔案系統”,選擇您業務所在的地域,然後逐個檢視可用區,直到“類型”一項顯示“進階型”,最後點選“立即購買”,完成付款。

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐
基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

3. 建立專有網絡VPC

為了使容器叢集能夠挂載使用剛剛建立的NAS檔案系統,您需要配置相應的網絡環境,包括一個專有網絡VPC和一個NAS挂載點。将虛拟交換機和NAS檔案系統放在同一個可用區,可以将時延降到最低。

如果您在業務所在的地域還沒有專有網絡VPC,請登入

VPC控制台

,建立一個專有網絡。在填寫“交換機”資訊時,請選擇NAS所在的可用區。

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐
基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

4. 建立NAS挂載點

NAS挂載點是計算平台挂載使用NAS所需的網絡入口。如果把容器服務比喻成一台筆記本電腦,把NAS檔案系統比喻成一個移動硬碟,那麼NAS挂載點就相當于一條USB線,可以将二者連接配接起來。

回到

,點選左側引導欄中的“檔案系統清單”,然後在頁面最上方選擇業務所在的地域,最後點選剛建立的檔案系統ID,進入檔案系統詳情頁。

進入檔案系統詳情頁後,點選左側引導欄中的“挂載使用”,點選“添加挂載點”,在對話框中選擇“專有網絡”、剛剛建立的專有網絡VPC、剛剛建立的交換機、“VPC預設權限組”,點選确定,等待NAS挂載點建立完成。

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐
基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

容器服務Kubernetes版(也稱作ACK)提供托管的K8S容器服務,您可以使用圖形化界面實作各種配置,例如挂載NAS、部署應用、配置應用彈性擴充等操作,比自建K8S使用起來友善許多。在接下來的操作裡,ACK叢集将作為網站的服務端運作NGINX架構,處理使用者發來的HTTP請求。

登入

“容器服務Kubernetes版”控制台

,如果需要則完成授權流程,點選“建立叢集”、“标準型叢集”。

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

1. 叢集配置

在“叢集配置”頁面中,填寫叢集名稱,選擇NAS所在地域,選擇NAS挂載點所在的專有網絡VPC和交換機,其餘選項保留預設,點選“下一步”繼續。

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

2. Worker配置

在“Worker配置”頁面中,選擇您業務需要的“執行個體規格”,配置“登入方式”,點選“下一步”繼續。

3. 元件配置

在“元件配置”頁面中,保留預設的“安裝Ingress插件”、“公網”負載均衡類型和“CSI”存儲插件,點選“下一步”繼續。

4. 确認配置

在“确認配置”頁面中,檢查您的容器叢集配置,如果“依賴檢查”失敗則處理相關問題,勾選同意服務條款,最後點選“建立叢集”,等待大約10分鐘後,叢集建立成功。

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

要使用ACK服務挂載使用NAS,需要先配置容器存儲卷PV和存儲聲明PVC資訊,這些資訊将會在您部署NGINX應用的時候用到。

1. 建立命名空間gitops

我們将會把gitlab和jenkins全部部署到此命名空間下,在ACK叢集詳情頁面中,點選左側引導欄中的“命名空間”,點選“建立”。

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

2. 配置存儲卷

ACK叢集清單

,點選剛剛建立的ACK叢集名稱,進入叢集詳情頁。

進入叢集詳情頁後,點選左側引導欄中的“存儲卷”,點選“存儲卷”标簽頁,點選“建立”,選擇“NAS”存儲卷類型,填寫存儲卷名稱,選擇NAS挂載點,最後點選“建立”。其他内容保留預設值即可。

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐
基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

3. 配置存儲聲明

完成存儲卷配置後,請點選“存儲聲明”标簽頁(注意選擇gitops命名空間),點選“建立”,選擇“NAS”存儲聲明類型,填寫存儲聲明名稱,選擇剛剛建立的存儲卷,最後點選“建立”。其他内容保留預設值即可。

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

完成上述準備工作後,就可以建立GitLab平台。

1. 建立GitLab應用(可選項,可以對接已有GitLab環境)

容器服務控制台上依次點選 市場 -> 應用目錄 -> gitlab-ce 。

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

在 參數 中設定externalUrl和gitlabRootPassword後選擇gitops命名空間并建立應用,本次實踐中 externalUrl 設定為 

http://gitlab.prytest.com/,

如果沒有dns解析的話,可以在建立成功後直接使用ip。

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

容器服務控制台上依次點選 叢集 -> 服務 檢視gitlab應用的通路位址,大約2分鐘後可通路gitlab并登陸,管理者名為root,密碼為剛配置的gitlabRootPassword:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐
基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

完成上述準備工作後,就可以建立Jenkins平台。

1. 建立Jenkins應用

容器服務控制台上依次點選 市場 -> 應用目錄 ->  jenkins 。

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

在 參數 中設定Master.AdminPassword的值,選擇gitops命名空間後點選建立:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

容器服務控制台上依次點選 叢集 -> 服務 檢視jenkins應用的通路位址,大約1分鐘後可通路jenkins并登陸:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐
基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

2. 将NAS配置為Jenkins的workspace

NAS作為Jenkins的workspace有以下幾個優點:

  • 無需為每個worker申請磁盤,所有worker共享一個NAS作為持久存儲,無需為worker配置大量存儲空間;
  • pipeline的git代碼持久存儲在NAS中,每次建構可增量建構,縮減git下載下傳代碼的時間,加速建構過程;
  • NAS持久存儲如java maven的依賴庫,所有應用共享依賴庫,無需每次下載下傳依賴庫,加速建構過程;
  • 容器故障後需要在不同宿主節點進行切換,共享NAS存儲可以保證在容器的持久化資料在切換過程中不丢失,達到增量建構的加速效果。

Jenkins控制台上依次點選 Manage Jenkins -> Manage Nodes and Clouds ->  Configure Clouds 。

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

配置jenkins-nas作為/home/jenkins/agent的存儲目錄:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

CI/CD的環境準備就緒,我們現在可以配置一個demo應用。

1. 建立private group application

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

2. 建立并上傳private project application-demo

建立private project application-demo, 示例源碼位址:

https://code.aliyun.com/haoshuwei/application-demo.git           

上傳源碼到自己的源碼倉庫之前需要注意修改application-demo.yaml檔案中的cbf5fdabb9f6a4d5897190935ab3d3155字段為您自己的k8s叢集id:

- host: INGRESS_HOST.cbf5fdabb9f6a4d5897190935ab3d3155.cn-beijing.alicontainer.com           
基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

上傳源碼到自己的源碼倉庫之前需要注意删除application-demo.yaml檔案中的nodePort字段,删除後nodePort會随機生成,避免釋出應用的port沖突(參考連結:

http://dockone.io/article/4884

):

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐
基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

從master建立一個分支latest:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

設定master和latest分支隻有管理者才能merge和push代碼的操作:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐
基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

3. 建立private group builds

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

4. 建立并上傳private project preview-pipeline staging-pipeline production-pipeline

preview-pipeline示例源碼位址為:

https://code.aliyun.com/haoshuwei/preview-pipeline.git           

staging-pipeline示例源碼位址為:

https://code.aliyun.com/haoshuwei/staging-pipeline.git           

production-pipeline示例源碼位址為:

https://code.aliyun.com/haoshuwei/production-pipeline.git           

上傳3個建構項目之前需要替換以下字段:

IMAGE_REPO:應用容器鏡像要上傳到哪個鏡像倉庫,鏡像倉庫位址(倉庫名為application-demo,設定為公共倉庫);

dingTalkToken:釘釘通知所使用的釘釘機器人accessToken;

Fetch Git Repo -> credentialsId:用于Jenkins拉取git項目的證書名稱,需要在Jenkins中建立名為gitlab的證書;

Fetch Git Repo -> url:Jenkins拉取git repo的url;

Maven Build -> cmd:修改mvn指令行為"mkdir -p /home/jenkins/agent/workspace/maven-repository;rm -rf /root/.m2;ln -s /home/jenkins/agent/workspace/maven-repository /root/.m2;mvn package -B -DskipTests",/root/.m2/repository為maven的預設本地緩存倉庫,我們在這裡建立一個軟連結,連結到/home/jenkins/agent/workspace/maven-repository,即可實作将repository持久存儲在NAS中,加速maven建構過程。

Docker Build And Publish->kaniko:增加--skip-tls-verify選項,避免認證錯誤。

代碼示例如下:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐
基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

5. 注冊一個普通開發者使用者developer

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

管理者使用者登入後将developer使用者添加為application組的developer member:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

此時developer使用者隻有application組下projects的權限, 沒有builds組的權限:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

6. 生成一個apiToken用于Jenkins配置gitlabConnection

生成并複制儲存apiToken:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

7. 配置gitlabConnection

系統管理 -> 系統設定 -> Gitlab:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐
基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

配置完畢後點選 Save 儲存。

8. 建立建構任務preview-pipeline

8.1 建立任務,輸入名稱選擇流水線類型并點選建立:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

8.2 Build Triggers 區域勾選 GitLab 插件配置如圖所示:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

點選 Advanced 進行進階選項配置如圖所示:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

複制并儲存GitLab webhook URL和Secret token的值用于在Gitlab上配置webhook。

8.3 Pipeline區域配置preview-pipeline建構項目的git repo

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐
基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

完成配置後點選 儲存。

9. 建立建構任務staging-pipeline

9.1 建立任務,輸入名稱選擇流水線類型并點選建立:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

9.2 Build Triggers 區域勾選 GitLab 插件配置如圖所示:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐
基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

9.3 Pipeline區域配置staging-pipeline建構項目的git repo

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

10. 建立建構任務production-pipeline

10.1 建立任務,輸入名稱選擇流水線類型并點選建立:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

10.2 Build Triggers 區域勾選 GitLab 插件配置如圖所示:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐
基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

10.3 Pipeline區域配置production-pipeline建構項目的git repo

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

11. 建立docker registry auth secret

在K8s控制台點選使用CloudShell管理叢集,該secret配置會用于jenkins push和pull鏡像:

$ docker login registry.cn-shenzhen.aliyuncs.com
$ kubectl -n gitops create secret generic jenkins-docker-cfg --from-file=/home/shell/.docker/config.json           

12. 建立clusterrolebinding授予serviceaccount default對gitops命名空間的管理權限

clusterrolebinding.yaml:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: gitops-cluster-admin
subjects:
  - kind: ServiceAccount
    name: default
    namespace: gitops
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io           
$ kubectl create -f clusterrolebinding.yaml           

13. 設定Jenkins匿名使用者的可讀權限

系統管理 ->全局安全管理-> Authorization -> 勾選 Allow anonymous read access 并儲存:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

14. 配置GitLab webhook

進入application-demo項目的webhook配置頁面:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

15. 配置觸發jenkins job preview-pipeline的觸發器

如圖所示:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

16. 配置觸發jenkins job staging-pipeline的觸發器

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

17. 配置觸發jenkins job production-pipeline的觸發器

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

1. developer使用者修改代碼并送出MergeRequest到latest分支

1.1 在application-demo項目上建立一個開發分支features/change-index-1

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

1.2 修改src/main/resources/static/index.html中的kubernetes.svg為jenkins.svg并送出修改

1.3 建立請求合并到latest分支的Merge Request

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

Open MergeRequest的動作會觸發jenkins job preview-pipeline的自動建構,并完成以下stages:

(1)拉取

http://xxx.xxx.xxx/builds/preview-pipeline.git

項目并按照Jenkins定義的内容繼續執行以下内容

(2)Fetch Git Repo: 拉取應用源碼項目

http://xxx.xxx.xxx.xxx/application/application-demo.git

(3)Maven Build: 打包

(4)Maven Test: 測試

(5)Docker Build And Publish: docker鏡像建構和推送

(6)Kubectl Deploy: 部署應用到Kubernetes叢集(本示例使用的是本叢集的一個動态建立的命名空間preview-xxx)

(7)Post Actions: 釘釘通知

developer可以檢視Merge Request頁面的内容

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

點選可跳轉至jenkins建構日志:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

1.4 建構完成後可以看到一個application-demo應用的預覽頁面

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

點選預覽應用:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

也可以直接在釘釘群裡檢視應用通路連結等資訊:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

1.5 應用預覽驗證後, developer可以申請管理者接受此合并

2. 管理者合并指向latest分支的MergeRequest

合并MR:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

Accept MR的動作或觸發staging-pipeline的建構,拉取application-demo項目的latest分支代碼并建構和部署到staging命名空間下。

檢視釘釘通知并通路staging環境中的application-demo應用:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐
基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

3. 管理者建立latest到master分支的Merge Request并合并此指向master的Merge Request

Accept MR的動作或觸發production-pipeline的建構,拉取application-demo項目的master分支代碼并建構和部署到production命名空間下。

檢視釘釘通知并通路production環境中的application-demo應用:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐
基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

4. 對比使用NAS後的建構加速的效果

未修改maven倉庫為NAS目錄前的Maven Build耗時7分鐘,并且嚴重依賴優良的網絡環境:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

修改maven倉庫為NAS目錄後的Maven Build耗時15秒:

基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐

更多資料

阿裡雲檔案存儲NAS支援SMB、NFS、CPFS三款檔案系統,滿足Windows、Linux、高性能計算等全場景應用,歡迎進群交流高性能分布式存儲技術。

•阿裡雲容器存儲解決方案

https://www.aliyun.com/solution/datatest/containernas

•阿裡雲檔案存儲 NAS

https://www.aliyun.com/product/nas

•阿裡雲檔案存儲 CPFS

https://www.aliyun.com/product/nas_cpfs

•阿裡雲容器服務 ACK

https://www.aliyun.com/product/kubernetes

•阿裡雲 Serverless 容器服務 ASK

https://www.aliyun.com/product/cs/ask

•阿裡雲開發者社群-阿裡雲存儲服務

https://developer.aliyun.com/group/storage
基于K8s、NAS、GitLab、Jenkins的持續內建傳遞容器環境最佳實踐