应用网关说明

这篇文章将会介绍如何在 什么是应用网关, 以及应用网关的作用.

应用网关定义

在百度百科中, 网关的定义是这样子的: 网关(Gateway)就是一个网络连接到另一个网络的”关口”. 类似的, 应用网关是 Rainbond 中的一个组件(rbd-gateway), 它是外部流量流入应用的"关口". 也可以说是南北向流量中, 北向流量流向南向流量的一个”关口”.

应用网关的作用

在介绍应用网关的作用前, 首先需要提一下 Ingress. Kubernetes 官方对 Ingress 的介绍是: 在Kubernetes v1.1 中添加的 Ingress, 暴露了从集群外部到集群内服务的 HTTP 和 HTTPs 路由. 流量路由 Ingress 定义的策略控制.

注意, Ingress 只是定义了从集群外部到集群内服务的路由策略, 并没有实现这些策略. 

应用网关的作用就是实现 Ingress 中定义的各种策略. 除了 HTTP 和 HTTPs 路由外, 应用网关还提供了其他丰富的功能. 目前支持的功能有:

  • HTTP 和 HTTPs 策略
  • TCP/UDP 策略
  • 泛域名策略
  • 多种负载均衡算法
  • 高级路由: 根据访问路径, 请求头, Cookie, 权重的访问控制
  • 服务与域名访问情况监控

HTTP 和 HTTPs 策略

HTTP(HTTPs)策略是当前IT领域中最重要的服务访问策略,目前Rainbond对HTTP访问策略的支持如下:

  1. 路由规则 Rainbond对Http协议的路由规范进行标准化支持,Http路由规范主要以域名、Path、Header、Cookie为判断条件,Rainbond只支持对服务进行路由选择,不支持对服务的多个实例进行路由选择。需要对多实例进行负载控制时采用不同的负载均衡算法,比如一致性Hash负载均衡等。

基于路由规则可以有多种业务场景,例如:

  • 灰度发布场景

例如: www.example.com 20% 流量路由到服务A1-80端口

​ www.example.com 80% 流量路由到服务A2-80端口

  • 多服务聚合场景

例如 www.example.com/path1 流量路由到服务B-80端口

​ www.example.com/path2 流量路由到服务C-8080端口

  1. 高级参数

  2. 策略动态生效

策略配置的所有属性保存后自动在应用网关生效。

TCP/UDP 策略

在配置 TCP/UDP 策略的时候, 目前只支持端口的自定义, 自定义的端口默认绑定到网关所在服务器的所有绑定IP地址上。

企业版本中我们支持虚拟IP管理,即TCP策略可以通过绑定虚拟IP实现多个IP可用。

泛域名策略

泛域名在实际使用中作用是非常广泛的, 为此, 应用网关也对泛域名进行了支持. 泛域名有不少的作用:

  • 可以让域名支持无限的子域名(这也是泛域名解析最大的用途)
  • 防止用户错误输入导致的应用不能访问的问题
  • 可以让直接输入网址的用户输入简洁的网址即可访问应用
  • 在域名前添加任何子域名,均会被解析到同一个 IP

负载均衡

为了保证应用的高可用, 以及提高应用的性能, 我们一般会为应用部署多个实例. 这时候, 就必须要考虑负载均衡了. 应用网关目前默认的负载均衡算法是轮询, 也是目前支持的唯一一种负载均衡算法 . 当然, 在下个版本中将会支持更多的负载均衡算法.

轮询(Round Robin): 为第一个请求选择列表中的第一个服务器, 然后按顺序向下移动列表直到结尾, 然后循环.

高级路由(A/B 测试, 灰度发布)

只有 HTTP 或 HTTPs 策略才支持高级路由, TCP/UDP 策略不支持高级路由. 在应用网关中的高级路由是指, 通过设置策略中的path, cookie, header权重, 让同一个域名可以访问不同的应用.

高级路由主要是为 A/B 测试(A/B testing) 和 灰度发布(金丝雀部署, canary deployments) 服务.

A/B 测试

A/B 测试的本质是一个实验, 它将应用的两个或多个版本(变体)随机地显示给用户, 通过统计分析确认能够在给定指标中胜出的版本(变体).

我们可以在应用网关中, 为各个版本的应用配置域名相同, 但是cookie, header 或 权重不同的策略, 让用户通过同一个域名访问不同版本的应用. 然后对数据进行统计分析, 找出在给定指标下的胜者, 从而实现 A/B 测试.

灰度发布

灰度发布是将版本部署到服务器子集的模式. 首先将版本部署到一小部分服务器,对其进行测试,然后将版本扩散到其余服务器灰度发布可作为预警指示,对停机时间影响较小:如果灰度发布失败了,其余服务器不会受到影响.

为了实现灰度发布所要的效果, 我们只需为灰度发布的服务器分配较小的权重, 然后再慢慢地扩散, 增加权重.