1. 程式人生 > >Kubernetes如何加速UCloud內部程式碼部署的CI/CD流程

Kubernetes如何加速UCloud內部程式碼部署的CI/CD流程

UCloud內部長期使用 Gitlab 來管理程式碼。雖然Gitlab作為一套開源平臺已很優秀,但我們對於其能為CI/CD提供的敏捷性並不十分滿意,內部實踐中的程式碼釋出週期仍需按天計算。為此,我們打造了一個基於Kubernetes的內部容器服務平臺(名為KUN),用於託管內部服務,並將Gitlab對接到KUN平臺,從而藉助Kubernetes的雲原生優勢,獲得更好的CI/CD效果。這套系統執行一年內,Gitlab的Pipeline一共觸發了994次,執行了約20000+次Job,在測試環境和正式環境一共進行了7000+次部署,即每天部署約20次。以下是該專案的一些實踐經驗。

我們對CI/CD的目標

CI即Continuous Integration(持續整合),指程式碼整合到主幹之前必須通過自動化測試,只要有一個測試用例失敗,就不能整合。目的是讓產品快速迭代的同時還能保持高質量。

CD有兩種意思:

Continuous Delivery,持續交付,指的是任何的修改都經過驗證,可以隨時實施部署到生產環境。 Continuous Deployment,持續部署,是持續交付的更高階段,指的是任何修改後的內容都經過驗證,自動化的部署到生產環境。 兩者的區別,在於是否自動部署到生產環境。對UCloud而言,肯定要以後者,也就是持續部署為目標。

Gitlab分支管理

我們採用的Gitlab分支管理模型在接入KUN平臺前後並未發生變化,故簡述如下:

master:主分支,程式碼經過驗證。從 master 建立 tag 進行 Release。 dev:研發主分支,用於合入特性分支和補丁分支,在此分支。

臨時分支: 特性分支:用於開發某個特性; 補丁分支:用於修復線上 bug。 下面以一個例項來介紹CI/CD開發流程。StepFlow是UCloud新近推出的一款視覺化工作流產品,通過StepFlow使用者可以靈活便捷地定義自己的工作流,快速實現業務功能。整套StepFlow系統由多個模組組成,並全部部署在Kubernetes叢集上。

在例項中,我們需要開發其中名為optimize-allocate 的一個feature:

則開發流程為:

  1. 首先,在 Gitlab 上建立了編號為80的Issue,跟進這個optimize-allocate的feature;

  2. 從dev分支建立一個新分支,名為feature/80-optimize-allocate,在該分支上進行開發;

  3. 在feature/80-optimize-allocate上開發完成,進行commit,此時會觸發靜態測試、單元測試、Review等Pipeline Job;

  4. 測試通過後,建立一個從feature/80-optimize-allocate到dev的merge request,由負責人進行稽核。稽核通過並且merge成功後,觸發靜態測試、單元測試、映象構建、映象部署、整合測試等Pipeline Job;

  5. 測試通過後,建立一個從dev到master的mergerequest,由負責人進行稽核。稽核通過並且merge成功後,負責人建立tag v1.1.1,然後觸發靜態測試、單元測試、映象構建、映象部署、整合測試等Pipeline Job;

注:版本號tag是有命令規範的,v{x}.{y}.{z}代表著v{主版本}.{次版本}.{小修訂版本}

Gitlab CI/CD Pipeline

Gitlab 8.0版本以後,預設整合並開啟了Gitlab-CI,是可以提供一定CI能力的,我們以此搭建持續整合的流水線,其中有Pipeline、Stage和Job三個層級需要設計。

Pipeline

Gitlab 會檢測一個專案的根目錄下的 .Gitlab-CI.yml 檔案,使用者可在該檔案中定義 CI/CD Pipeline,一個 Pipeline 代表了 CI/CD 的整個過程。程式碼發生變化時(比如 push、tag、merge等),將觸發一個 Pipeline 的執行。

Stage

一個 Pipeline 包含多個 Stage,比如“靜態檢查”、“單元測試”、“構建映象”等等,這些 Stage 一個接一個順序執行。

Job

每一個 Stage 可以包含多個 Job,同一個 Stage 的所有 Job 同時執行。每個Job需指定若干個重要屬性如image, stage, tags, service等。

