软件总会有缺陷的,解决问题的同时往往会引入新的问题,关键是看这些问题是否在我们的控制范围内,“灰度发布”就是让问题受控的方法之一。


前言

我们的 CTO 经常说:“研发团队最首要的任务是提供稳定的服务,然后才是提供符合客户需求的、易用和低成本的产品”。但事实是,在提供稳定云服务的同时,面对快速发展的客户业务场景,我们还需要不断 “拥抱变化”。 Max Kanat-Alexander 在《简约之美:软件设计之道》(Code Simplicity)中提出的软件设计的 6 条法则恰到好处的描述了这一矛盾的事实,具体内容如下:

  1. 软件的目的是帮助他人;

  2. 相比降低开发成本,更重要的是降低维护成本;

  3. 变化定律:软件存在的时间越久,它的某部分需要变化的可能性越大;

  4. 缺陷定律:软件出现缺陷的可能性,正比于你对它所做修改的程度;

  5. 简洁定律:软件任一部分的维护难度,正比于该部分的复杂程度;

  6. 测试定律:你对软件行为的了解程度,等于你真正测试它的程度。

正像法则 1、3、4 和 6 所说的软件的目的就是满足客户的需求,而随着时间的推移,用户需求总会改变;伴随着用户需求的改变,软件也需要适应新的需求而做修改,修改必然会引入缺陷;如果要排除缺陷就必须进行测试。

但目前软件行业的现状大部分面临这样的问题,即无论花多大的成本去测试,真正的用户行为背后的需求总是不可能被完全满足的,缺陷总是会有的,这时我们最后的安全网就是“灰度发布”(又名“金丝雀发布”)。在采用用户真实行为作为终极测试的同时,通过控制变更范围尽可能的减少风险;一旦真的有缺陷可以快速回滚,尽可能以最大程度降低影响。

为何采用 ServiceMesh 实现灰度发布

Service Mesh 是用来处理各服务间通信的基础设施层。它主要通过构建云原生应用程序的各种复杂拓扑结构来完成传递请求。实际上,Service Mesh 通常与应用程序代码一起部署轻量级网络代理的阵列来实现请求。

在 ServiceMesh 之前,我们已经采用了 APIGateway 来实现灰度发布,但 APIGateway 通常仅部署在用户流量的入口,完全灰度发布就需要完整地部署两套系统。但是在微服务时代,任何一个微服务发生变更都需要完整地部署两套系统,这不仅成本很高而且严重影响了产品变更的速度。

而 ServiceMesh 正好可以解决这些问题,它的应用类似于将 APIGateway 部署到本地,同时提供了集中化控制,极大地简化了灰度发布的实现流程、降低了变更成本、同时加快了产品发布的进度。

为何采用轻量 ServiceMesh

正如敖小剑在《DreamMesh 抛砖引玉》系列文章中提到的:“Service Mesh 的发展进程,当前还处于前景虽然一致看好,但是脚下的路还处于需要一步一步走的早期艰难阶段。由于 Istio 和 Conduit 的尚未成熟,造成目前 Service Mesh 青黄不接的尴尬局面。” 到底该如何让 ServiceMesh 落地,这也是我们在 2017 年 10 月选择了 ServiceMesh 之后面临的难题。

Istio 可以提供一个完整的解决方案,通过为整个服务网格(ServiceMesh)提供行为检测和操作控制来满足微服务应用程序的各种需求。它在服务网络中提供了许多关键功能例如:流量管理、可观察性、策略执行、服务身份和安全、平台支持、集成和定制。

事实上我对 Istio 的流量管理 DSL 非常满意,同时通过评测也能够接受 Envoy 的性能开销,从当时来看 Istio 确实是一个非常优秀的且是唯一的候选者。但敖小剑在《DreamMesh 抛砖引玉》描述的几个问题,也困扰着我是否采用 Istio:

1. Ready forCloud Native?

我们目前并没有采用 K8S,事实上我们所开发的 IaaS 控制面程序,本身就和 K8S 的功能类似。

2. 如何从非 Service Mesh 体系过渡到 Service Mesh?

我们有大量既有的服务。

3. 零侵入的代价

