親測(cè)報(bào)告|騰訊云發(fā)布了一款云原生研發(fā)管理工具
6月28日,騰訊在線上舉行了 TechoDay 技術(shù)開放日,這次活動(dòng)主題是“化繁為簡(jiǎn),輕而易用”,主要發(fā)布一些輕量級(jí)的云開發(fā)與云應(yīng)用。在這次最重磅的7款發(fā)布產(chǎn)品中,我比較感興趣的是 Orbit 平臺(tái),這是一款云原生全生命周期管理工具?;顒?dòng)上,嘉賓介紹這個(gè)產(chǎn)品比起“傳統(tǒng)集成、持續(xù)部署”有極其高效的先進(jìn)性。
真金不怕火煉,說得這么好,我決定上手試試……
創(chuàng)建項(xiàng)目
進(jìn)入 CODING DevOps 主頁面,首先創(chuàng)建一個(gè)項(xiàng)目。

平臺(tái)提供了兩種模板可供選擇:
全功能 DevOps 項(xiàng)目:開啟一個(gè)全功能的 CODING 項(xiàng)目,包含代碼托管、項(xiàng)目協(xié)同、持續(xù)集成、制品管理、持續(xù)部署、測(cè)試管理、知識(shí)管理在內(nèi)的全部能力,促進(jìn)研發(fā)團(tuán)隊(duì)的 DevOps 成熟度提升。 按需選擇:可以按團(tuán)隊(duì)當(dāng)前實(shí)際所需開啟所需功能。

模板選擇后填寫項(xiàng)目基本信息:

項(xiàng)目創(chuàng)建完成后接下來就需要?jiǎng)?chuàng)建一個(gè)代碼倉(cāng)庫(kù)了,前往代碼倉(cāng)庫(kù)頁面點(diǎn)擊創(chuàng)建代碼倉(cāng)庫(kù)進(jìn)行新建:

同樣我們也可以根據(jù)模板來創(chuàng)建代碼倉(cāng)庫(kù),還有分支模型可供選擇,比如我們這里是一個(gè)簡(jiǎn)單的 Go 項(xiàng)目,代碼非常簡(jiǎn)單。

代碼倉(cāng)庫(kù)創(chuàng)建完成后將代碼提交上去。

接下來我們要做的就是通過 DevOps 的方式將該項(xiàng)目部署到 Kubernetes 中去。
代碼掃描
可以在創(chuàng)建代碼倉(cāng)庫(kù)的時(shí)候開啟代碼掃描功能,當(dāng)創(chuàng)建合并請(qǐng)求或推送代碼的時(shí)候都會(huì)觸發(fā)代碼掃描功能,如果沒有默認(rèn)開啟,我們可以前往代碼掃描 -> 掃描任務(wù)頁面創(chuàng)建一個(gè)新的任務(wù)。

創(chuàng)建掃描任務(wù)的時(shí)候需要去關(guān)聯(lián)對(duì)應(yīng)的代碼倉(cāng)庫(kù)和分支,然后可以通過系統(tǒng)提供的掃描模板進(jìn)行掃描,比如我們這里可以選擇 Go 推薦掃描方案模板,然后直接啟動(dòng)掃描任務(wù)即可。

然后就會(huì)針對(duì)當(dāng)前項(xiàng)目代碼進(jìn)行掃描了,同樣也可以配置代碼掃描方案,我們可以根據(jù)自己的需求配置合適的規(guī)則。
制品庫(kù)
我們這是一個(gè) Golang 項(xiàng)目,可以將項(xiàng)目構(gòu)建的二進(jìn)制文件上傳到制品庫(kù)中去,我們這里要將項(xiàng)目部署到 Kubernetes 集群中去,自然是打包成 Docker 鏡像是最合適的,在制品管理下面新建一個(gè) Docker 類型的倉(cāng)庫(kù)。

如果你有其他制品需求也可以去創(chuàng)建對(duì)應(yīng)的倉(cāng)庫(kù),比如 Maven、NPM、Helm Chart 等等。
CI流水線
接下來需要將我們的項(xiàng)目進(jìn)行構(gòu)建打包成 Docker 鏡像,推送到 Docker 倉(cāng)庫(kù)中去,然后部署到 Kubernetes 集群中去,這是一個(gè)非常簡(jiǎn)單的流水線。
首先來看下 CI 流水線如何實(shí)現(xiàn),如果你使用的傳統(tǒng)構(gòu)建工具,比如 Jenkins、GitLab CI 等等,都需要我們?nèi)ゾ帉懘罅康牧魉€腳本,而 CODING DevOps 為我們內(nèi)置了大量的模板,以及功能非常強(qiáng)大的可視化編輯功能,可以大大提高流水線的編寫效率。
前往持續(xù)集成 -> 構(gòu)建計(jì)劃頁面,創(chuàng)建一個(gè)新的構(gòu)建計(jì)劃,構(gòu)建計(jì)劃是持續(xù)集成的基本單元,在這里你可以快速創(chuàng)建一個(gè)構(gòu)建計(jì)劃。

