更新时间:2024-05-29 GMT+08:00
分享

发布概述

应用现状

应用程序升级面临最大挑战是新旧业务切换,将软件从测试的最后阶段带到生产环境,同时要保证系统不间断提供服务。如果直接将某版本上线发布给全部用户,一旦遇到线上事故(或BUG),对用户的影响极大,解决问题周期较长,甚至有时不得不回滚到前一版本,严重影响了用户体验。

解决方案

长期以来,业务升级逐渐形成了几个发布策略:灰度发布、蓝绿发布、A/B测试、滚动升级以及分批暂停发布,尽可能避免因发布导致的流量丢失或服务不可用问题。

本文着重介绍灰度发布和蓝绿发布的原理及实践案例。

  • 灰度发布,又称金丝雀发布,是版本升级平滑过渡的一种方式,当版本升级时,使部分用户使用新版本,其他用户继续使用老版本,待新版本稳定后,逐步扩大范围把所有用户流量都迁移到新版本上面来。这样可以最大限度地控制新版本发布带来的业务风险,降低故障带来的影响面,同时支持快速回滚。

    以下示意图可描述灰度发布的大致流程:先切分20%的流量到新版本,若表现正常,逐步增加流量占比,继续测试新版本表现。若新版本一直很稳定,那么将所有流量都切分到新版本,并下线老版本。

    切分20%的流量到新版本后,新版本出现异常,则快速将流量切回老版本。

  • 蓝绿发布提供了一种零宕机的部署方式,是一种以可预测的方式发布应用的技术,目的是减少发布过程中服务停止的时间。在保留老版本的同时部署新版本,将两个版本同时在线,新版本和老版本相互热备,通过切换路由权重的方式(非0即100)实现应用的不同版本上线或者下线,如果有问题可以快速地回滚到老版本。

灰度发布或蓝绿发布实现方式

利用Kubernetes原生的特性可以实现简单的灰度发布或蓝绿发布,比如:通过修改Service的selector中决定服务版本的label的值来改变Service后端对应的Pod,实现让服务从一个版本直接切换到另一个版本,从而实现蓝绿发布。如果您的灰度或蓝绿发布需求较复杂,可以向集群额外部署其他开源工具,例如Nginx Ingress、Traefik,或将业务部署至应用服务网格(Application Service Mesh,简称ASM),利用开源工具和服务网格的能力实现。这三种方式分别对应本文如下内容:

表1 实现方式对比

实现方式

适用场景

特点

缺点

Service

发布需求简单,小规模测试场景

无需引入过多插件或复杂的用法

纯手工操作,自动化程度差

Nginx Ingress

无特殊要求

  • 配置Nginx Ingress所支持的Annotation即可实现灰度发布或蓝绿发布,无需关注内部原理
  • 支持基于Header、Cookie和服务权重三种流量切分的策略

集群需要安装nginx-ingress插件,存在资源消耗

ASM

商用场景

  • 无需修改应用的服务代码,非侵入式治理
  • 界面可视化,灰度发布或蓝绿发布过程中的流量变化可通过拓扑图、曲线图等直观查看
  • 可配置的灰度策略更全面,包括基于流量比例、基于请求内容(Header、Cookie、操作系统、浏览器)

需要为集群启用Istio,占用额外资源

Service和Nginx Ingress方式均利用Kubernetes开源能力实现灰度发布和蓝绿发布,在这个过程中,CCE也提供了很多便捷性,例如:

  • 所有资源的创建、查看、修改均可以在管理控制台实现,相比kubectl命令行工具更为直观。
  • LoadBalancer类型的Service由ELB服务实现,在创建Service时,可以使用已有ELB实例,也可以新建一个ELB实例。
  • 支持一键式安装nginx-ingress插件,并且在安装过程中实现ELB的创建与对接。

相关文档