K8S 的网络方案已经是非常复杂且性能堪忧了,再通过 IPTables 来透明引流确实是雪上加霜,给未来的运维、Trouble-Shooting 带来了很高的复杂度。

4. 网络通讯方案

目前我们主要使用 gRPC 和 HTTP,但仍有数据库服务等业务不适合跑在 K8S 中,而 K8S 的网络方案需要能够兼容现有的数据库等业务。

如何实现轻量 ServiceMesh

Istio 在逻辑上可以分为数据面板和控制面板,这两部分的具体功能如下:

  • 数据面板由一组智能代理(Envoy)组成,代理部署为 sidecar,调解和控制微服务之间所有的网络通信。

  • 控制面板负责管理和配置代理来路由流量,以及在运行时执行策略。

下图是构成每个面板的不同组件:

经过一些代码级别的 Research 之后,我们最终选择了将 Pilot 从 Istio 中剥离出来,脱离 K8S 运行的轻量级 ServiceMesh 方案。

从 Istio 中剥离 Pilot 和 Envoy

在 Istio 中 Pilot 作为 Envoy 的控制面板提供集中式流量管理功能的模块,这是实现灰度发布必不可少的功能,事实上也是 ServiceMesh 的核心功能。Mixer 提供访问策略和控制功能,Istio-Auth 提供安全认证功能,但在 UCloud 的内网环境下,我们可以将这两个模块去掉。

得益于 Pilot 的良好设计, ETCD Platform 很容易实现,进而从 ETCD 获取 Service 和 ServiceInstance 信息。然后我们重写了 Pilot 的 main.go,保留了 Pilot 的 model、proxy 和 proxy/envoy 模块 ; 删除其他的 Platform 仅保留新增的 ETCD Platform。最后我们在保留完整的 Istio DSL 支持的同时,得到了完全脱离 K8S 运行和编译的 Pilot。

同时我们将 Pilot 和 ETCD gRPC naming and discovery 做了深度整合,自动剔除没有在线的 ServiceInstance 信息。

采用 docker-compose 管理 container 实现 sidecar

我们仍然采用 container 的方式打包和部署微服务,但采用 Host 的网络方式简化了现存服务的网络通信方式。为了实现 Envoy 的 sidecar 部署,我们采用 docker-compose 模拟 k8s 的 POD,管理服务间的依赖关系。通过实现一个简单的服务管理、版本管理、集群管理、路由策略管理层,为集群中的每台 Node(VM 或物理服务器)生成 docker-compose 配置文件,从而实现每台 Node 的服务部署和管理。

最后针对 HTTP 1.0、HTTP 2.0 和 gRPC 的 RPC 方式,采用显式代理而不是 IPTables 透明引流和 Envoy 集成。

  • 如果服务中配置了 Envoy 的 Proxy Port,则通过 Envoy 接入 ServiceMesh;

  • 如果配置是 IP 地址和端口,则直连这个地址;

  • 如果配置的是域名且没有配置 Envoy 的 Proxy,则自动采用 ETCD gRPC naming and discovery 的方式去发现远端服务。

总结

通过一系列的设计改造,最终我们得到了一个轻量的 ServiceMesh 实践,实现了优化灰度发布的目标。在保证了更好的控制变更范围的同时,也能以提供更稳定的服务为最终目的。


作者简介

徐亮 ,毕业于上海大学通信与信息工程学院,先后任职于上海贝尔、腾讯,有超过 18 年电信与互联网行业研发管理经验。2015 年加入 UCloud,主要负责云平台网络架构,包括 UXR 网络解耦、网络产品架构升级、虚拟网络架构升级等。

