基于 Kong 实施灰度发布

為{幸葍}努か 提交于 2020-02-26 03:42:10

Kong Canary 插件

用于程序的灰度发布

文档地址在这里 版本:商业版,或免费试用版

词汇表

  • plugin:在 Kong 向后端转发一个请求 之前/之后,可执行指定操作
  • Service:Kong中的实体(entity),代表一个后端API或微服务
  • Route:Kong中的实体(entity),代表一个转发规则
  • Consumer:Kong中的实体(entity),为向Kong发起请求的外部用户/服务
  • Credential:伴随 Consumer 的唯一字符串,也用于指代一个API key
  • upstream service:Kong 代理的业务 API/服务
  • API:代表后端服务的实体。CE 0.13.0 和 EE 0.32 后,更倾向用 Service 来替代 API

配置

在 Service 上配置 plugin

  • 当有数据库配合时 运行以下命令
$ curl -X POST http://kong:8001/services/{service}/plugins \
    --data "name=canary" 
  • 当没有数据库配合时 把以下内容加入配置文件
plugins:
- name: canary
  service: {service}
  config: 

{service}是plugin作用的服务 id/name,需要用实际值替换

对 Route 生效

  • 当有数据库配合时 运行以下命令
$ curl -X POST http://kong:8001/routes/{route}/plugins \
    --data "name=canary" 
  • 当没有数据库配合时 把以下内容加入配置文件
plugins:
- name: canary
  route: {route}
  config: 

同上,{route}是plugin作用的 Route id/name,需要用实际值替换

对 Consumer 生效

  • 当有数据库配合时 运行以下命令
$ curl -X POST http://kong:8001/consumers/{consumer}/plugins \
    --data "name=canary" 
  • 当没有数据库配合时 把以下内容加入配置文件
plugins:
- name: canary
  consumer: {consumer}
  config: 

同上,{consumer}是plugin作用的 Consumer id/username,需要用实际值替换。也可以把 consumer_id 和 service_id 连接在一起使用

对 API 生效

运行以下命令

$ curl -X POST http://kong:8001/apis/{api}/plugins \
    --data "name=canary" 

同上,{api}是plugin作用的 API id/name,需要用实际值替换

全局 Plugin

一个未关联任何 Service,Route,Consumer(或API)的plugin,将被视为是全局plugin,将作用于每个请求。 更多请参看Plugin ReferencePlugin Reference

参数

参数 参数说明 默认值
name plugin 名称
service.id plugin 目标 Service 的 ID
route.id plugin 目标 Route 的 ID
consumer.id plugin 目标 Consumer 的 ID
enabled 该 plugin 是否生效 true
api_id plugin 目标 API 的 ID
config.start 启动开始时间,单位:秒(当设置"百分比黑白名单"时该值无效)
config.duration transtition 持续时长阈值,单位:秒(当设置"百分比黑白名单"时该值无效) 3600
config.percentage 向新target导流的占比,设置后会覆盖 start和duration选项
config.steps 用于流量分bucket 1000
config.upstream_host 目标 target 的 hostname(当 upstream_uri/port 未设置时,强制需要该值)
config.upstream_fallback 当Canary Upstream无一健康target时,是否要fallback到原upstream (upstream_host必须指向一个有效的Kong Upstream实体) false
config.upstream_port 目标 port (当 upstream_uri/host 未设置时,强制需要该值)
config.upstream_uri 目标 Upstream URI (当 upstream_uri/host 未设置时,强制需要该值)
config.hash 用于hash计算的实体。可选:consumer,ip,none.当用none时,需设置trusted_ip(参看配置文件 trusted_ip,real_ip_header) consumer

使用

Canary用于将请求分流给两个upstreams服务:ServiceA 和 ServiceB

  • ServiceA:代表原upstream,地址用 service 实体定义
  • ServiceB:代表新upstream,地址用 config.upstream_host,config.upstream_port, 和/或 config.upstream_uri 定义

有三种操作模式

  • 向 ServiceB 导固定比例流量。 参看 config.percentage
  • 用 黑/白名单 指定 Consumers,向 ServiceB 导流
  • 设定一个周期(config.start 和 config.duration)进行导流

设置访问目标

(对黑/白名单无效)

Canary 通过定义 bucket(配置项config.steps)来做分流,如

  • config.steps=100,config.percentage=10%:会创建100个buckets,其中10个用于指向ServiceB,90个仍保持指向ServiceA

config.hash 决定某个请求落到哪一个bucket。

  • 当值为 consumer,ip 时,容易负载不均
  • 当值为 none 时,负载均匀,但同一用户请求会在A,B间跳跃 特殊情况,当consumer或ip无法甄别时,会按照 consumer->ip->none 的顺序 fallback 处理

Canary过程结束时操作

当Canary结束时,(无论是百分比设置为100%,还是时间到期),配置都需要更新。 (如果 plugin 配置在 route 上,当前 service 中所有 route 上的 carany 都要结束)

  • 更新 service 实体,使指向 ServiceB:设置 config.upstream_host,config.upstream_uri,config.upstream_port
  • 删除 Canary plugin

若在 Canary 结束前,移除/disable Canary plugin,会将流量全部导回 ServiceA

Upstream 健康检查

若设置 upstream_fallback ,当 ServiceB 的 upstream 无一健康时,会略过该 Canary

附录

https://docs.konghq.com/hub/kong-inc/canary/#finalizing-the-canary 官方文档

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!