5 分钟轻松上手 Higress 金丝雀发布

63 阅读3分钟

背景

Higress 是阿里巴巴开源的云原生网关,基于 Istio + Envoy 为核心构建,实现了流量网关 + 微服务网关 + 安全网关三合一的高集成能力,深度集成 Dubbo、Nacos、Sentinel 等微服务技术栈。

关于 Higress 具体的介绍,您可以查阅 Higress 文档

在早期的部署架构,业务通常采用 WAF 安全防护网关 + Nginx 流量网关 + Spring Cloud Gateway 微服务网关 实现。

一次用户请求 -> LB(WAF) -> Nginx -> Spring Cloud Gateway -> 微服务

这样导致在链路分析和日常维护上带来复杂性。因此,我们尝试引入 Higress 网关,去除 Spring Cloud Gateway 的依赖,将请求链缩短如下。

一次用户请求 -> LB(WAF) -> Higress -> 微服务

目标

验证 Higress 网关能否替换 Spring Cloud Gateway,并实现 A/B 测试、金丝雀发布等功能。

部署

为方便维护,使用 Helm 部署 Higress 网关,代码片段如下。

helm install higress --create-namespace --namespace higress higress.io/higress

在 KubeSphere 查看已部署的工作负载,可以看到 Higress 分别创建了 higress-gateway 访问入口、higress-console 控制台和 higress-controller 控制器。

调整 higress-gateway 控制台的服务端口为 80,对外统一访问这个端口。

调整 higress-console 控制台的服务端口为 8080,初始用户密码为 admin/admin

使用

本文只讲解最基本的配置流程,不涉及域名和证书的配置步骤。

配置服务来源

Higress 支持 NacosEurekaConsulZookeeper 等服务注册中心接入。

例如,下图使用 Nacos 2.x 版本配置。

查看服务列表,选择命名空间为 mcp,过滤出注册中心的服务。

配置路由列表

假设请求入口为 /api/auth,参考下图,配置为路由A。

如果实际的请求入口为 /demo/api/auth,期望后端请求到 /api/auth,则需要设置重写策略。

Higress 允许您添加多个路由,用于平替 Spring Cloud Gateway 的 API 路由策略。

验证 A/B 测试

Higress 通过注解 higress.io/canary 实现蓝绿发布、A/B 测试、金丝雀发布。

首先,保留上述配置的路由 A ,当请求不携带任何 Header、Cookies 时,默认请求到这个路由。

添加一个新的路由 B,使用 higress.io/canary-by-header 来控制。如下图,我们配置了 higress.io/canary-by-header=regionhigress.io/canary-by-header-value=gz|bj,当客户端在 HTTP 请求头中携带 region 参数值 gzbj 时,将请求路由到路由 B,否则路由到原来的路由 A。

使用 curl 命令,模拟请求,查看路由的请求情况。

curl --request GET http://10.2.2.109/api/auth

路由A
路由A
路由A
路由A

curl --request GET http://10.2.2.109/api/auth --header 'region: gz'

路由B
路由B
路由B
路由B

验证金丝雀发布

实现金丝雀发布场景,使用 higress.io/canary-weight 权重来控制,您可以参考下图,添加路由 C ,权重慢慢从 20 到 80,分流原来的路由 A。

使用 curl 命令,模拟请求,查看路由的请求情况。

> curl --request GET http://10.2.2.109/api/auth

路由A
路由A
路由A
路由C
路由A
路由C
路由C
路由C

总结

在引入 Higress 云原生网关后,我们去除了 Spring Cloud Gateway,并且可以很方便的实现 A/B 测试、金丝雀发布等场景。但是,目前的版本相对 APISIX 来说,存在一些不足:

  1. 单个路由不支持同时设置多个匹配规则,一个后端服务可能存在多个 API 路径,如果 API 规则太多,维护就变得比较困难。APISIX 允许你设置多个匹配规则。
  2. 路由不支持 APISIX 的上线、下线,使用灰度发布场景,需要手动删除。
  3. 不支持静态资源代理,只能把静态资源打包为 Pod 暴露出去,而 APISIX 可以通过 Nginx 底层配置实现。