自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

通過(guò)Jenkins構(gòu)建CI/CD實(shí)現(xiàn)全鏈路灰度

開發(fā) 架構(gòu)
在微服務(wù)治理架構(gòu)中,全鏈路灰度功能能提供虛擬泳道,極大的方便了測(cè)試、發(fā)布時(shí)的快速驗(yàn)證,能夠幫助 DevOPs 提升線上穩(wěn)定性。

作者 | 卜比

本文介紹通過(guò) Jenkins 構(gòu)建流水線的方式實(shí)現(xiàn)全鏈路灰度功能。

在發(fā)布過(guò)程中,為了整體穩(wěn)定性,我們總是希望能夠用小部分特定流量來(lái)驗(yàn)證下新發(fā)布應(yīng)用是否正常。即使新版本有問題,也能及時(shí)發(fā)現(xiàn),控制影響面,保障了整體的穩(wěn)定性。

1.整體架構(gòu)

我們以如下 Demo 為例:

圖片

為了保證穩(wěn)定,我們約定如下上線流程:圖片

其中,在灰度驗(yàn)證中,有幾種不同的策略:

  • 直接使用線上小部分流量來(lái)測(cè)試(按照百分比放量)
  • 從線上按照特定規(guī)則選擇流量(比如特定的 header、特定的 cookie 等)
  • 在客戶端或?yàn)g覽器上標(biāo)識(shí)出流量是否灰度(比如通過(guò) header 傳遞)

2.部署應(yīng)用&創(chuàng)建泳道

按照參考文檔部署應(yīng)用后,我們首先要區(qū)分線上流量和灰度流量。創(chuàng)建泳道組,將整個(gè)鏈路涉及到的應(yīng)用全選:

圖片

然后創(chuàng)建泳道組,將符合規(guī)則的應(yīng)用劃入 gray 泳道:

圖片

注:沒有匹配的流量,會(huì)走到基線環(huán)境,也就是沒有打標(biāo)的應(yīng)用節(jié)點(diǎn)上。

配置完成后,訪問網(wǎng)關(guān),如果不符合灰度規(guī)則,走基線環(huán)境:

圖片

如何符合灰度規(guī)則,走灰度環(huán)境:

圖片

3.配置 Jenkins 流水線

本文實(shí)踐需要將源碼打包后執(zhí)行鏡像推送,請(qǐng)確保 Jenkins 有權(quán)限推送到鏡像倉(cāng)庫(kù)中。具體操作,請(qǐng)參見使用 kaniko 構(gòu)建和推送容器鏡像。

在 Jenkins 命名空間下使用生成的 config.json 文件創(chuàng)建名為 jenkins-docker-cfg 的 Secret。

kubectl create secret generic jenkins-docker-cfg -n jenkins --from-file=/root/.docker/config.json

(1)在 Jenkins 中創(chuàng)建全鏈路灰度發(fā)布流水線

基于 Jenkins 實(shí)現(xiàn)自動(dòng)化發(fā)布的流水線,通過(guò)該流水線可以使應(yīng)用發(fā)布具備可灰度、可觀測(cè)、可回滾的安全生產(chǎn)三板斧能力。

  • 在 Jenkins 控制臺(tái)左側(cè)導(dǎo)航欄單擊新建任務(wù)。
  • 輸入任務(wù)名稱,選擇流水線,然后單擊確定。
  • 在頂部菜單欄單擊流水線頁(yè)簽,在流水線區(qū)域配置相關(guān)參數(shù)選擇,輸入腳本路徑,然后單擊保存。

圖片

定義:選擇 Pipeline script from SCM。

SCM:選擇 Git。

Repository URL:輸入 Git 倉(cāng)庫(kù)的 URL。

腳本路徑:輸入 Jenkinsfile。

您可以參考以下的文件填寫好指定的參數(shù),當(dāng)然您也可以根據(jù)需求編寫 Jenkinsfile ,并上傳至 Git 的指定路徑下(流水線中指定的腳本路徑)。

