灰度发布、蓝绿部署、金丝雀都是啥?( 三 )

Ingress-Nginx配置Ingress Annotations实现金丝雀发布
Ingress-Nginx 支持配置 Ingress Annotations 来实现不同场景下的金丝雀发布 。Nginx Annotations 支持以下 4 种 Canary 规则:

  • nginx.ingress.kubernetes.io/canary-by-header:基于 Request Header 的流量切分,适用于灰度发布以及 A/B 测试 。当 Request Header 设置为 always时,请求将会被一直发送到 Canary 版本;当 Request Header 设置为 never时,请求不会被发送到 Canary 入口;对于任何其他 Header 值,将忽略 Header,并通过优先级将请求与其他金丝雀规则进行优先级的比较 。
  • nginx.ingress.kubernetes.io/canary-by-header-value:要匹配的 Request Header 的值,用于通知 Ingress 将请求路由到 Canary Ingress 中指定的服务 。当 Request Header 设置为此值时,它将被路由到 Canary 入口 。该规则允许用户自定义 Request Header 的值,必须与上一个 annotation (即:canary-by-header)一起使用 。
  • nginx.ingress.kubernetes.io/canary-weight:基于服务权重的流量切分,适用于蓝绿部署,权重范围 0 - 100 按百分比将请求路由到 Canary Ingress 中指定的服务 。权重为 0 意味着该金丝雀规则不会向 Canary 入口的服务发送任何请求 。权重为 100 意味着所有请求都将被发送到 Canary 入口 。
  • nginx.ingress.kubernetes.io/canary-by-cookie:基于 Cookie 的流量切分,适用于灰度发布与 A/B 测试 。用于通知 Ingress 将请求路由到 Canary Ingress 中指定的服务的cookie 。当 cookie 值设置为 always时,它将被路由到 Canary 入口;当 cookie 值设置为 never时,请求不会被发送到 Canary 入口;对于任何其他值,将忽略 cookie 并将请求与其他金丝雀规则进行优先级的比较 。

灰度发布、蓝绿部署、金丝雀都是啥?

文章插图
 
注意:金丝雀规则按优先顺序进行如下排序:canary-by-header - > canary-by-cookie - > canary-weight很显然
canary-weight是一种随机策略 。
canary-by-cookie和canary-by-header-value适合后端金丝雀发布实现
canary-by-cookie适合前端金丝雀发布实现 。
apiVersion: extensions/v1beta1kind: Ingressmetadata:name: demo-canaryannotations:kubernetes.io/ingress.class: nginxnginx.ingress.kubernetes.io/canary: "true"nginx.ingress.kubernetes.io/canary-by-header: "canary"nginx.ingress.kubernetes.io/canary-by-cookie: "canary"spec:rules:- host: demo-api.fulu.comhttp:paths:- backend:serviceName: demo-api-canaryservicePort: 80具体流程
  • 如果是第一次发布,必须是正常版本 。
  • 如果发布金丝雀版本,则先检测是否有-canary后缀的ingress、service、deployment,如果有则替换金丝雀版本的镜像,如果没有则创建-canary后缀的ingress、service、deployment 。
  • 如果发布正常版本,则先检测是否有-canary后缀的ingress、service、deployment,如果有则先删除它们,再替换正常版本的镜像 。
蓝绿部署实现: https://www.cnblogs.com/itzgr/p/14602827.html
以上这些方式只是实现了一种非常简单的金丝雀发布流程,是没有办法做更精细,比如说按用户信息去灰度的规则的 。对于同一个用户,也有可能一次请求到了金丝雀中,下一次请求又到了正式环境中 。假如需要更加精细的灰度规则,可以考虑采用spring cloud, istio等工具
istioKubernetes 中的金丝雀部署
假设我们有一个已部署的 helloworld 服务 v1 版本,我们想要测试(或简单上线)新版本 v2 。使用 Kubernetes,您可以通过简单地更新服务的 [Deployment] 中的镜像并自动进行部署来[上线]新版本的 helloworld 服务 。如果我们特能够小心保证在启动并且在仅启动一个或两个 v2 副本[暂停]上线时有足够的 v1 副本运行,则能够保持金丝雀发布对系统的影响非常小 。后续我们可以观察效果,或在必要时进行[回滚] 。最好,我们也能够对 Deployment 设置 [HPA],在上线过程中减少或增加副本以处理流量负载时,也能够保持副本比例一致 。
尽管这种机制能够很好工作,但这种方式只适用于部署的经过适当测试的版本,也就是说,更多的是蓝/绿发布,又称红/黑发布,而不是 “蜻蜓点水“ 式的金丝雀部署 。实际上,对于后者(例如,并没有完全准备好或者无意对外暴露的版本),Kubernetes 中的金丝雀部署将使用具有[公共 pod 标签]的两个 Deployment 来完成 。在这种情况下,我们不能再使用自动缩放器,因为是有由两个独立的自动缩放器来进行控制,不同负载情况下,副本比例(百分比)可能与所需的比例不同 。


推荐阅读