本文基于真实企业级 SSO 系统的部署实践,详细说明如何通过 Helm 配置和 Kong 网关实现安全、可控的 A/B 测试与金丝雀发布。


一、整体架构

正常流量

带 X-Canary: test 头

用户浏览器

Kong API 网关

SSO-App 生产实例

SSO-App-A/B 测试实例

统一身份认证服务

  • A/B 测试:通过 X-Canary: test 请求头控制是否进入新版本
  • 金丝雀部署:API 网关将特定路径的流量按规则路由到测试实例
  • 身份认证:由独立的身份服务统一处理(无需为 A/B 单独配置)

二、A/B 测试配置详解

2.1 部署独立的 A/B 实例

创建独立的 Helm values 文件(如 values-prod-ab.yaml):

serviceName: "sso-app-abtest"  # ⚠️ 必须与生产实例不同名
image:
  repository: your-registry/sso-app
  tag: v2.1.0-canary           # 新版本镜像
configmap:
  MODE: prod
  # 其他配置与生产环境保持一致

操作步骤

  1. 复制生产 values.yamlvalues-prod-ab.yaml
  2. 修改 serviceName*-abtest
  3. 更新 image.tag 为待测试版本
  4. 通过 Helm 部署测试实例:
    helm upgrade --install sso-app-abtest \
      -f values-prod-ab.yaml \
      ./sso-app-chart
    

三、金丝雀流量路由配置

3.1 API 网关插件配置

在需要 A/B 测试的路由下添加金丝雀插件(以 Kong 为例):

routes:
- name: auth-routes
  paths:
    - /saml
    - /ui/auth
  plugins:
  - name: canary
    config:
      upstream: http://sso-app-abtest        # A/B 实例的内部地址
      canary_by_header: X-Canary             # 触发 Header 名
      canary_by_header_value: test           # 触发值

🔍 工作原理

  • 当请求携带 X-Canary: test 时,网关将流量转发到 sso-app-abtest
  • 否则,走默认上游 sso-app-prod

3.2 完整路由示例

services:
- name: sso-app
  url: http://sso-app-prod.namespace.svc.cluster.local
  routes:
  - name: main-routes
    paths:
      - /public/
      - /ui/
    plugins:
    - name: canary
      config:
        upstream: http://sso-app-abtest
        canary_by_header: X-Canary
        canary_by_header_value: test

验证方法

# 正常流量
curl -H "Host: sso.example.com" https://<gateway-ip>/ui/auth

# A/B 测试流量
curl -H "Host: sso.example.com" \
     -H "X-Canary: test" \
     https://<gateway-ip>/ui/auth

四、身份认证服务说明

身份认证服务(如 OAuth2 / SAML IdP)无需为 A/B 测试做任何修改,因为:

  • 所有登录请求都经过同一套认证流程
  • A/B 差异仅体现在应用层的 UI 或业务逻辑
  • Token 和 Session 格式保持兼容

典型配置只需关注:

configmap:
  ISSUER_URL: "https://auth.example.com"
  CALLBACK_URL: "https://sso.example.com/callback"

五、标准操作流程

步骤 1:准备 A/B 版本

# 1. 创建 A/B 配置
cp values-prod.yaml values-prod-ab.yaml
# 2. 修改 serviceName 和镜像版本
vim values-prod-ab.yaml
# 3. 部署 A/B 实例
helm upgrade --install sso-app-abtest -f values-prod-ab.yaml .

步骤 2:配置网关路由

# 1. 编辑网关配置,添加 canary 插件
vim gateway-config.yaml
# 2. 应用配置
kubectl apply -f gateway-config.yaml

步骤 3:验证与发布

  • 内部测试:用 curl -H "X-Canary: test" 验证新功能
  • 用户测试:前端对特定用户会话注入 X-Canary: test
  • 全量发布:将 A/B 镜像版本同步到生产配置,移除网关的 canary 规则

六、生产环境关键注意事项

  1. 服务发现一致性
    A/B 实例必须正确注册到服务发现系统(如 Kubernetes Service),确保网关能解析其地址

  2. 会话与 Token 兼容性
    新旧版本必须能互相解析 Session/Cookie/Token,避免用户在切换时被登出

  3. 监控与指标分离
    在监控系统中区分生产实例和 A/B 实例的指标(如通过 service 标签)

  4. 回滚预案

    • 快速回滚:删除网关的 canary 插件配置(秒级生效)
    • 彻底回滚:卸载 A/B Helm Release 并清理资源

七、附录:通用配置模板

功能 配置文件 关键字段
A/B 实例部署 values-prod-ab.yaml serviceName, image.tag
金丝雀路由 gateway-config.yaml canary 插件配置
身份认证 idp-values.yaml ISSUER_URL, CALLBACK_URL
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