概要:Kubernetes改造与自动化灰度发布是一个长期的过程,需要克服很多困难。但改造也能实实在在带来研发效能的提升,支持灰度发布以后,测试的主要时间可以从晚上转到白天,减轻研发和测试和运维人员的负担。

  文章作者:中移(苏州)软件技术有限公司 SaaS产品部 研发经理 王艳辉

 本文由同事代发

今年以来,云视频技术团队陆续对7款子产品进行了架构上的调整。以短视频SDK为公司试点产品,率先接入公司的蓝鲸平台,并进行了灰度发布一期和二期的工作。其他6款子产品也快速跟进,首批完成了自动化的灰度发布。整个过程如下所示:分为容器化、Kubernetes部署、cicd/ops自动化部署与灰度发布4个阶段。如下图所示:

通过自动化部署和灰度发布,研发效能得到显著提升。本文将回顾自动化部署与灰度发布的改造历程,并详细介绍云视频灰度发布的整体架构、引流策略设置、自动化灰度发布过程以及成效。

1 云视频灰度发布历程回顾

1.1 容器化

容器化是改造的第一步。在改造以前,云视频各个子产品都是非容器化的。后端直接以jar包的形式部署在虚拟机上,前端以源文件的形式部署在nginx中。容器化的核心是制作镜像,制作镜像的核心是编写DockerFile。

云视频前端DockerFile的核心脚本如下:(以媒体转码为例)

FROM nginx

COPY.//usr/share/nginx/html/api/page/cloudvideo/vt/

COPY Nginx/default.conf /etc/nginx/conf.d/default.conf

云视频后端DockerFile的核心脚本如下:(以媒体转码为例)

FROM williamyeh/java8:latest

ARG JAR_VERSION

ENV RUN_USER  root

ENV RUN_GROUP root

ADD cloud-video-vt-provider-encrypted.jar /app/cloud-video/transcoding/app.jar

RUN  cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

WORKDIR /app/cloud-video/transcoding

USER $RUN_USER

CMD java -jar /app/cloud-video/transcoding/app.jar

进入DockerFile所在的目录

docker build -t 镜像名称 .即可打包镜像。

1.2  Kubernetes部署

Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了应用部署,规划,更新,维护的一种机制。

容器化改造完成,即可开始Kubernetes的部署。在接入cicd和ops平台以前,Kubernetes的部署采用手动的方式,即手动编写yaml脚本,手动执行Kubernetes命令对服务进行启动停止。云视频在研发域、测试域、生产域各自搭建了一套Kubernetes环境。

Kubernetes编排的载体是yaml文件,通过yaml文件描述pod、deployment、service等内容。以下展示云视频核心的yaml文件内容:(以视频安防为例)

1.3  cicd与ops自动化部署

如果仅仅实现Kubernetes,而不支持自动化,那么部署将是一件非常麻烦的事情。云视频改造之初也经历过这种痛苦。特别是生产环境,由于生产域对cicd制品库的网络不通,每次上线都需要手动上传镜像,然后加载到每一台机器,非常耗时。因为需要支持自动化的发布才能体现出容器化的优势。在研发域、测试域、生产域,支持自动化部署的方式各不相同。在研发和测试域通过cicd,在生产域则通过应用发布自动化平台。

研发域通过代码触发的方式,代码提交后自动触发编译,编译完成打包镜像推送至研发域镜像仓库,然后触发研发环境的Kubernetes重新部署镜像。

测试域域通过手动触发的方式,分为编译和部署两个阶段。编译阶段将镜像打包到部门镜像仓库,部署阶段测试域镜像仓库会将镜像同步到测试域的镜像仓库。在部署阶段,将测试域的镜像拉到Kubernetes进行部署。测试域的部署流水线如下:

线上则使用应用发布自动化平台。在应用发布自动化平台,可以创建模板集(Kubernetes的yaml文件)和发布流水线。应用发布自动化平台会同步制品库的镜像,因此使用应用发布自动化平台部署,不需要再手动上传镜像,但需要修改模板集中的镜像地址,由制品库的地址改为各个资源池的地址。

1.4 灰度发布

灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式。在其上可以进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。

依赖ops平台可以实现自动化的灰度发布。以下是灰度发布流水线(以短视频为例):

流水线分为五步,开始、启动灰度服务,引流、切流、结束。中间三步是核心。启动灰度服务是指启动新版本的服务。引流是将特定的一些流量引到灰度版本。切流是将所有的流量引到新版本,完成正式发布。下一章将详解灰度发布的内容。

云视频灰度发布整体架构

2.1 云视频灰度发布的架构图

云视频已经完成统一域名改造,所有请求都会经过中心网关,然后再到云视频。网关中携带了用户信息。云视频的入口,是一主一备两台nginx。由nginx转发至Kubernetes的ingress。当做灰度发布时,启动了两个ingress,一个做正常的引流,一个做灰度引流。云视频采用的是基于用户id的引流,当特定的账号请求时,返回各产品灰度的前端和后端服务,当是非特定账号的请求时,返回正常的前端和后端服务。

