k8s灰度更新_有赞灰度发布与蓝绿发布实践

本文详细介绍了有赞在k8s环境下的灰度发布和蓝绿发布实践,旨在保证服务稳定性和快速迭代。文章讨论了流量控制系统的协议和架构,包括选用Istio的协议和Envoy代理,并阐述了灰度发布和蓝绿发布的概念、流程以及可观测性与可运维性的实现。未来规划将解决多应用联合发布和消息队列的流量控制问题。
摘要由CSDN通过智能技术生成
5be0235de2bbb2ae62ae24003c6b0789.png

点击关注“有赞coder”

获取更多技术干货哦~

a4654b9507268163a4bb2d33d4b80436.png 作者:飘石 团队:基础保障

背景

近几年,随着有赞用户的迅速增长和业务的快速发展,对业务开发人员要求越来越高,一方面要求为用户提供稳定的服务,一方面要求进行快速业务迭代。然而,随着公司业务复杂度和服务化整体规模的增长,单个业务功能涉及的微服务接口数、服务化调用链路长度都在迅速增加,业务的回归测试越来越难以覆盖到所有的调用链路和业务逻辑,通过仅在测试环境进行业务测试的方式来保证系统稳定性的难度越来越高。

基于系统稳定性和快速业务迭代的综合考虑,业务应用开发团队采取了新版本服务灰度上线的方式,即新版本服务并非全量发布到线上环境,而是发布少数几个实例进行灰度验证,没有问题后再全量发布。在部分核心服务进行接口升级和逻辑迁移时,还会通过在业务逻辑代码中增加黑白名单或者流量百分比控制的方式,逐步将旧版本接口实现迁移至新版本接口实现。该方式较好地权衡了服务稳定性和业务迭代效率,但仍存在以下问题:

  • 需要业务开发人员在服务接口中编码大量与业务逻辑无关的黑白名单或流量百分比控制代码,对业务入侵比较大;

  • 调整黑白名单或流量控制百分比,需要业务团队发布代码或者接入动态配置中心,过程复杂、可复用性差、操作灵活性差;

  • 当新版本接口出现波动或异常,通常需要业务团队通过紧急修改代码和紧急发布,来更新黑白名单和流量百分比控制策略,时间较长,业务影响较大。

为解决以上痛点,有赞基础保障团队于2018年开始立项实现流量控制系统以及灰度发布产品,主要目标如下:

  • 将业务通过黑白名单或者百分比方式控制新、旧版本接口流量的逻辑,整体下沉到服务化基础组件和Http入口Nginx层;

  • 提供完整的流量控制方案,除了上面提到的黑白名单和百分比流量控制策略,项目还将深挖业务需求,提供更丰富的动态流量控制策略;

  • 与Ops运维管理系统打通,实现易于使用和管理的灰度发布及其他服务治理产品。

一、流量控制系统

1.1 协议

实现灰度发布产品,首先需要实现底层的流量控制系统。而实现流量控制系统,首先面临问题是如何确定流量控制协议。虽然我们最初的目标是为了支持灰度发布,但我们的系统设计必须充分考虑未来的可扩展性,除了流量路由,还期望支持熔断、限流、错误恢复等服务治理能力。我们在进行方案选型时,有如下几个目标:

  • 协议应当是完备的,支持各种服务治理功能。包括但不限于:服务熔断、限流、A/B Test等。后续的服务治理功能应当都能够通过该控制协议实现;

  • 可读性好,易于解析。控制协议应该是易读且易于解析的,便于理解和方便中间件实现,尽量不要引入复杂协议或新的编码和序列化方式;

  • 避免重复造轮子,尽量使用业界已经成熟的优秀设计。

根据上面的设计目标以及充分的调研,最终确定使用业界广泛关注的Service Mesh框架Istio的流量控制协议。实际上,Istio使用Envoy作为data plane,也就是支持了Envoy的API。当时立项时,Envoy已经在业界非常多的实际生产场景中部署使用。我们最初采用的是Envoy v1 API,其路由控制协议支持json编码,语意丰富且易于解析和阅读(目前广泛使用的是基于gRPC的v2 API,我们也在向v2 API 迁移中)。同时,Istio很好的支持K8s容器化部署,符合有赞运维平台容器化的发展趋势。

需要额外说明的是,Istio使用的路由控制协议,七层协议功能最完备的是Http路由协议,而我们内部广泛使用的是RPC协议:Java应用之间使用Dubbo协议,跨语言调用使用Nova协议(自研),需要进行相应的适配。而值得庆幸的是,Dubbo和Nova RPC调用协议的语意,在整体上与Http请求有一定的相似性,适配起来比较方便,如service(interface)与method可对应Http的path,attachment(metadata)可以对应Http的header。此外,原始的Istio路由控制协议语义丰富而复杂,主要为了多维度的控制Http请求的路由、超时重试、限流、熔断等。我们短期内不需要支持完整的协议,仅支持经过微小适配后的协议子集即可,保留后续对其扩展的能力。

协议的详细细节我们在这里不再展开,具体可参考Istio和Envoy的文档。这里以一个抽象简化的示例来介绍简单描述一下流量控制协议(目前主要是路由控制,也称为路由规则)。示例如下:

{

    "name":"java-demo-rule",

    "domains":[

        "java-demo"

    ],

    "routes":[

        {

            "headers":[

                {

                    "name":"userid",

                    "value_match":"123"

                }

            ],

            "cluster":"java-demo|version=v2"

        },

        {

            "weighted_clusters":{

                "clusters":[

                    {

                        "name":"java-demo|version=v2",

                        "weight":10

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值