作者|Bubi本文介绍了如何通过Jenkins搭建pipeline,实现全链路灰度功能。在发布过程中,为了整体的稳定性,我们总是希望通过一小部分特定流量来验证新发布的应用是否正常。即使新版本出现问题,也能及时发现,控制影响范围,保证整体稳定性。1.整体结构下面以Demo为例:为了保证稳定性,我们约定如下在线流程:其中,在灰度验证中,有几种不同的策略:直接使用一小部分在线测试流量(按百分比)根据特定规则(如特定header、特定cookie等)从线上选择流量识别流量在客户端或浏览器是否灰度(如通过headers)2.部署applications&createswimlanes根据参考文档部署应用最后,我们首先要区分线上流量和灰度流量。创建泳道组,选择整个链路涉及的所有应用:然后创建泳道组,将符合规则的应用划分到灰色泳道中:注意:如果没有匹配的流量,会去基线环境,即在节点上没有标记的应用程序。配置完成后,访问网关。如果不符合灰度规则,去基线环境:如何符合灰度规则,去灰度环境:3.配置Jenkinspipeline。本次实践中,需要对源码进行打包,然后进行镜像推送。请确保Jenkins有Push到镜像仓库的权限。有关详细信息,请参阅使用kaniko构建和推送容器镜像。使用生成的config.json文件在Jenkins命名空间下创建名为jenkins-docker-cfg的Secret。kubectlcreatesecretgenericjenkins-docker-cfg-njenkins--from-file=/root/.docker/config.json(1)在Jenkins中创建全链路灰度发布流水线,实现基于Jenkins的自动化发布流水线,通过这个管道可以让应用发布具备灰度、可观察、回滚安全生产的三斧能力。单击Jenkins控制台左侧导航栏中的新建任务。输入任务名称,选择管道,然后单击“确定”。点击顶部菜单栏的Pipeline选项卡,在Pipeline区域配置相关参数选择,输入脚本路径,点击Save。定义:从SCM中选择流水线脚本。SCM:选择Git。存储库URL:输入Git存储库的URL。脚本路径:输入Jenkinsfile。您可以参考以下文件填写指定的参数。当然你也可以根据自己的需要写一个Jenkinsfile上传到Git的指定路径(pipeline中指定的脚本路径)。#!groovypipeline{//定义本次构建使用哪个标签构建环境,本例中为“slave-pipeline”agent{node{label'slave-pipeline'}}//常量参数,一般不需要初始判断环境改变后{IMAGE=sh(returnStdout:true,script:'echoregistry.$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')}//stagesofpipelinestages{stage('codepackaging'){steps{包含er("maven"){echo"mirrorbuild..."sh"cdA&&mvncleanpackage"}}}stage('mirrorbuildandrelease'){steps{container("kaniko"){sh"kaniko-f`pwd`/A/Dockerfile-c`pwd`/A--destination=${IMAGE}--skip-tls-verify"}}}stage('Grayscaledeployment'){steps{container('kubectl'){echo"灰度部署..."sh"cdA&&sed-i-E\"s/${env.image_reponame}:.+/${env.image_reponame}:${env.image_tag}/\"A-gray-deployment.yaml"sh"cdA&&sed-i-E\"s/replicas:.+/replicas:${env.number_of_pods}/\"A-gray-deployment.yaml"sh"kubectlapply-fA/A-gray-deployment.yaml-ndefault"}}}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"cdA&&sed-i-E\"s/${env.image_reponame}:.+/${env.image_reponame}:${env.image_tag}/\"A-deployment.yaml"sh"cdA&&sed-i-E\"s/replicas:.+/replicas:${env.number_of_pods}/\"A-deployment.yaml"sh"kubectlapply-fA/A-deployment.yaml-ndefault"}}else{echo'回滚'}容器('kubectl'){sh"kubectldelete-fA/A-gray-deployment.yaml-ndefault"}}}}}}(2)构建Jenkins管道在Jenkins控制台中,点击管道右侧的图标,点击pipeline开始建设。注意:第一次构建需要从Git仓库中拉取配置并初始化管道,所以可能会报错。再次执行BuildwithParameters生成相关参数,填写相关参数,再次执行构建。查看部署状态,代码打包,镜像构建发布,灰度部署阶段已经完成,灰度阶段结束,等待确认。如果验证结果符合预期,则进行全量放行,见下方全量放行申请。如果验证结果不符合预期,则进行回滚,参见稍后回滚应用。(3)结果验证登录容器服务控制台,单击控制台左侧导航栏中的集群。在集群列表页面,单击目标集群名称或目标集群右侧操作栏下的详情。在集群管理页面的左侧导航栏中,选择Workload>Stateless。在无状态应用列表页面,已经自动创建了spring-cloud-a-gray应用,其镜像已经替换为spring-cloud-a:gray版本。在集群管理页面的左侧导航栏中,选择Network>Service,选择配置的命名空间,点击zuul-slb服务的外部端点,查看实际调用情况。不带灰度header的调用,找到路由到A的正常节点curl命令:curlhttp://182.92.XX.XX/A/a执行结果如下:A[10.4.XX.XX]->B[10.4.XX.XX]->C[10.4.XX.XX]%符合条件的参数访问,路由到A的灰度节点curl命令:curlhttp://182.92.XX.XX/A/a?name=xiaoming执行结果如下:Agray[10.4.XX.XX]->B[10.4.XX.XX]->C[10.4.XX.XX]%6。登录MSE管理中心控制台。在应用详情页可以看到灰度流量已经进入了灰度Pod。(四)完全放行申请结果审核通过后,确认完全放行。在Jenkins控制台中,单击目标管道名称。单击需要完全释放的阶段,在请确认是否完全释放对话框中输入true,然后单击确定。在容器服务控制台,发现spring-cloud-a-gray应用被删除,spring-cloud-a应用的镜像被替换为spring-cloud-a:gray版本。在MSE管理中心的控制台,发现灰度流量已经消失。(5)回滚应用如果发现验证结果不符合预期,则回滚应用。在Jenkins控制台中,单击目标管道名称。单击需要完全发布的阶段,在“确认完全发布”对话框中输入“false”,单击“确定”。在容器服务控制台,发现spring-cloud-a-gray应用已经删除,spring-cloud-a应用的镜像还是旧版本。在MSE管理中心的控制台,发现灰度流量已经消失。4.小结在微服务治理架构中,全链路灰度功能可以提供虚拟泳道,极大地方便测试和发布时的快速验证,帮助DevOPs提升线上稳定性。阿里云微服务引擎(MSE)可为您带来全生命周期、全方位的微服务治理能力,保障您的在线稳定性,提升开发运维效率。相关链接:参考文档:https://github.com/aliyun/alibabacloud-microservice-demo/blob/master/mse-simple-demo/helm/mse-simple-demo/README.md示例代码仓库地址:https://gitee.com/mse-group/alibabacloud-microservice-demo/tree/master/mse-simple-demo容器服务控制台:https://cs.console.aliyun.com/#/k8s/cluster/listMSE治理中心控制台:https://mse.console.aliyun.com/#/overview使用kaniko构建和推送容器镜像:https://help.aliyun.com/document_detail/106712.htm