在StepFlow例子中,針對要開發的feature,其Pipeline設計如下,包括靜態檢查、單元測試和最後的兩個手動 Code Review:

當其需要釋出到公共測試環境(類似預釋出環境),則設計另一個Pipeline,包括:執行完整的靜態檢查, 單元測試, 預釋出映象 build, 預釋出部署, 預釋出整合測試。

而合併 master 之後觸發 prod 環境的另一個 Pipeline,包括靜態檢查、生產環境映象的 build、生產環節的部署、最後整合測試:

Gitlab Runner

我們將Gitlab Runner和Gitlab-CI配合使用,負責具體 Job 的執行。Gitlab Runner Kubernetes Executor 提供了在 Kubernetes 中執行 Job 的能力。執行原理如下:

Gitlab Runner 需要事先部署並註冊到 Gitlab 上; 當代碼發生更新時,Gitlab 根據使用者的配置,通知 runner 來執行 Job; Gitlab Runner 使用某個映象來建立一個 Pod,然後在其中執行某些命令; Gitlab Runner 將整個執行過程以及執行結果告訴 Gitlab。

Kaniko整合和改造:在容器中構建Docker映象

為了使用 CI/CD 將程式碼變成最終執行在 Kubernetes 中的服務,必不可少的一步就是容器映象的構建。由於CI Job本身就是以容器的形式執行的,所以需要在容器中構建出 Docker 映象。

已有的方法,包括把 Host 上的 Docker Socket 掛載到 Pod 裡面去(Docker Socket Mounting),或者是在 Pod 再啟動一個 Docker Daemon(Docker-in-Docker),然而,前者有安全風險,後者需要 Pod 具備特權,兩種方法都不適合。

