Ambassador 0.52 新特性:会话亲和性、负载均衡控制、gRPC

Stella981
• 阅读 453

Ambassador 0.52 新特性:会话亲和性、负载均衡控制、gRPC

本文由公众号EAWorld翻译发表,转载需注明出处。

作者:Richard Li

译者:白小白

原文:http://t.cn/E6cZoyG

现时的云原生应用由多种异构的服务或者微服务组成,服务间、服务与客户端之间的通信需要跨越浩繁的通信协议和拓扑结构。Ambassador就是部署在这样不断增长的异构的工作负载环境之下,也因此我们对于这种境况有着直接的认知。

我们着力于将Ambassador打造成全球最棒的云原生API网关。为此,我们很兴奋可以发布Ambassador的0.52版本,并在新版中新增了如下的新能力:

  • 支持gRPC-Web协议。gRPC-Web基于原生的gRPC,其设计主旨服务于浏览器/服务器通信。在此要对 Gert van Dijk 和 Rotem Tamir 的工作表示感谢。

  • 支持先进的负载均衡控制。现在的Ambassador可以原生支持向物理IP地址的流量路由,而非DNS主机名称。

  • 支持会话亲和性(即粘滞会话)。Ambassador可以基于Cookie、HTTP头或者来源IP地址,将来自同一个终端用户的HTTP请求归集到一个特定的Kubernetes Pod里。

由于实施了一些架构迁移的工作,对会话亲和性和先进的负载均衡控制的支持还属于抢先版本状态,稍后将会介绍。

一、gRPC-Web支持

今时今日的云服务通过大批的通信协议进行暴露。Ambassador几乎支持流行的7层协议的每一层,包括HTTP,HTTP/2,gRPC,WebSocket,以及最新支持的gRPC-Web。并且,即使开发者所使用的协议并不被直接支持,Ambassador也支持原生的TCP路由方式。

gRPC-Web协议面向前端开发者提供了很多的便利:高性能,双向的流式通信以及广泛的类库支持。由于浏览器的限制 ,gRPC-Web并不与gRPC直接兼容。但可以设置服务端代理来解决在gRPC-Web请求和gRPC HTTP/2响应之间的翻译转换问题。

感谢Envoy对于gRPC-Web的支持,Ambassador现在可以通过设置 enable_grpc_web: True注解来支持gRPC-Web。需要注意的是,这是一个全局设定。

二、先进的负载均衡控制

Ambassador一直提供广泛的路由选项,可以基于主机、HTTP方法、HTTP头,可以采用正则表达式等等。我们知道,对路由施加灵活的细粒度的控制 对适应广泛的使用场景至关重要。但目前Ambassador仅为运维人员提供了有限的控制,来将请求路由到不同的endpoint。过去,Ambassador直接将请求路由到Kubernetes service,由后者将请求分发到不同的Pod。这种方案工作良好,便于推理和测试。对Kubernetes service的Curl请求遵循与Ambassador请求同样的路由路径。

Kubernetes网络

在一个典型的Kubernetes集群中,由kube-proxy路由Kubernetes service请求。稍显困扰的是,kube-proxy并不是典型形态的代理,只是基于iptables规则为service实现虚拟IP的一个进程。这种架构为路由带来了额外的复杂性:不仅引入了少量的延迟,而且iptables并不是为路由设计的,因此负载均衡策略受限于轮询的调度模型。

尽管存在实现的复杂性,这样的方案仍旧为Ambassador使用者提供了压倒性的优势:简便性。服务发现和负载均衡都交给Kubernetes解决,可以很直接的使用类似Curl这样的常规工具进行路由的测试。

Ambassador 0.52的负载均衡

在Ambassador 0.52版本中,我们引入了一套新的负载均衡控制机制。相关的控制选项是可选的,所以如果不做任何设置的变动,将以原本行之有效的方式来实施负载均衡控制。如果设置了AMBASSADOR_ENABLE_ENDPOINTS环境变量,将会启用新的控制机制:

  • Ambassador会监视所有Kubernetes endpoint的状态变更,而不仅仅关注Kubernetes service本身。

  • 有了这些状态信息,Ambassador可以基于设置来使用不同的负载均衡算法,绕过Kube-proxy将请求直接路由到Kubernetes endpoint。

