基于Kong实施灰度发布

编程

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 官方文档

以上是 基于Kong实施灰度发布 的全部内容, 来源链接: utcz.com/z/512702.html

回到顶部