2.2 云视频灰度发布场景覆盖

云视频7款子产品都实现了全场景(前端、后端、数据库、配置)的灰度发布覆盖

覆盖场景如下所示(以视频安防为例)

云视频使用前后端分离的架构,前端与后端为独立的Kubernetes服务。在用户达到前端服务以前,先经过ingress,ingress根据用户判断请求灰度服务还是正常服务。

云视频灰度发布覆盖了数据库新增和配置新增的场景。新增数据库和配置后,新的代码可以用到新增的配置和数据库字段,老的代码不会用到新增的数据库和配置。请求示意图如下:

3 云视频灰度发布引流策略设置

3.1 ingress-nginx引流方式

云视频基于ingress-nginx做引流。Ingress-nginx做引流有如下方式:

nginx.ingress.kubernetes.io/canary-by-header:基于Request Header的流量切分,适用于灰度发布与A/B测试

nginx.ingress.kubernetes.io/canary-by-header-value:需要匹配Request Header的值,用于通知Ingress将请求路由到Canary Ingress中指定的服务

nginx.ingress.kubernetes.io/canary-by-header-pattern:除了PCRE Regex匹配之外,它的工作方式与canary-by-header-value相同

nginx.ingress.kubernetes.io/canary-by-cookie:基于Cookie的流量划分,适用于灰度发布与A/B测试

nginx.ingress.kubernetes.io/canary-weight:基于服务权重的流量划分,适用于蓝绿发布

具体到策略上,最常用的,有基于ip的引流,基于流量的引流,基于用户的引流。

3.2 云视频引流策略选择

云视频选择基于基于用户的引流方式。是基于产品自身特点决定的。

(1)云视频一开始就接入了op网关,能够很方便的拿到用户信息(header中有user_id),对于前端服务和后端服务,都能够根据user_id进行引流。

(2)云视频做灰度发布的最主要作用,是方便测试。通过用户的方式,可以精准引流,需要测试时,只需要将所需要的的用户信息配置到ingress中就可以了。

因此,云视频选择基于用户的引流方式。主要基于nginx.ingress.kubernetes.io/canary-by-header和nginx.ingress.kubernetes.io/canary-by-header-pattern两个配置来做。这里需要注意的是,canary-by-header-pattern需要比较高的ingress-nginx版本才支持,短视频SDK试点时使用的ingress-nginx版本比较低,导致正则表达式不生效,排查了很久,最后将版本升级到0.35.0解决问题。

云视频灰度ingress截图:

4 自动化灰度发布的过程及成效

灰度发布的流程图如下:

(1)研发阶段

研发阶段包括研发和测试域测试。这个过程和普通发布的要求是相同的。需要产出测试域测试报告。

(2)灰度发布阶段

灰度发布前先提变更工单,与普通发布不同,灰度发布可以提白天的变更工单,可以在白天开始变更。变更工单需要关联蓝鲸平台的流水线id。灰度发布的产出物为灰度发布测试报告。

(3)正式发布阶段

正式发布阶段不再需要部署,只需要切流即可。切流以后,测试可以使用非灰度的账号进行测试。测试完成出具正式环境的测试报告,变更结束。

4.2 灰度发布和自动化部署的成效

Kubernetes自动化部署与灰度发布可以带来实实在在研发效能的提升。这主要体现在4个方面,分别是部署时机、部署时长、部署准确性和参与人数4个方面。

4.2.1 部署时机

常规发布需要在晚上进行,一般要提22:00以后的变更。这样势必造成主要的部署和测试工作在晚上进行,让研发人员、运维人员、测试人员经受熬夜通宵之苦。灰度发布可以提白天的变更,部署和主要的测试工作在白天进行,正式变更时只要进行切流,无需再进行部署,测试人员也不再需要全量测试。这样可以大大缓解晚上上线的压力。

4.2.2 部署时长

接入应用自动化平台可以大大降低部署时长。容器化后,没有接入自动化以前,需要手动上传镜像,然后发布到每一台node节点。非常耗时,部署一次在1小时左右,接入自动化平台以后10分钟左右即可完成。

4.2.3 部署准确性

接入应用发布自动化平台以后,可以提高部署的准确性,以前由于手动上传镜像。偶尔会出现部署不准确的现象。接入以后基本准确性能到100%。

4.2.4 部署时机

综合自动化部署和灰度发布的综合成效,一次发布节省人力在2人左右。原来需要投入4个人的,现在需要投入2个人即可。节省效能50%。

05 总结

Kubernetes改造与自动化灰度发布是一个长期的过程,需要克服很多困难。但改造也能实实在在带来研发效能的提升,支持灰度发布以后,测试的主要时间可以从晚上转到白天,减轻研发和测试和运维人员的负担。希望有更多的产品能够接入进来,提升发布效率。

作者:王艳辉

链接:移动云开发者社区
来源:移动云官网开发者社区

