本文為時速雲 DevOps 研發項目組負責人李浩榮在 DockOne 社區的線上分享,主要介紹了時速雲基於 Kubernetes 和 Docker 實現 CI/CD 的一些解決方案和實踐總結,並對后續規划進行介紹。
內容簡介
- 面臨的 DevOps 需求
- CI/CD 規划概覽
2.1 架構總覽
2.2 關鍵技術
2.3 總結 - CI/CD 工具及實踐
3.1 工具及流程概覽
3.2 實踐說明 - CI/CD 流程總結
- 未來規划
01 “ 「面臨的DevOps需求」 ”
隨着客戶要求迭代速度的加快,公司的項目管理、交付管理面臨了來自公司內外部的巨大挑戰。
公司目前需要管理很多客戶項目和自身迭代產品項目,產品使用 Go、Java、NodeJS等多種技術棧的多個分支的代碼項目。而且每周需要交付多個測試版本進行持續驗證。同時,還要應對客戶現場的緊急版本修復、客戶定制版本交付等場景。
解決上述問題的核心就是要提升效率,加快交付速度。
02
“ 「CI/CD規划概覽」 ”
2.1 架構總覽
結合 Kubernetes 的一些基礎理念和特性,綜合考慮容器 PaaS 平台、微服務治理平台在 DevOps 的需求,並融合企業內部已有的 CI/CD 等工具,自主實現了一套更適合於雲原生應用平台的 DevOps 服務體系。基本的技術架構及實現方式如下圖所示:
上圖中,代碼倉庫中的代碼會被 Job 創建在構建節點上的 Pod 的容器拉取,並執行編譯、單元測試、掃描、打包,制作鏡像、 Push 鏡像等操作后,這個 Pod 就會被銷毀。容器日志會被節點的 Agent 發送到日志服務中心,可以提供容器被銷毀后的日志查詢。也可以使用 CronJob 執行定時任務。
該方案具備以下優勢:
- 不需要單獨部署復雜的高可用 CI/CD 服務,比如 Jenkins 集群等,簡化了部署管理的復雜度。
- 構建任務均通過鏡像進行封裝,並在容器中進行,接口更加標准、透明。
- 對構建任務的資源、限額、日志、監控、告警、計費等諸多能力可以直接利用PaaS 平台,而無需重復開發,PaaS 未來的能力也可以直接為 DevOps 服務。
- 可以通過容器 PaaS,讓構建任務具備更高級的調度能力。
- PaaS 層對底層資源的彈性伸縮也可以為 DevOps 服務,對構建資源進行伸縮策略的定義,實現構建資源的彈性。
- 對 DevOps 平台的管理運維可以同容器 PaaS 一致,沒有額外的學習成本。
- 通過容器、鏡像等標准概念,對構建任務進行封裝,並快速實現 DevOps 的構建模版,使得 DevOps 平台通過自定義模版具備更好的擴展能力。
2.2 關鍵技術
2.2.1 技術要點
這種架構模式下,可以把每一個構建任務通過 Pod Spec 來進行描述,相關的構建任務能力可以通過以下方式映射到 Pod Spec 中。
同樣道理,結合上層的 Job/CronJob,我們就可以控制構建的執行策略,比如構建任務期望的並⾏執⾏的最⼤ Pod 數量,期望的成功完成的 Pod 數量,從 Job 創建到活躍狀態的超時時間(默認 12 ⼩時),標記 Job 為失敗前的最⼤重試次數,默認 = 6;以及通過 Cron 格式的任務計划定義,Job 執⾏的並⾏策略,是否暫停后續執⾏,保留運⾏成功/失敗的歷史 Job 的數量。
2.2.2 實踐舉例
這里舉兩個例子,來說明時速雲 DevOps 平台中每個構建任務的工作原理:
構建 Docker 鏡像,也就是我們經常使用的從代碼生成鏡像的任務模版,其基本工作方式如下:
每個構建任務都是一個 Job,會按照用戶傳遞的信息組裝成 Job 的結構,並由 K8s 調度並執行,有 DevOps Manager 管理 Job的運行情況。其中使用了 InitContainer、Volume、Secret 等多種 K8s 資源。
服務持續部署,平台提供了鏡像部署、應用模版部署、Spinnaker、時速雲 DevOps 平台集成、應用包部署、服務狀態檢查等多種持續部署相關模版,通過靈活組合使用,可以滿足幾乎所有場景下的持續部署需求。如下圖所示的基本工作流程,我們會把不同部署方式封裝成對應的鏡像,並提供可視化配置界面供用戶使用。
同樣,我們也提供了忽略某個構建任務的執行,某個構建任務失敗時速雲 DevOps 平台繼續執行,指定構建節點,自定義構建任務所需資源,當然也支持構建任務使用 GPU 資源,進行機器學習相關的時速雲 DevOps 平台處理能力。
2.3 總結
借助 Kubernetes 自動編排、自動回收資源的機制,減少了人工干預。結合 Kubernetes 提供的豐富的資源類型,CI/CD 解決方案也有了更多的選項和思路。仿佛 Kubernetes 是為 CI/CD 專門定做的。
03 “ 「CI/CD工具及實踐」 ”
3.1 工具及流程概覽
我們的 DevOps 工具鏈有 Jira, Gitlab, 時速雲 DevOps 平台,Sonarqube, TestLink, Harbor
- Jira: 項目管理;
- Gitlab: 代碼托管、在線 Review;
- 時速雲 DevOps 平台:基於 Kubernetes 的代碼拉取,編譯,代碼掃描,單元測試,打包,構建鏡像、持續部署,審批,郵件;
- Sonarqube:代碼靜態掃描;
- TestLink: 測試管理;
- Harbor: 鏡像托管,鏡像安全掃描;
流程如下:
3.2 實踐說明
3.2.1 需求/缺陷管理
需求和缺陷管理我們使用功能強大的 Jira 工具,以兩周一迭代方式進行敏捷式開發。
3.2.2 代碼 Review/Merge
聊天工具集成 gitlab,PR 提交后 Reviewer 及時看到提交信息,進行 Review 和Merge
3.2.3 Gitlab觸發自動化構建
時速雲 DevOps 平台自動生成 Gitlab 項目的 webhook, 當 gitlab 有事件發生,把事件信息發送到時速雲 DevOps 平台,時速雲 DevOps 平台根據條件觸發自動執行構建。
3.2.4 時速雲 DevOps 平台
3.2.4.1 流程簡介
時速雲 DevOps 平台基於 Kubernetes 和 Docker 運行具體任務,由 Kubernetes 調度、執行完后銷毀。每一個任務模板最終生成 Kubernetes 的 Job,Job 會生成 Pod 運行任務, 並管理生命周期。
每個任務模板鏡像都有為自身任務的最小化工具。比如 maven 任務鏡像只有 maven 客戶端命令工具,容器被 job 生成時,會通過進入點運行 maven 命令,運行結束后將結束容器。代碼掃描任務會有 sonar-scanner 客戶端工具,Docker 構建任務可以運行Docker build 命令構建鏡像和 Push 鏡像到 Harbor。
鏡像推送到 Harbor 后會使用平台持續部署任務模板更新服務。
持續部署成功后服務會被升級到最新版本。
3.2.4.2 任務模板
時速雲 DevOps 平台的任務模板是為執行任務的鏡像和數據集合。
sonar 掃描任務為例,sonar 掃描任務執行就是容器化運行 sonar-scanner。
下圖為 sonar 掃描任務的 Dockerfile, 就是把代碼和 sonar 掃描配置文件拷貝到指定目錄,運行 sonar-scanner 命令。
執行結果以 Rest API 方式發送到平台,平台記錄執行結果,並根據設置執行下一步任務或失敗退出。
3.2.5 集成測試
測試有測試用例,測試用例有測試結果,如果測試結果與期待結果不符,同步到 Jira, 再執行編碼的步驟,形成一個閉環。
測試用例和測試版本的測試結果使用TestLink工具管理。
集成測試是人工測試和基於 Selenium 的 python 腳本的自動化測試共同完成。
3.2.6 Harbor 同步
測試人員進行測試通過以后,使用 Harbor 鏡像同步功能,同步到運維環境 Harbor。
3.2.7 Harbor 鏡像更新后通過觸發設置觸發執行部署任務
harbor的common/config/registry/config.yml設置notification屬性為時速雲 DevOps 平台 webhook 地址和認證方式,時速雲 DevOps 平台可以根據 payload 信息觸發執行 CI/CD。
3.2.8 部署運維服務
時速雲 DevOps 平台被觸發執行后,與上面部署一樣會根據新的鏡像更新部署新的服務。
3.2.9 自動標記 Jira
集成測試結束以后,通過 Jira API , 把 gitlab 中的大括號里相應的 Jira issue 為關閉狀態,添加部署版本說明。
3.2.10 保障代碼和最終交付產物的源頭一致性
如下圖,在代碼構建時把代碼的版本信息一同寫入鏡像可以做到最終交付產物和代碼源頭的一致性比較。
git rev-parse --shortHEAD > .gitversion
git log--pretty=oneline HEAD...$PREVIOUS_COMMIT_ID > .gitdiff
04 “ 「CI/CD流程總結」 ”
- Jira, Gitlab, TestLink, Harbor 等工具的集成、 Kubernetes 特性和各組件的靈活使用、自動化構建流程使得 CI/CD 流程縮短了交付時間。而且從代碼到最終交付產物的可驗證性,需求到代碼和 Bug 到代碼的可追溯性,提高了效率。
- 對於公司服務器的計算資源也使得因 Kubernetes 的機制發揮到優先資源下靈活應用,讓各個團隊避免了因為計算資源不夠等待資源的情況
- Kubernetes 的良好機制,使得公司有限服務器資源下靈活應用,讓各個團隊避免了因為計算資源不夠等待資源的情況。
- 時速雲 DevOps 平台任務模板容易擴張、可以快速集成其他第三方工具,也為管理、測試、研發團隊快速提供需要的工具集成。
- 時速雲 DevOps 平台任務模板的最小化,節省了資源,節省了費用。
- 對部分開源項目的修改和貢獻也提高了工作的效率。比如修改 Harbor 的用戶賬戶體系和驗證方式與平台一致,減少了用戶在交付中鏡像賬號的額外管理。修改 TestLink 源碼,實現一鍵創建 Jira Bug ,自動使 Jira 項目管理與測試管理工具互相追蹤,方便查看與管理。
當然我們的 CI/CD 流程還有很多不足,比如缺少 ChatOps 等更方便的功能、對已有流程復盤並優化、還需要集成更多 CI/CD 工具等。
05 “ 「未來規划」 ”
1) 隨着 Kubernetes 的版本升級,提供了更多的功能,這些功能是否能讓我們的 CI/CD 更靈活。比如 Node、Pod 的親和性設置,部署容器啟動先后順序設置等。
2) 提供 ChatOps 功能,通過集成提供 API 的聊天工具。
3) 與更多的 DevOps 工具集成,包括 GitInspector 等。
4) 對開源工具的優化,以及對開源社區的貢獻。比如 TestLink 等還有很多缺陷,集成時會遇到需要解決的問題等。
5) 持續增強 DevOps 前期項目管理、產品管理的功能模塊,例如立項管理、路線圖、需求管理、版本管理、發布物、產品運營、里程碑、迭代計划、測試管理等功能方向,有助於奠定項目/產品的基石。
6) 持續增強 DevOps 后期度量與優化功能模塊,例如質量、效率、進度、APM、問題庫、自愈等功能方向,幫助項目/產品后期更好的運營。