CODING DevOps 為我們內(nèi)置了大量通用的計(jì)劃模板,比如我們這里選擇 GoLang + Gin + Docker 的這個(gè)計(jì)劃模板。

在這個(gè)模板中可以直接關(guān)聯(lián)對(duì)應(yīng)的代碼倉(cāng)庫(kù),安裝依賴、單元測(cè)試這些步驟也是可選的,核心的構(gòu)建 Docker 鏡像步驟中,我們可以指定鏡像名稱、Dockerfile 文件位置、構(gòu)建目錄以及鏡像版本等等,最后關(guān)聯(lián)上一個(gè) Docker 制品庫(kù),這樣當(dāng)鏡像構(gòu)建完成后就可以推送到這個(gè)倉(cāng)庫(kù)中去了,這其實(shí)就是一個(gè)完全兼容的 Jenkinsfile 文件,對(duì)應(yīng)的代碼如下所示:
pipeline {
agent any
environment {
CODING_DOCKER_REG_HOST = "${CCI_CURRENT_TEAM}-docker.pkg.${CCI_CURRENT_DOMAIN}"
CODING_DOCKER_IMAGE_NAME = "${PROJECT_NAME.toLowerCase()}/${DOCKER_REPO_NAME}/${DOCKER_IMAGE_NAME}"
}
stages {
stage("檢出") {
steps {
checkout(
[$class: 'GitSCM',
branches: [[name: GIT_BUILD_REF]],
userRemoteConfigs: [[
url: GIT_REPO_URL,
credentialsId: CREDENTIALS_ID
]]]
)
}
}
stage('安裝依賴') {
steps {
sh "go get -u github.com/jstemmer/go-junit-report"
}
}
stage('單元測(cè)試') {
steps {
sh "go test -v | go-junit-report > result.xml"
}
post {
always {
// 收集測(cè)試報(bào)告
junit '*.xml'
}
}
}
stage('編譯') {
steps {
sh "go build -o golang-web-app ."
}
}
stage('構(gòu)建鏡像并推送到 CODING Docker 制品庫(kù)') {
steps {
sh "docker build -t ${CODING_DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_VERSION} -f ${DOCKERFILE_PATH} ${DOCKER_BUILD_CONTEXT}"
useCustomStepPlugin(
key: 'SYSTEM:artifact_docker_push',
version: 'latest',
params: [
image:"${CODING_DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_VERSION}",
repo:"${DOCKER_REPO_NAME}"
]
)
}
}
}
}構(gòu)建計(jì)劃創(chuàng)建后就會(huì)開始按照上面的步驟進(jìn)行構(gòu)建了,整個(gè)構(gòu)建過程都可以通過一個(gè)可視化的界面進(jìn)行查看。

點(diǎn)擊每一個(gè)步驟均可查看對(duì)應(yīng)的日志信息。

我們這里還添加了一個(gè)測(cè)試的階段,同樣也可以看到對(duì)應(yīng)的 Junit 測(cè)試報(bào)告。

此外我們還可以對(duì)該構(gòu)建計(jì)劃進(jìn)行重新配置,可以指定 Jenkinsfile 的來源,默認(rèn)情況下會(huì)使用 CODING 提供的云主機(jī)進(jìn)行構(gòu)建,但是每個(gè)團(tuán)隊(duì)會(huì)有免費(fèi)的配額,如果額度不夠你還可以選擇使用自定義的構(gòu)建節(jié)點(diǎn)進(jìn)行構(gòu)建。

核心的流程配置頁面中允許我們通過圖形化編輯器和文本編輯器兩種方式來修改 Jenkinsfile。

比如我們這里可以新增一個(gè)部署到Kubernetes集群的階段,執(zhí)行在編輯器中點(diǎn)擊+增加階段即可,然后點(diǎn)擊階段中的+按鈕可以來選擇要在該階段添加的功能。

CD流水線
除了在構(gòu)建流水線里面去執(zhí)行部署之外,我們也可以在持續(xù)部署 -> Kubernetes 頁面進(jìn)行部署。

