【玩轉容器持久化存儲】
點我進入活動頁面目錄和架構(文章最後可擷取更多資料)
本文分為7個段落,完成前5個段落即可實作标準的CI/CD環境,最後2個段落驗證CI/CD環境的pipeline。
一、建立NAS資源
二、建立ACK叢集
三、配置NAS挂載資訊
四、建立GitLab平台
五、建立Jenkins平台
六、配置demo應用的CI/CD環境
七、示範demo應用的CI/CD的pipeline
CI/CD架構圖:
1. 開通NAS服務
阿裡雲檔案存儲NAS是一個可共享通路,彈性擴充,高可靠,高性能的分布式檔案系統。它可以為容器提供持久化的存儲服務。在接下來的操作裡,您的網頁檔案将會被儲存在NAS檔案系統中,當容器pod被建立後即可直接調用NAS裡的檔案,并且在pod被銷毀後,NAS裡的檔案也會繼續留存。
如果您還沒有開通NAS服務,請登入
NAS開通頁面,點選“立即開通”按鈕,完成開通流程。
2. 建立極速型NAS
網站服務需要存儲系統提供低延遲時間性能,是以極速型檔案系統(時延0.3毫秒)最适合這種場景。其他NAS類型,如通用容量型主要适用于大容量檔案存儲類應用,通用性能型主要适用于高帶寬檔案通路類應用。
在您開通NAS服務之後,請登入
NAS控制台,點選“建立極速型NAS檔案系統”,選擇您業務所在的地域,然後逐個檢視可用區,直到“類型”一項顯示“進階型”,最後點選“立即購買”,完成付款。
3. 建立專有網絡VPC
為了使容器叢集能夠挂載使用剛剛建立的NAS檔案系統,您需要配置相應的網絡環境,包括一個專有網絡VPC和一個NAS挂載點。将虛拟交換機和NAS檔案系統放在同一個可用區,可以将時延降到最低。
如果您在業務所在的地域還沒有專有網絡VPC,請登入
VPC控制台,建立一個專有網絡。在填寫“交換機”資訊時,請選擇NAS所在的可用區。
4. 建立NAS挂載點
NAS挂載點是計算平台挂載使用NAS所需的網絡入口。如果把容器服務比喻成一台筆記本電腦,把NAS檔案系統比喻成一個移動硬碟,那麼NAS挂載點就相當于一條USB線,可以将二者連接配接起來。
回到
,點選左側引導欄中的“檔案系統清單”,然後在頁面最上方選擇業務所在的地域,最後點選剛建立的檔案系統ID,進入檔案系統詳情頁。
進入檔案系統詳情頁後,點選左側引導欄中的“挂載使用”,點選“添加挂載點”,在對話框中選擇“專有網絡”、剛剛建立的專有網絡VPC、剛剛建立的交換機、“VPC預設權限組”,點選确定,等待NAS挂載點建立完成。
容器服務Kubernetes版(也稱作ACK)提供托管的K8S容器服務,您可以使用圖形化界面實作各種配置,例如挂載NAS、部署應用、配置應用彈性擴充等操作,比自建K8S使用起來友善許多。在接下來的操作裡,ACK叢集将作為網站的服務端運作NGINX架構,處理使用者發來的HTTP請求。
登入
“容器服務Kubernetes版”控制台,如果需要則完成授權流程,點選“建立叢集”、“标準型叢集”。
1. 叢集配置
在“叢集配置”頁面中,填寫叢集名稱,選擇NAS所在地域,選擇NAS挂載點所在的專有網絡VPC和交換機,其餘選項保留預設,點選“下一步”繼續。
2. Worker配置
在“Worker配置”頁面中,選擇您業務需要的“執行個體規格”,配置“登入方式”,點選“下一步”繼續。
3. 元件配置
在“元件配置”頁面中,保留預設的“安裝Ingress插件”、“公網”負載均衡類型和“CSI”存儲插件,點選“下一步”繼續。
4. 确認配置
在“确認配置”頁面中,檢查您的容器叢集配置,如果“依賴檢查”失敗則處理相關問題,勾選同意服務條款,最後點選“建立叢集”,等待大約10分鐘後,叢集建立成功。
要使用ACK服務挂載使用NAS,需要先配置容器存儲卷PV和存儲聲明PVC資訊,這些資訊将會在您部署NGINX應用的時候用到。
1. 建立命名空間gitops
我們将會把gitlab和jenkins全部部署到此命名空間下,在ACK叢集詳情頁面中,點選左側引導欄中的“命名空間”,點選“建立”。
2. 配置存儲卷
ACK叢集清單,點選剛剛建立的ACK叢集名稱,進入叢集詳情頁。
進入叢集詳情頁後,點選左側引導欄中的“存儲卷”,點選“存儲卷”标簽頁,點選“建立”,選擇“NAS”存儲卷類型,填寫存儲卷名稱,選擇NAS挂載點,最後點選“建立”。其他内容保留預設值即可。
3. 配置存儲聲明
完成存儲卷配置後,請點選“存儲聲明”标簽頁(注意選擇gitops命名空間),點選“建立”,選擇“NAS”存儲聲明類型,填寫存儲聲明名稱,選擇剛剛建立的存儲卷,最後點選“建立”。其他内容保留預設值即可。
完成上述準備工作後,就可以建立GitLab平台。
1. 建立GitLab應用(可選項,可以對接已有GitLab環境)
容器服務控制台上依次點選 市場 -> 應用目錄 -> gitlab-ce 。
在 參數 中設定externalUrl和gitlabRootPassword後選擇gitops命名空間并建立應用,本次實踐中 externalUrl 設定為
http://gitlab.prytest.com/,如果沒有dns解析的話,可以在建立成功後直接使用ip。
容器服務控制台上依次點選 叢集 -> 服務 檢視gitlab應用的通路位址,大約2分鐘後可通路gitlab并登陸,管理者名為root,密碼為剛配置的gitlabRootPassword:
完成上述準備工作後,就可以建立Jenkins平台。
1. 建立Jenkins應用
容器服務控制台上依次點選 市場 -> 應用目錄 -> jenkins 。
在 參數 中設定Master.AdminPassword的值,選擇gitops命名空間後點選建立:
容器服務控制台上依次點選 叢集 -> 服務 檢視jenkins應用的通路位址,大約1分鐘後可通路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 。
配置jenkins-nas作為/home/jenkins/agent的存儲目錄:
CI/CD的環境準備就緒,我們現在可以配置一個demo應用。
1. 建立private group application
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
上傳源碼到自己的源碼倉庫之前需要注意删除application-demo.yaml檔案中的nodePort字段,删除後nodePort會随機生成,避免釋出應用的port沖突(參考連結:
http://dockone.io/article/4884):
從master建立一個分支latest:
設定master和latest分支隻有管理者才能merge和push代碼的操作:
3. 建立private group builds
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選項,避免認證錯誤。
代碼示例如下:
5. 注冊一個普通開發者使用者developer
管理者使用者登入後将developer使用者添加為application組的developer member:
此時developer使用者隻有application組下projects的權限, 沒有builds組的權限:
6. 生成一個apiToken用于Jenkins配置gitlabConnection
生成并複制儲存apiToken:
7. 配置gitlabConnection
系統管理 -> 系統設定 -> Gitlab:
配置完畢後點選 Save 儲存。
8. 建立建構任務preview-pipeline
8.1 建立任務,輸入名稱選擇流水線類型并點選建立:
8.2 Build Triggers 區域勾選 GitLab 插件配置如圖所示:
點選 Advanced 進行進階選項配置如圖所示:
複制并儲存GitLab webhook URL和Secret token的值用于在Gitlab上配置webhook。
8.3 Pipeline區域配置preview-pipeline建構項目的git repo
完成配置後點選 儲存。
9. 建立建構任務staging-pipeline
9.1 建立任務,輸入名稱選擇流水線類型并點選建立:
9.2 Build Triggers 區域勾選 GitLab 插件配置如圖所示:
9.3 Pipeline區域配置staging-pipeline建構項目的git repo
10. 建立建構任務production-pipeline
10.1 建立任務,輸入名稱選擇流水線類型并點選建立:
10.2 Build Triggers 區域勾選 GitLab 插件配置如圖所示:
10.3 Pipeline區域配置production-pipeline建構項目的git repo
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 并儲存:
14. 配置GitLab webhook
進入application-demo項目的webhook配置頁面:
15. 配置觸發jenkins job preview-pipeline的觸發器
如圖所示:
16. 配置觸發jenkins job staging-pipeline的觸發器
17. 配置觸發jenkins job production-pipeline的觸發器
1. developer使用者修改代碼并送出MergeRequest到latest分支
1.1 在application-demo項目上建立一個開發分支features/change-index-1
1.2 修改src/main/resources/static/index.html中的kubernetes.svg為jenkins.svg并送出修改
1.3 建立請求合并到latest分支的Merge Request
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頁面的内容
點選可跳轉至jenkins建構日志:
1.4 建構完成後可以看到一個application-demo應用的預覽頁面
點選預覽應用:
也可以直接在釘釘群裡檢視應用通路連結等資訊:
1.5 應用預覽驗證後, developer可以申請管理者接受此合并
2. 管理者合并指向latest分支的MergeRequest
合并MR:
Accept MR的動作或觸發staging-pipeline的建構,拉取application-demo項目的latest分支代碼并建構和部署到staging命名空間下。
檢視釘釘通知并通路staging環境中的application-demo應用:
3. 管理者建立latest到master分支的Merge Request并合并此指向master的Merge Request
Accept MR的動作或觸發production-pipeline的建構,拉取application-demo項目的master分支代碼并建構和部署到production命名空間下。
檢視釘釘通知并通路production環境中的application-demo應用:
4. 對比使用NAS後的建構加速的效果
未修改maven倉庫為NAS目錄前的Maven Build耗時7分鐘,并且嚴重依賴優良的網絡環境:
修改maven倉庫為NAS目錄後的Maven Build耗時15秒:
更多資料
阿裡雲檔案存儲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