云视频自动化部署与灰度发布实践相关推荐

  1. 自动化 CICD 与灰度发布

    作者 | 江昱 阿里云高级产品经理 导读:本文主要分享 Serverless 场景下,自动化的部署和灰度发布的相关问题. 环境管理和自动化部署 当我们从传统开发迁移到 Serverless 下,对于环 ...

  2. 开源运维管理软件排名_云上自动化部署和运维的正确姿势

    导读:今天起,"凌云时刻"特别推出"阿里云玩转 ECS"系列课程,每周二.周四固定更新,欢迎关注.本期为系列第 1 讲,由阿里云资深技术专家吴君印介绍上云最正确 ...

  3. 云上自动化部署和运维的正确姿势

    凌云时刻 · 技术 导读:今天起,"凌云时刻"特别推出"阿里云玩转 ECS"系列课程,每周二.周四固定更新,欢迎关注.本期为系列第 1 讲,由阿里云资深技术专家 ...

  4. 蓝绿部署、滚动部署、灰度发布、金丝雀发布

    目前有很多用于部署的技术,有的简单,有的复杂:有的得停机,有的不需要停机即可完成部署.本文的目的就是将目前常用的布署方案做一个总结. 一.蓝绿布署 Blue/Green Deployment(蓝绿部署 ...

  5. 微服务部署:蓝绿部署、滚动部署、灰度发布等部署方案对比与总结

    在项目迭代的过程中,不可避免需要"上线".上线对应着部署,或者重新部署:部署对应着修改:修改则意味着风险. 目前有很多用于部署的技术,有的简单,有的复杂:有的得停机,有的不需要停机 ...

  6. 微服务部署:蓝绿部署、滚动部署、灰度发布

    在项目迭代的过程中,不可避免需要"上线".上线对应着部署,或者重新部署:部署对应着修改:修改则意味着风险. 目前有很多用于部署的技术,有的简单,有的复杂:有的得停机,有的不需要停机 ...

  7. 蓝绿部署、滚动部署、灰度发布(金丝雀发布)

    传统方式 在一般情况下,升级服务器端应用,需要将应用源码或程序包上传到服务器,然后停止掉老版本服务,再启动新版本.但是这种简单的发布方式存在两个问题, (1)在新版本升级过程中,服务是暂时中断的, ( ...

  8. 微服务部署:蓝绿部署、滚动部署、灰度发布、金丝雀发布

    在项目迭代的过程中,不可避免需要"上线".上线对应着部署,或者重新部署:部署对应着修改:修改则意味着风险. 目前有很多用于部署的技术,有的简单,有的复杂:有的得停机,有的不需要停机 ...

  9. 基于spring cloud 的灰度发布实践_【收藏】基于spring cloud灰度发版方案

    简介 敏捷开发迭代周期短发布快,每周都可能面临版本发版上线,为最大可能的降低对用户的影响提高服务可用率,大部分团队都需要等到半夜做发布和支持.本文就如何基于spring cloud体系做灰度发版改造提 ...

最新文章

  1. java字符存储,在什么编码是Java字符存储在?
  2. OPENWRT中SSH免密钥登陆(具体步骤)
  3. pythonurllib模块-Python3中核心模块urllib的用法大全
  4. VMWARE ESXI 虚拟硬盘的格式:精简置备、厚置备延迟置零、厚置备置零
  5. 用tinyscript解一些典型算法题,小试牛刀
  6. Oracle不使用索引的几种情况列举
  7. step2 . day7 C语言阶段小的项目总结
  8. 【Python基础】07、Python类与面向对象
  9. python中表示空类型的是_python中什么表示空类型
  10. Linux 文件与目录管理 | 菜鸟笔记收录
  11. MATLAB画qpsk的矢量图,matlab仿真QPSK.doc
  12. 桌面计算机怎么设置声音,右下角小喇叭不见了-电脑桌面右下角有一个调整声音的小喇叭图标没 – 手机爱问...
  13. 网页登录《记住我》功能实现原理
  14. LHS查询 RHS查询
  15. 医疗管理系统-图形报表、POI报表
  16. 《简单的逻辑学》阅读笔记(思维导图)
  17. 【初识AI】(一):ASR和NLP
  18. vivado里那些看不懂的原语
  19. 阿里云网站备案-备案流程问题解答汇总
  20. VC++ MFC 遍历注册表,获取网卡名称。(设备管理器中的名称)

热门文章

  1. Java和vue开发的橱柜定制系统家具定制系统
  2. 完美世界2最新服务器,我的世界1.7.2服务器完美世界
  3. 基于STM32的AD7699、(AD7689、AD7949、AD7682)芯片驱动
  4. FPGA_Verilog学习之旅(4)---基于SPI读取AD7606
  5. 树莓派zero玩JAVA游戏,用树莓派编写“太空入侵者”游戏教程,这个元旦简单太爽了……...
  6. Unity编辑器内搜索小技巧
  7. 图的遍历:广度优先搜索(BFS)
  8. 2022哈尔滨工业大学 软件构造期末复习 一
  9. linux五子棋程序,Linux/GNU下 五子棋
  10. 新电脑验机步骤(1)