CODING 基于持續(xù)交付基金會(huì)旗下開源軟件 Spinnaker 提供了完整的,與 DevOps 體系緊密結(jié)合的持續(xù)部署能力,僅需簡(jiǎn)單幾步,即可快速實(shí)現(xiàn)基于 Kubernetes 的持續(xù)部署,比如我們選擇體驗(yàn)快速發(fā)布。
當(dāng)然首先需要一個(gè) Kubernetes 集群,比如我這里去關(guān)聯(lián)我的 TKE 集群。

Kubernetes 集群關(guān)聯(lián)后在快速發(fā)布配置中我們選擇使用現(xiàn)有集群。

然后選擇需要部署的鏡像即可。

然后配置應(yīng)用部署的元信息,比如應(yīng)用名稱,是否通過 Service 暴露服務(wù),端口映射等信息。

發(fā)布后可以查看發(fā)布的詳細(xì)信息。

在集群中可以看到資源的詳細(xì)信息。

比如我們這里可以通過 120.53.207.92:8080 端口就可以訪問到我們的應(yīng)用了。

到這里就證明我們的應(yīng)用部署成功了,在 TKE 集群中也可以看到我們部署的應(yīng)用了。

到這里我們就完成了使用 CODING DevOps 來實(shí)現(xiàn)一站式的 DevOps 應(yīng)用了,相比起傳統(tǒng)的工具,CODING DevOps 提供了以更加方便便捷的方式,化繁為簡(jiǎn),不需要我們具有太深?yuàn)W的知識(shí)點(diǎn)也能玩轉(zhuǎn)。
Orbit
基于 CODING 團(tuán)隊(duì)幫助客戶進(jìn)行應(yīng)用云原生化的實(shí)際經(jīng)驗(yàn),CODING 持續(xù)部署產(chǎn)品全新升級(jí),推出一站式云原生應(yīng)用生命周期管理工具——應(yīng)用中心(Orbit),為企業(yè)提供降低應(yīng)用云原生化門檻、提高應(yīng)用交付效率和可靠性、高效自助式運(yùn)維三重價(jià)值。

接入集群
基礎(chǔ)設(shè)施是集群與數(shù)據(jù)庫(kù)的調(diào)度中心,為應(yīng)用的最終發(fā)布上線提前做準(zhǔn)備。點(diǎn)擊團(tuán)隊(duì)首頁左下角的「基礎(chǔ)設(shè)施」進(jìn)入管理頁。

點(diǎn)擊添加集群獲取安裝 CD 客戶端的命令,在 Kubernetes 集群下運(yùn)行該命令,安裝 CD 客戶端后完成集群接入。將集群納入基礎(chǔ)設(shè)施后,能夠與各項(xiàng)運(yùn)維工具進(jìn)行數(shù)據(jù)聯(lián)動(dòng)與上報(bào),在弱網(wǎng)絡(luò)環(huán)境及私有云場(chǎng)景下對(duì)集群納管的支持更加友好。

安裝后會(huì)創(chuàng)建一個(gè)名為 coding-cd 的命名空間,其中包含幾個(gè) Pod:
$ kubectl get pods -n coding-cd
NAMESPACE NAME READY STATUS RESTARTS AGE
coding-cd customer-dashboard-manager-656fd8f56-m2cks 1/1 Running 0 92s
coding-cd dashboard-controller-6648dc75f7-tmhsf 1/1 Running 0 2m27s
coding-cd deploy-controller-manager-56bb5ddc69-d5cjf 2/2 Running 0 2m27s
coding-cd diff-controller-manager-5d5d54dd9c-96pwx 2/2 Running 0 2m27s
coding-cd gitops-connector-68bb978cb7-hljfx 1/1 Running 0 2m27s
coding-cd source-controller-manager-75cf797dcf-dglnc 2/2 Running 0 2m27s
部署倉(cāng)庫(kù)
使用 Orbit 來做應(yīng)用部署,我們這里采用代碼和部署倉(cāng)庫(kù)分離的方式,使用 Helm Chart 方式來進(jìn)行部署,單獨(dú)創(chuàng)建一個(gè)用于存放 Helm Chart 包的倉(cāng)庫(kù) cd-golang-gin-example。

創(chuàng)建應(yīng)用
進(jìn)入應(yīng)用中心后,點(diǎn)擊右上角的「創(chuàng)建應(yīng)用」按鈕,在基本信息中填寫倉(cāng)庫(kù)的所在項(xiàng)目與地址就可以創(chuàng)建一個(gè)應(yīng)用了。