采用轻量ServiceMesh实现灰度发布的实践的更多相关文章

  1. 轻量ORM-SqlRepoEx (十三)最佳实践

    ORM-SqlRepoEx 是 .Net平台下兼容.NET Standard 2.0,一个实现以Lambda表达式转转换标准SQL语句,使用强类型操作数据的轻量级ORM工具,在减少魔法字串同时,通过灵 ...

  2. Istio最佳实践:在K8s上通过Istio服务网格进行灰度发布

    Istio是什么? Istio是Google继Kubernetes之后的又一开源力作,主要参与的公司包括Google,IBM,Lyft等公司.它提供了完整的非侵入式的微服务治理解决方案,包含微服务的管 ...

  3. 轻量ORM-SqlRepoEx介绍

    轻量级 ORM-SqlRepoEx 介绍 SqlRepoEx是 .Net平台下兼容.NET Standard 2.0人一个轻型的ORM.解决了Lambda转Sql语句这一难题,SqlRepoEx使用的 ...

  4. 对标 Spring Boot & Cloud ,轻量框架 Solon 1.4.8 发布

    Solon 是一个轻量的Java基础开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Job.Micro service.WebS ...

  5. 对标 Spring Boot & Cloud ,轻量框架 Solon 1.4.12 发布

    Solon 是一个轻量的Java基础开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Job.Micro service.WebS ...

  6. 对标 Spring Boot & Cloud ,轻量框架 Solon 1.4.14 发布

    Solon 是一个轻量的Java基础开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Job.Micro service.WebS ...

  7. 对标 Spring Boot & Cloud ,轻量框架 Solon 1.5.2 重要发布

    Solon 是一个轻量的Java基础开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Job.Micro service.WebS ...

  8. 对标 Spring Boot & Cloud ,轻量框架 Solon 1.5.8 发布

    Solon 是一个轻量的Java基础开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Job.Micro service.WebS ...

  9. Snack3 3.2 发布,轻量的Json+Jsonpath框架

    Snack3 是一个轻量的 JSON + Jsonpath 框架. 借鉴了 Javascript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计.其下一切数据都以ONode表 ...

随机推荐

  1. 20145104张家明 《Java程序设计》第5周学习总结

    20145104张家明 <Java程序设计>第5周学习总结 教材学习内容总结 第八章(概括为一下内容) 1.如果父类异常对象在子类异常前被捕捉,则catch子类异常对象的区块将永远不会被执 ...

  2. linux第八周

    进程的切换和系统的一般执行过程 一.进程调度与进程切换 1.不同的进程有不同的调度需求 第一种分类: I/O密集型(I/O-bound)频繁的进行I/O通常会花费很多时间等待I/O操作的完成CPU密集 ...

  3. 《Effective Java 2nd》第7章 方法

    目录 第38条 检查参数的有效性 第39条 必要时进行保护性拷贝 第40条 谨慎设计方法签名 第41条 慎用重载 第42条 慎用可变参数 第43条 返回零长度的数组或集合,而不是null 第44条 为 ...

  4. 记录web api的request以及response(即写log)

    https://www.cnblogs.com/felixnet/p/5689501.html https://blog.csdn.net/Vblegend_2013/article/details/ ...

  5. UVa 10791 最小公倍数的最小和(唯一分解定理)

    https://vjudge.net/problem/UVA-10791 题意: 输入整数n,求至少两个正整数,使得它们的最小公倍数为n,且这些整数的和最小. 思路: 首先对n进行质因数分解,举个例子 ...

  6. java中字面量,常量和变量之间的区别(附:Integer缓存机制)

    一.引子 在各种教科书和博客中这三者经常被引用,今天复习到内存区域,想起常量池中就是存着字面量和符号引用,其实这三者并不是只在java中才有,各个语言中都有类似的定义,所以做一下总结,以示区分. 二. ...

  7. Ant是什么

    Ant是什么? 一.总结 一句话总结: 编译 打包 测试 工具 xml Ant是Java的生成工具,是Apache的核心项目: Ant类似于Unix中的Make工具,都是用来编译.生成: Ant是跨平 ...

  8. php--------网页开发实现微信JS的(定位,地图显示,照片选择功能)

    今天说说微信网页开发中一下JS的功能,分享一下,希望对各位有所帮助. 前提:要有公众号,和通过微信认证,绑定域名,得到相应信息,appid,appsecret等. 微信开发文档:https://mp. ...

  9. js将json格式的list转换为按某个字段分组的map数组

    这几天做的微信公众号项目中,出现了需要将list分组显示的需求,解决方法如下 var data = [{ "id": "32b80b76-a81e-4545-8065-1 ...

  10. UVA-1612 Guess (贪心)

    题目大意:考试共有三道题,n个人,每个人对每道题的可能得分已知,现在已知考后排名情况,问排名合不合理. 题目分析:贪心.贪心策略:每处理一个排名,都让他的得分尽量高. # include<ios ...