名词说明
云原生 API 网关:一款面向云原生场景设计的统一流量入口产品,兼容 Kubernetes Ingress 标准,集成了 API 管理、流量转发、微服务访问控制及安全防护等能力,帮助用户快速构建安全、稳定的访问体系。
泳道:用于为同一业务应用划分独立的运行隔离单元。只有满足灰度路由规则的请求,才会被引导至对应泳道中的标记应用实例。应用与泳道之间支持多对多关系,便于灵活组织复杂的灰度场景。
泳道组:用于对多个泳道进行统一归类和管理,通常用于区分不同团队、业务线或使用场景下的灰度环境。
基线环境:用于承载未参与灰度的应用实例,作为默认流量承载环境。当请求未命中任何灰度规则时,将自动路由至基线环境。
请求唯一标识:请求会携带此字段以标识请求唯一性,例如 x-trace-id、request-id。
场景示例
本文通过模拟真实的服务调用链路,演示如何基于云原生 API 网关实现全链路灰度。整个过程中无需修改业务代码,仅需在入口应用配置流量规则,相关流量标签即可在调用链路中自动透传。在服务调用过程中,命中规则的请求将优先路由至对应的灰度应用;当链路中某一环节不存在匹配的灰度应用时,请求将自动回退至基线应用,确保业务的连续性和稳定性。
各测试应用如下所示:
创建sla、slb和slc三个应用,镜像都选择 Golang 的 cae-demo。sla 应用创建灰度应用 sla-g1,sla-g2,slb 应用创建灰度应用 slb-g2,slc 应用创建灰度应用 slc-g1,slc-g2。以上基线应用和灰度应用都开启 K8s Service服务注册发现,都打开服务治理(服务网格)。
| 基线应用 | 灰度应用 | 灰度标签 |
|---|---|---|
| sla | sla-g1 | cae.service.tag:g1 |
| sla-g2 | cae.service.tag:g2 | |
| slb | slb-g1 | cae.service.tag:g1 |
| slc | slc-g1 | cae.service.tag:g1 |
| slc-g2 | cae.service.tag:g2 |
正常流量调用链路:
云原生 API 网关 -> 应用 sla -> 应用 slb -> 应用 slc。
标签流量调用链路:
x-cae-traffic-tag=g1 流量:云原生 API 网关 -> 应用 sla-g1 -> 应用 slb-g1 -> 应用 slc-g1。
x-cae-traffic-tag=g2 流量:云原生 API 网关 -> 应用 sla-g2 -> 应用 slb -> 应用 slc-g2。
前提条件
已部署应用。
基线应用、灰度应用已开启服务治理(服务网格)。
已开通云原生 API 网关,云原生 API 网关实例和应用需要在同一 VPC 中。
操作步骤
部署基线应用并开通服务治理
创建 sla、slb、slc 三个基线应用。
在 CAE 应用列表中,在顶部选择目标地域和命名空间,点击创建应用。
在镜像选择中,选择 Golang -> cae-demo。
在“服务注册发现”中,打开“基于K8s Service服务注册发现”,服务名称分别填写 sla、slb、slc,端口和容器端口都填 8080,协议选择 TCP。
在“微服务治理中”中,打开“服务网格”。
点击“创建应用”。
部署灰度应用
基于基线应用部署灰度应用:
其中基线应用 sla 部署两个灰度应用,分别为 sla-g1 应用和 sla-g2 应用。
其中基线应用 slb 部署一个灰度应用,为 slb-g1。
其中基线应用 slc 部署两个灰度应用,分别为 slc-g1 应用和 slc-g2 应用。
具体操作步骤,如下:
在 CAE 应用列表中,找到刚才创建的基线应用,点击右侧的省略号,再点击“创建灰度应用”。
根据实际情况,灰度标签填写 g1 或者 g2。
在服务注册发现中,打开“基于 K8s Service 服务注册发现”,服务名称分别填写 sla-g1、sla-g2、slb-g1、slc-g1、slc-g2,端口和容器端口都填 8080,协议选择 TCP。
灰度应用,默认会跟踪基线应用开启相应的微服务治理功能。
点击“创建应用”。
创建云原生API网关路由
假设 sla 为入口应用,分别为 sla、sla-g1、sla-g2 创建路由。三条路由名称分别为 sla、sla-g1、sla-g2。实现全链路灰度流量的第一跳。
在 CAE 控制台左侧菜单栏的流量管理中点击“网关路由”。
在顶部选择目标地域和命名空间,点击“创建路由“。
路径选择前缀,填写”/”。
点击更多匹配规则,sla 路由的优先级设置为 0。sla-g1 路由的优先级设置为 1,请求头添加 x-cae-traffic-tag=g1。sla-g2 路由的优先级设置为 1,请求头添加 x-cae-traffic-tag=g2。
使用场景选择“单服务”。
后端服务,sla 路由选择 sla 应用、sla 服务、HTTP 协议、8080 服务端口。sla-g1 路由选择 sla-g1 应用、sla-g1 服务、HTTP 协议、8080 服务端口。sla-g2 路由选择 sla-g2 应用、sla-g2 服务、HTTP 协议、8080 服务端口。
在列表页,三条路由分别操作上线。
创建泳道组
在 CAE 控制台左侧菜单栏的流量管理中点击“全链路灰度”。
在顶部选择目标地域和命名空间,点击“创建泳道组“。
版本类型选择“服务网格”。
入口类型选择”云原生API网关”。
泳道组涉及应用,选择 sla、slb、slc。
请求唯一标识,填写 request-id。
创建泳道
该示例,需要创建两条泳道 g1、g2。
在 CAE 控制台左侧菜单栏的流量管理中点击“全链路灰度”。
在顶部选择目标地域和命名空间,选择对应的泳道组。
点击“创建泳道”。
泳道名称分别填写 g1、g2。
泳道标签选择 g1、g2,系统会自动匹配灰度应用。
灰度模式,选择“按请求头灰度”。
结果验证
可在云原生 API 网关控制台,在左侧菜单栏找到“API”。
点击“cae-http-api”进入详情页,找到路由“sla”,在右侧操作选项中,点击“更多”、“调试”,进入调试页面。
请求路径填写“/a”。
Request Headers,添加两个请求头:request-id=1,x-cae-traffic-tag=g1。
点击发送请求。
微服务治理可观测
在网格服务治理页面,右侧的看板可以看到,x-cae-traffic-tag 在不传时,sla、slb、slc 会路由到基线应用。x-cae-traffic-tag 传 g1 时,sla、slb、slc 会路由到 g1 灰度应用。x-cae-traffic-tag 传 g2 时,sla、slc 会路由到 g2 灰度应用,而 slb 会路由到基线应用。