以下的示例映射表展现了我们如何添加load_balancer注解:

apiVersion: ambassador/v1

需要注意的是,可以在Ambassador模块中添加注解,来使默认的负载均衡策略全局有效。

会话亲和性

除了默认的round_robin策略,Ambassador 0.52还可以基于ringhash策略支持会话亲和性(即“粘滞会话”)。在此过程中需要为路由指定客户端的唯一标识。可以支持任意的HTTP头,Cookie或者实际的来源IP地址。

抢先版本

我们在0.52中将先进的负载均衡控制机制作为抢先版本发布,以进行更广泛的测试并收集反馈。我们尤其感兴趣的是,在不同的工作负载和Kubernetes集群环境下,启用这一特性有怎样的效果。我们希望 endpoint数多于service数,这样就可以对Kubernetes的API服务器产生持续增长的工作负载。我们热切的期待你的反馈,无论是积极的或者是负面的都可以,只要是关于这一特性的。

三、Ambassador 0.52版本的其他改变

在新版的Ambassador中,我们还提供了对大量的用户反馈Bug的修复,并提供了诸多的加强。


  • Ambassador现在支持HTTP/1.1请求和gRPC后端服务之间的桥接。

  • 在使用HTTP API的时候,为extauth过滤器添加了一个tracing header。(在使用gRPC API的时候,已经添加了这样的tracing header)

  • 允许extauth建立原本不存在的header(#1313)。

  • 可以使用Lua过滤器,在映射中嵌入简单的脚本。鸣谢Liam Costello的贡献。

  • 启动性能改进。

  • 使用C YAML解析器代替Python实现以改进解析性能(#1294,#1318)

  • 加入xff_num_trusted_hops设置。如果用户使用了如CloudFlare这样的CDN服务,并且依赖X-Forwarded-For header来应对流量限速的使用场景,提供这样的设置将十分重要。

更新的核心设置文档覆盖了上面提到的新的选项(如Lua,gRPC HTTP/1.1 桥接等)。

四、即将到来的0.60中的重大变更

Ambassador 0.60将默认在8080端口侦听明文HTTP请求(取代原来的80端口),在8443端口侦听HTTPS请求(取代原来的443端口),以便在没有Root权限的情况下简化Ambassador的运行。如果你的现存服务依赖上述默认端口,需要修改相关的配置文件,Ambassador 0.52会在诊断服务中提出警报。

五、安装Ambassador 0.52

可以通过下面的Docker标签获得Ambassador 0.52版本:

quay.io/datawire/ambassador:0.52.0

通过标签更新现有的部署清单,kubectl会将0.52版本安装到集群中。

也可以通过Helm安装:

helm install stable/ambassador

















 
 
 

六****、升级到Ambassador 0.52


Ambassador的更新依赖Kubernetes的部署。在更新Ambassador之前,需要将Kubernetes部署清单指向quay.io/datawire/ambassador:0.52.0然后基于更新后的清单运行kubectl。Kubernetes会以滚动更新的方式将Ambassador更新到0.52版本。


七****、后续

如果你在更新过程中遇到任何问题,可以发issue或者加入我们的Slack求助。

提交Issue的地址:https://github.com/datawire/ambassador/ 加入Slack的地址:http://d6e.co/slack

如果Ambassador工作良好,我们也很乐于得到这样的消息。可以在文末或者在我们的推特账号@getambassadorio留言。


Ambassador 0.52 新特性:会话亲和性、负载均衡控制、gRPC关于EAWorld:微服务,DevOps,数据治理,移动架构原创技术分享,长按二维码关注

EAWorld《架构世界》2019年刊已在亚马逊kindle诚意上架,亦可关注公众号EAWorld发送关键词“架构世界”下载。

Ambassador 0.52 新特性:会话亲和性、负载均衡控制、gRPC

Ambassador 0.52 新特性:会话亲和性、负载均衡控制、gRPC Ambassador 0.52 新特性:会话亲和性、负载均衡控制、gRPC Ambassador 0.52 新特性:会话亲和性、负载均衡控制、gRPC Ambassador 0.52 新特性:会话亲和性、负载均衡控制、gRPC Ambassador 0.52 新特性:会话亲和性、负载均衡控制、gRPC

左右滑动查看更多

本文分享自微信公众号 - EAWorld(eaworld)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这