Kaniko(https://github.com/GoogleContainerTools/kaniko)是 Google開源的一個工具,可以實現在 docker 容器裡面製作 docker 映象,並且不需要任何特權。

但是原生的 Kaniko 映象由於缺少一些必要的工具,無法和Gitlab CI整合。為此我們修改了Kaniko映象,添加了整個busybox工具包進去,以支援其作為一個CI Job來執行。然後就可以把Gitlab往內部容器服務平臺KUN對接了。程式碼示例如下:

use Docker:$ cd /path/to/project && \ docker build -t uhub.service.ucloud.cn/myimage:0.0.1 -f deploy/Dockerfile && \ docker push uhub.service.ucloud.cn/myimage:0.0.1# use Kaniko:$ /kaniko/executor -c /path/to/project -f deploy/Dockerfile -d uhub.service.ucloud.cn/myimage:0.0.1

KUN+Gitlab:基於Kubernetes的CI/CD流程

KUN中CI/CD的整個流程如上圖所示。從圖中我們可以看到,CI部分是一個單元測試,預釋出部署,整合測試,Debug,提交程式碼的迴圈過程。在CI過程中預釋出的部署是通過CD系統來實現的,CI其中一個步驟是生成部署檔案,然後按照專案、資源集、版本等引數提交到CD後端系統。CD系統提供了頁面入口,當部署檔案推送到CD系統後,使用者可以在頁面查詢對應的部署檔案。如果需要部署,在頁面點選“部署”按鈕即可實現部署。

YAML編輯器

為方便使用者使用,我們為KUN開發了專門的YAML編輯器,相比用普通的文字編輯器寫YAML,可以提供智慧模板補全、搜尋替換等能力。

上圖展示了一個使用案例,目前頁面編輯器支援的功能有:

Snippet:模版補全,使用者編輯文件時,會提示相關模版,可選擇直接模版輸入

Hover:使用者滑鼠放置關鍵字,提示關鍵字含義和官方文件連結

搜尋替換:使用⌘+F/Ctrl+F開啟頁面搜尋支援頁面直接查詢

部署系統

為了在Gitlab CI Job中把服務部署到Kubernetes上,我們研發了部署系統。在CI Pipeline的最後一步,使用者生成一個YAML檔案,定義需要部署到Kubernetes上的資源,然後使用部署系統提供的一個工具映象,該映象會呼叫部署系統的API,將YAML提交給部署系統。接下來部署系統將使用使用者的許可權,呼叫Kubernetes API實現真正的部署。

目前部署系統主要包含兩部分功能:

1. 資源集管理:

資源集是使用者專案下一個或多個資源的集合,資源指 Kubernetes 的 object 的描述檔案,一般為 YAML 檔案; 資源集分為多個版本,不同的版本對應資源的不同的描述檔案; 使用者可以選擇某個版本,然後指定叢集執行部署。

2. 部署任務

使用者每次部署都會生成一個 job,就是部署任務 執行部署後,使用者可在任務詳情頁直接檢視部署任務日誌。

當完成上述所有工作,Gitlab能很好嵌入KUN平臺,執行在Kubernetes上的各模組就可像齒輪一樣有序運轉,從而獲得CI/CD上的良好效果。

前面提到的StepFlow專案,從一開始就實施了這樣一套 CI/CD,效率獲得了很大提升,每個編譯Job耗時約3分鐘,其他Job耗時在1分鐘以內。

總結

CI/CD是提供高質量網際網路服務必不可少的一環。Gitlab和Kubernetes都是非常優秀的開源軟體,在此基礎上,我們根據自己的實際情況,結合兩者打造了一套高效的CI/CD平臺,努力提升研發效率,為使用者提供更優質的服務。

相關推薦

Kubernetes如何加速UCloud內部程式碼部署CI/CD流程

UCloud內部長期使用 Gitlab 來管理程式碼。雖然Gitlab作為一套開源平臺已很優秀,但我們對於其能為CI/CD提供的敏

基於 Docker、Kubernetes 實現高效可靠的規模化 CI/CD 流水線的搭建

本文來自作者 邸富傑 在 GitChat 上分享,「閱讀原文」檢視交流實錄 「文末高能」 編輯 | 庫克 高效可靠的 CI/CD 流水線是一個IT組織實現軟體服務快速交付的基礎,現如今大量

PHP應用的CI/CD流程實踐與學習:一、PHP運行環境的準備

代碼結構 php7.1 運行環境 php應用 nginx 數據卷 選擇 class tar 前言:一直以來想學習與實踐一下敏捷開發,之前項目雖說口口聲聲我們項目是敏捷開發,其實很扯。 敏捷開發如果有持續集成、持續部署的支持,那樣開發、測試、運維將節省不少精力。 此系列博

Wercker 基於DOCKER的CI/CD部署Kubernetes和Microservice的自動化平臺,被ORACLE收購,

Oracle已經確認收購荷蘭的開發者支援企業Wercker公司,用以加強Oracle在容器管理業務方面的能力。這家位於荷蘭阿姆斯特丹的企業日常專門為開發人員提供Docker以及Kubernetes的管理工具,從而幫助開發者們快速建立和管理其容器用於程式碼測試等工作。  

KubeSphere CI/CD+GitLab+Harbor將Spring Boot專案部署Kubernetes

上一篇文章分享瞭如何在 KubeSphere 對公共的程式碼倉庫 GitHub 和映象倉庫 DockerHub 建立流水線,本文將

Jenkins CI/CD on Kubernetes with dynamic slaves

number lock tmp ply server 單擊 admin 動態 crmsh 本文檔介紹如何通過在 Kubernetes 集群上創建並配置 Jenkins Server 實現應用開發管理的 CI/CD 流程,並且利用 Kubernetes-Jenkins-Plu

Jenkins與Docker/Kubernetes的自動化CI/CD流水線實踐--免費直播課等你來約

發布 cto java項目 註意 ofo 互聯網 雲平臺 等你 新版本 直播老師簡介: 李振良·奇虎360-高級運維工程師,主要負責360瀏覽器業務運維。7年互聯網運維工作經驗,具備豐富的運維實戰經驗,曾主導容器雲平臺建設並將業務容器化部署 老師博客專欄地址:基於Kuber

centos7下使用gitlab+shell實現CI/CD持續集成持續部署

argument shel tro 項目 rman lob b+ pull 部署過程                   centos7下使用gitlab+shell實現CI/CD持續集成持續部署 流程解釋:第一步ci客戶端向gitlab服務器註冊自己,建立通信,

基於KubernetesCI/CD&Pipeline流水線解決方案

oss 工作流程 51cto 好處 一個 nfs 服務器 嘗試 操作 out Pipeline 介紹 要實現在 Jenkins 中的構建工作,可以有多種方式,我們這裏采用比較常用的 Pipeline 這種方式。Pipeline,簡單來說,就是一套運行在 Jenkins 上的

『中級篇』CI/CD持續集成/持續部署(69)

zhong 鏈接地址 語言 view tlab 謝謝 itl 部署 成都 >原創文章,歡迎轉載。轉載請註明:轉載自IT人故事會,謝謝!>原文鏈接地址:『中級篇』CI/CD持續集成/持續部署(69) 從這次課就開始學習CI/CD,結合docker或者是使用k8s來

基於drone的CI/CD對接kubernetes,靈活與自由

labels ase nta data Kubernete sqlite mode method cal kubernetes集群三步安裝 CI 概述 用一個可描述的配置定義整個工作流 程序員是很懶的動物,所以想各種辦法解決重復勞動的問題,如果你的工作流中還在重復一些事,那

前端專案基於GitLab-CI的持續整合/持續部署CI/CD

什麼是持續整合/持續部署(CI/CD)? 個人理解,說白了就是把程式碼測試、打包、釋出等工作交給一些工具來自動完成。這樣可以提高效率,減少失誤,開發人員只需要關心開發和提交程式碼到git就可以了。 怎麼做? 方式一: 使用web hooks,這種方式的原理就是在gitlab專案的Setting-

gitlab中CI/CD自動化部署使用

1. 安裝GitLab Runner 下載 sudo curl --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/bi

基於drone的CI/CD,對接kubernetes實踐教程_Kubernetes中文社群

CI 概述 用一個可描述的配置定義整個工作流 程式設計師是很懶的動物,所以想各種辦法解決重複勞動的問題,如果你的工作流中還在重複一些事,那麼可能就得想想如何優化了 持續整合就是可以幫助我們解決重複的程式碼構建,自動化測試,釋出等重複勞動,通過簡單一個提交程式碼的動作,解決接下來要做的很多事。

CI/CD持續整合/持續部署 敏捷開發

敏捷軟體開發(英語:Agile software development),又稱敏捷開發,是一種從1990年代開始逐漸引起廣泛關注的一些新型軟體開發方法,是一種應對快速變化的需求的一種軟體開發能力。它們的具體名稱、理念、過程、術語都不盡相同,相對於“非敏捷”,更強調程式設計

GitLab持續整合持續部署CI&CD

GitLab CI/CD介紹 首先使用一張圖說明GitLab CI的工作流程: GitLab CI是 GitLab 提供的持續整合服務,只要在你的倉庫根目錄 建立一個.gitlab-ci.yml 檔案, 併為該專案指派一個Runner,當有合併請求

CI / CD 持續整合和部署 相關概念

文章目錄 什麼是CI / CD?其意義何在? CI/CD持續整合/持續部署定義 持續整合 持續部署 補:持續交付 與DevOps的關係 與持續部署的關

持續整合、持續交付、持續部署CI/CD)簡介

概述: 軟體開發週期中需要一些可以幫助開發者提升速度的自動化工具。其中工具最重要的目的是促進軟體專案的持續整合與交付。通過CI/CD工具,開發團隊可以保持軟體更新並將其迅速的投入實踐中。CI/CD也被認為是敏捷開發的最重要實踐之一。 一

基於Jenkins與Docker的CI/CD實戰部署

    本實踐介紹了利用Jenkins和docker技術,如何實現CI/CD的各環節的步驟,包括環境準備,程式碼提交,編譯程式,構建映象,部署,測試,一套完整的安裝部署流程。 一、應用場景問題        一個產品專案,開發測試所需要處理的事情大概有:申請測試機器、編碼

Gitlab CI&CD 在前端專案自動化構建部署中的實踐

引言 現在大部分的公司都搭建了自己的Gitlab,除了Git的程式碼管理能力,Gitlab的CI&CD在專案的持續整合和部署上也盡力提高大家的工作效率。下面用我們專案的例子為大家引薦一下這套工具帶來的便利。 Gitlab CI&CD是什麼 如上