#!groovy
pipeline {
// 定義本次構(gòu)建使用哪個(gè)標(biāo)簽的構(gòu)建環(huán)境,本示例中為 “slave-pipeline”
agent{
node{
label 'slave-pipeline'
}
}
//常量參數(shù),初始確定后一般不需更改
environment{
IMAGE = sh(returnStdout: true,script: 'echo registry.$image_region.aliyuncs.com/$image_namespace/$image_reponame:$image_tag').trim()
BRANCH = sh(returnStdout: true,script: 'echo $branch').trim()
}
options {
//保持構(gòu)建的最大個(gè)數(shù)
buildDiscarder(logRotator(numToKeepStr: '10'))
}
parameters {
string(name: 'image_region', defaultValue: 'cn-shanghai')
string(name: 'image_namespace', defaultValue: 'yizhan')
string(name: 'image_reponame', defaultValue: 'spring-cloud-a')
string(name: 'image_tag', defaultValue: 'gray')
string(name: 'branch', defaultValue: 'master')
string(name: 'number_of_pods', defaultValue: '2')
}
//pipeline的各個(gè)階段場(chǎng)景
stages {
stage('代碼打包') {
steps{
container("maven") {
echo "鏡像構(gòu)建......"
sh "cd A && mvn clean package"
}
}
}
stage('鏡像構(gòu)建及發(fā)布'){
steps{
container("kaniko") {
sh "kaniko -f `pwd`/A/Dockerfile -c `pwd`/A --destination=${IMAGE} --skip-tls-verify"
}
}
}
stage('灰度部署') {
steps{
container('kubectl') {
echo "灰度部署......"
sh "cd A && sed -i -E \"s/${env.image_reponame}:.+/${env.image_reponame}:${env.image_tag}/\" A-gray-deployment.yaml"
sh "cd A && sed -i -E \"s/replicas:.+/replicas: ${env.number_of_pods}/\" A-gray-deployment.yaml"
sh "kubectl apply -f A/A-gray-deployment.yaml -n default"
}
}
}
stage('結(jié)束灰度') {
input {
message "請(qǐng)確認(rèn)是否全量發(fā)布"
ok "確認(rèn)"
parameters {
string(name: 'continue', defaultValue: 'true', description: 'true為全量發(fā)布,其他為回滾')
}
}
steps{
script {
env.continue = sh (script: 'echo ${continue}', returnStdout: true).trim()
if (env.continue.equals('true')) {
container('kubectl') {
echo "全量發(fā)布......"
sh "cd A && sed -i -E \"s/${env.image_reponame}:.+/${env.image_reponame}:${env.image_tag}/\" A-deployment.yaml"
sh "cd A && sed -i -E \"s/replicas:.+/replicas: ${env.number_of_pods}/\" A-deployment.yaml"
sh "kubectl apply -f A/A-deployment.yaml -n default"
}
} else {
echo '回滾'
}
container('kubectl') {
sh "kubectl delete -f A/A-gray-deployment.yaml -n default"
}
}
}
}
}
}

(2)構(gòu)建 Jenkins 流水線

  • 在 Jenkins 控制臺(tái)單擊流水線右側(cè)的圖標(biāo)。
  • 單擊流水線的開始構(gòu)建。

說(shuō)明:第一次構(gòu)建因?yàn)樾枰獜?Git 倉(cāng)庫(kù)拉取配置并初始化流水線,所以可能會(huì)報(bào)錯(cuò),再次執(zhí)行 Build with Parameters,生成相關(guān)的參數(shù),填寫相關(guān)的參數(shù),再次執(zhí)行構(gòu)建。

圖片

查看部署狀態(tài),代碼打包,鏡像構(gòu)建及發(fā)布,灰度部署階段都已經(jīng)完成,結(jié)束灰度階段等待確認(rèn)。

圖片

如果驗(yàn)證結(jié)果符合預(yù)期,則執(zhí)行全量發(fā)布,請(qǐng)參見后文的全量發(fā)布應(yīng)用。

如果驗(yàn)證結(jié)果不符合預(yù)期時(shí),則執(zhí)行回滾,請(qǐng)參見后文的回滾應(yīng)用。

(3)結(jié)果驗(yàn)證

  • 登錄容器服務(wù)控制臺(tái),在控制臺(tái)左側(cè)導(dǎo)航欄中,單擊集群。
  • 在集群列表頁(yè)面中,單擊目標(biāo)集群名稱或者目標(biāo)集群右側(cè)操作列下的詳情。
  • 在集群管理頁(yè)面左側(cè)導(dǎo)航欄選擇工作負(fù)載 > 無(wú)狀態(tài)。
  • 在無(wú)狀態(tài)應(yīng)用列表頁(yè)面,spring-cloud-a-gray應(yīng)用已經(jīng)自動(dòng)創(chuàng)建,并且它的鏡像已經(jīng)替換為spring-cloud-a:gray版本。

圖片

  • 在集群管理頁(yè)面左側(cè)導(dǎo)航欄選擇網(wǎng)絡(luò) > 服務(wù),選擇設(shè)置的命名空間,單擊zuul-slb服務(wù)的外部端點(diǎn),查看真實(shí)的調(diào)用情況。

不帶灰度 Header 進(jìn)行調(diào)用,發(fā)現(xiàn)路由到 A 的正常節(jié)點(diǎn)。

Curl 命令:

curl http://182.92.XX.XX/A/a

執(zhí)行結(jié)果如下:

A[10.4.XX.XX] -> B[10.4.XX.XX] -> C[10.4.XX.XX]%

帶上符合條件的參數(shù)進(jìn)行訪問,路由到 A 的灰度節(jié)點(diǎn)中。