創(chuàng)建應(yīng)用后,需要將已接入的集群指定為應(yīng)用的運(yùn)行環(huán)境,基于集群的使用目的不同,例如用作生產(chǎn)/測(cè)試環(huán)境,可以在環(huán)境 Values 處進(jìn)行切換。

環(huán)境創(chuàng)建完成后,應(yīng)用中心將自動(dòng)讀取集群信息。除此之外,應(yīng)用中心還具備集群監(jiān)控與日志查看能力。
部署流程
部署流程中的階段決定了應(yīng)用在發(fā)布過程時(shí)歷經(jīng)的各項(xiàng)環(huán)節(jié)。這些階段包含了應(yīng)用部署、預(yù)置條件檢查、人工確認(rèn)等。建議為每個(gè)部署流程添加人工確認(rèn)階段,用以二次確認(rèn)部署的有效性。

這里我們來使用人工確認(rèn) + 應(yīng)用部署階段組成此次應(yīng)用發(fā)布的部署流程,進(jìn)入部署流程頁面創(chuàng)建一個(gè)新的部署流程。

發(fā)布版本
版本管理機(jī)制能夠自動(dòng)將應(yīng)用的鏡像、配置、數(shù)據(jù)庫(kù)變更集中展示于版本的創(chuàng)建頁面。你可以根據(jù)項(xiàng)目協(xié)同中的迭代內(nèi)容,選擇應(yīng)用變更范圍并進(jìn)行版本創(chuàng)建。同時(shí)版本還支持關(guān)聯(lián)事項(xiàng)、需求、缺陷,便于用戶追溯應(yīng)用變更的業(yè)務(wù)側(cè)需求來源。

創(chuàng)建版本后,可以點(diǎn)擊發(fā)布按鈕進(jìn)行版本發(fā)布。

然后填寫發(fā)布單與選擇部署流程即可完成發(fā)布。

然后就會(huì)根據(jù)我們上面創(chuàng)建的部署流程去部署應(yīng)用,首先會(huì)有一個(gè)人工確認(rèn),確認(rèn)后就會(huì)進(jìn)行部署了。

部署完成后可以查看當(dāng)前環(huán)境的整體狀況,可以查看到已部署的服務(wù)。

此外還可以對(duì)接集群的 Prometheus 來進(jìn)行監(jiān)控報(bào)警,以及日志數(shù)據(jù)等等。
測(cè)試環(huán)境部署后的資源對(duì)象如下所示:
$ kubectl get all -n orbit-testing
NAME READY STATUS RESTARTS AGE
pod/gin-demo-95746586-k6ttj 1/1 Running 0 10m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/gin-demo NodePort 10.96.35.118 <none> 80:31901/TCP 10m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/gin-demo 1/1 1 1 10m
NAME DESIRED CURRENT READY AGE
replicaset.apps/gin-demo-95746586 1 1 1 10m
現(xiàn)在我們可以去驗(yàn)證應(yīng)用是否正確了。

完整的應(yīng)用狀況如下所示。

除了我們這里為大家演示的 Orbit 的基本功能之外,還有很多更加高級(jí)的用法,比如可以實(shí)現(xiàn)金絲雀部署、還有許多運(yùn)維插件等。

總結(jié)
整體流程如下圖所示。

我們這里用兩種方式來實(shí)現(xiàn)應(yīng)用的發(fā)布流程,很明顯 Orbit 這種方式比傳統(tǒng)的應(yīng)用發(fā)布優(yōu)勢(shì)更加明顯,通過自動(dòng)化能力和應(yīng)用管理的能力,開發(fā)人員可以自行做到應(yīng)用的發(fā)布、運(yùn)維、觀測(cè),大大降低了開發(fā)與運(yùn)維間的溝通成本,讓發(fā)布真正做到高效、有序。
本次 TechoDay 騰訊技術(shù)開放日主要是從技術(shù)原理解析來講述輕量化的實(shí)現(xiàn)路徑跟價(jià)值,這里面包括很多平日開發(fā)經(jīng)常用到的課題,除了 DevOps,也有微服務(wù)開發(fā)或 Serverless 相關(guān)的內(nèi)容。會(huì)后,騰訊還將這些內(nèi)容整理成《騰訊云輕量級(jí)工具指南》,對(duì)云原生趨勢(shì)感興趣的朋友不容錯(cuò)過,點(diǎn)擊閱讀全文可以獲取。

