通过Jenkins构建CI/CD实现全链路灰度
本文介绍通过 Jenkins 构建流水线的方式实现全链路灰度功能。
整体架构
Aliware
-
直接使用线上小部分流量来测试(按照百分比放量) -
从线上按照特定规则选择流量(比如特定的 header、特定的 cookie 等) -
在客户端或浏览器上标识出流量是否灰度(比如通过 header 传递)
部署应用&创建泳道
Aliware
注:没有匹配的流量,会走到基线环境,也就是没有打标的应用节点上。
配置 Jenkins 流水线
Aliware
kubectl create secret generic jenkins-docker-cfg -n jenkins --from-file=/root/.docker/config.json
在 Jenkins 中创建全链路灰度发布流水线
-
定义 :选择 Pipeline script from SCM。
-
SCM :选择 Git。
-
Repository URL :输入 Git 仓库的 URL。
-
脚本路径 :输入 Jenkinsfile。
#!groovypipeline {// 定义本次构建使用哪个标签的构建环境,本示例中为 “slave-pipeline”agent{node{label 'slave-pipeline'}}//常量参数,初始确定后一般不需更改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 {//保持构建的最大个数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的各个阶段场景stages {stage('代码打包') {steps{container("maven") {echo "镜像构建......"sh "cd A && mvn clean package"}}}stage('镜像构建及发布'){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('结束灰度') {input {message "请确认是否全量发布"ok "确认"parameters {string(name: 'continue', defaultValue: 'true', description: 'true为全量发布,其他为回滚')}}steps{script {env.continue = sh (script: 'echo ${continue}', returnStdout: true).trim()if (env.continue.equals('true')) {container('kubectl') {echo "全量发布......"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"}}}}}}
构建 Jenkins 流水线
说明:第一次构建因为需要从 Git 仓库拉取配置并初始化流水线,所以可能会报错,再次执行 Build with Parameters,生成相关的参数,填写相关的参数,再次执行构建。
-
如果验证结果符合预期,则执行全量发布,请参见后文的 全量发布应用 。
-
如果验证结果不符合预期时,则执行回滚,请参见后文的 回滚应用 。
结果验证
-
不带灰度 Header 进行调用,发现路由到 A 的正常节点。
-
Curl 命令:
curl http://182.92.XX.XX/A/a
-
执行结果如下:
A[10.4.XX.XX] -> B[10.4.XX.XX] -> C[10.4.XX.XX]%
-
带上符合条件的参数进行访问,路由到 A 的灰度节点中。
-
Curl 命令:
curl http://182.92.XX.XX/A/a?name=xiaoming
-
执行结果如下:
Agray[10.4.XX.XX] -> B[10.4.XX.XX] -> C[10.4.XX.XX]%
全量发布应用
回滚应用
总结
Aliware
参考文档:
示例代码仓库地址:
https://gitee.com/mse-group/alibabacloud-microservice-demo/tree/master/mse-simple-demo
容器服务控制台 :
https://cs.console.aliyun.com/#/k8s/cluster/list
MSE治理中心控制台 :
https://mse.console.aliyun.com/#/overview
使用 kaniko 构建和推送容器镜像:
https://help.aliyun.com/document_detail/106712.htm