Curl 命令:

curl http://182.92.XX.XX/A/a?name=xiaoming

執(zhí)行結(jié)果如下:

Agray[10.4.XX.XX] -> B[10.4.XX.XX] -> C[10.4.XX.XX]%
  • 6. 登錄 MSE 治理中心控制臺(tái),在應(yīng)用詳情頁(yè)面,可以看到灰度流量已經(jīng)進(jìn)入到灰度的 Pod 中。

圖片

(4)全量發(fā)布應(yīng)用

結(jié)果驗(yàn)證通過(guò)之后,確認(rèn)全量發(fā)布。

  • 在 Jenkins 控制臺(tái)中,單擊目標(biāo)流水線名稱。
  • 單擊需要全量發(fā)布的階段,在請(qǐng)確認(rèn)是否全量發(fā)布對(duì)話框中輸入 true,然后單擊確認(rèn)。

圖片

  • 在容器服務(wù)控制臺(tái),發(fā)現(xiàn) spring-cloud-a-gray 應(yīng)用已經(jīng)被刪除,并且 spring-cloud-a 應(yīng)用的鏡像已經(jīng)替換為 spring-cloud-a:gray 版本。

圖片

  • 在 MSE治理中心控制臺(tái),發(fā)現(xiàn)灰度流量已經(jīng)消失。

圖片

(5)回滾應(yīng)用

如果發(fā)現(xiàn)驗(yàn)證結(jié)果不符合預(yù)期時(shí),則回滾應(yīng)用。

  • 在 Jenkins 控制臺(tái)中,單擊目標(biāo)流水線名稱。
  • 單擊需要全量發(fā)布的階段,在請(qǐng)確認(rèn)是否全量發(fā)布對(duì)話框中輸入 false,然后單擊確認(rèn)。

圖片

  • 在容器服務(wù)控制臺(tái),發(fā)現(xiàn) spring-cloud-a-gray 應(yīng)用已經(jīng)被刪除,并且 spring-cloud-a 應(yīng)用的鏡像仍然是老版本。

圖片

  • 在 MSE 治理中心控制臺(tái),發(fā)現(xiàn)灰度流量已經(jīng)消失。

圖片

4.總結(jié)

在微服務(wù)治理架構(gòu)中,全鏈路灰度功能能提供虛擬泳道,極大的方便了測(cè)試、發(fā)布時(shí)的快速驗(yàn)證,能夠幫助 DevOPs 提升線上穩(wěn)定性。阿里云微服務(wù)引擎(MSE)能夠給您帶來(lái)全生命周期的、全方位的微服務(wù)治理能力,保障您的線上穩(wěn)定性、提升開發(fā)、運(yùn)維效率。相關(guān)鏈接:

參考文檔:https://github.com/aliyun/alibabacloud-microservice-demo/blob/master/mse-simple-demo/helm/mse-simple-demo/README.md

示例代碼倉(cāng)庫(kù)地址:https://gitee.com/mse-group/alibabacloud-microservice-demo/tree/master/mse-simple-demo

容器服務(wù)控制臺(tái):https://cs.console.aliyun.com/#/k8s/cluster/list

MSE治理中心控制臺(tái):https://mse.console.aliyun.com/#/overview?

使用 kaniko 構(gòu)建和推送容器鏡像:https://help.aliyun.com/document_detail/106712.htm?

責(zé)任編輯:武曉燕 來(lái)源: 阿里巴巴中間件
相關(guān)推薦

2024-01-05 00:29:36

全鏈路灰度發(fā)布云原生

2020-10-21 14:10:28

工具測(cè)試開發(fā)

2024-05-20 11:23:18

2024-12-16 13:34:35

2019-11-07 09:00:39

Jenkins流水線開源

2023-11-21 09:35:49

全量部署微服務(wù)

2022-02-22 09:00:00

軟件開發(fā)CI/CD 管道工具

2025-03-04 08:53:10

2021-11-18 10:01:00

Istio 全鏈路灰度微服務(wù)框架

2023-02-19 15:28:39

CI/CD 管道集成開發(fā)

2020-06-05 07:20:41

測(cè)試自動(dòng)化環(huán)境

2023-11-14 09:04:15

用戶節(jié)點(diǎn)不可用

2018-08-24 09:00:00

DevOps持續(xù)集成連續(xù)部署

2023-01-30 22:34:44

Node.js前端

2021-08-31 09:00:00

開發(fā)Azure DevOp集成

2020-10-12 07:00:00

JenkinsDevOps測(cè)試工具

2023-03-13 14:46:32

CI/CD工具軟件開發(fā)

2021-01-11 09:17:49

GitLabCIMonorepoDocker

2022-12-26 11:57:41

數(shù)據(jù)庫(kù)治理
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)