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 Reference和Plugin 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 官方文档
来源:oschina
链接:https://my.oschina.net/kakablue/blog/3158177