一、金丝雀部署

Istio 的金丝雀发布和 Kubernetes 的金丝雀发布虽然都是用于逐步将新版本应用程序引入生产环境,但它们之间存在一些区别:

  1. 金丝雀发布管理方式

    • Istio 金丝雀发布:Istio 使用流量路由规则和分流功能,在服务之间进行流量分发控制,可以动态地将一部分流量引导到新版本的服务上,监控其性能表现,比如 Istio 的 VirtualService。
    • Kubernetes 金丝雀发布:Kubernetes 金丝雀发布通常采用 Deployment 对象的策略,通过逐步增加新版本 Pod 的副本数量,逐渐降低旧版本 Pod 的副本数量,来实现让新版本逐渐接收更多流量。
  2. 粒度

    • Istio 金丝雀发布:Istio 的金丝雀发布能够在更精细的层面上控制流量的分发,可以基于请求头、标签等条件进行流量路由,实现更灵活和细粒度的控制。
    • Kubernetes 金丝雀发布:Kubernetes 的金丝雀发布通常是根据 Pod 的副本数量来控制流量切换,对于多副本的部署来说,可能缺乏对流量细粒度控制的灵活性。
  3. 依赖性

    • Istio 金丝雀发布:Istio 的金丝雀发布依赖于 Istio 控制平面和 sidecar 代理,需要在 Istio 中配置相应的规则来实现金丝雀发布功能。
    • Kubernetes 金丝雀发布:Kubernetes 金丝雀发布是 Kubernetes 自身的功能,无需额外的服务网格或代理,仅依赖于 Kubernetes 的 Deployment 对象即可实现金丝雀发布。

总的来说,Istio 的金丝雀发布功能更加灵活和强大,可以提供更细粒度的流量控制和管理,但需要依赖 Istio 的服务网格架构。而 Kubernetes 的金丝雀发布功能相对简单直接,适合基本的金丝雀发布需求。

1、namespace加上label,pod自动注入sidecar

kubectl label ns canary istio-injection=enabled

2、VirtualService制定流量转发规则,将10%流量转到新版本

apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:name: httpserverspec:hosts:- httpserverhttp:- route:- destination:host: httpserversubset: v1weight: 90- destination:host: httpserversubset: v2weight: 10---apiVersion: networking.istio.io/v1alpha3kind: DestinationRulemetadata:name: httpserverspec:host: httpserversubsets:- name: v1labels:version: v1- name: v2labels:version: v2

或者匹配HTTP Header,将匹配成功的流量转到新版本,否则转到老版本

apiVersion: networking.istio.io/v1beta1kind: VirtualServicemetadata:name: vservicespec:hosts:- httpserverhttp:- match:- headers:user:exact: tomroute:- destination:host: httpserversubset: v2- route:- destination:host: httpserversubset: v1

二、流量镜像

流量镜像,也称为影子流量,是一个以尽可能低的风险为生产带来变化的强大的功能。 镜像会将实时流量的副本发送到镜像服务。客户端匹配到请求v1版本的服务,镜像同时会将发往v1服务的请求拷贝发往v2版本,这些被镜像的流量是即发即弃的,就是说镜像请求的响应会被丢弃,不会将v2的响应返回客户端。

apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:name: vservicespec:hosts:- httpserverhttp:- match:- headers:user:exact: tomroute:- destination:host: httpserversubset: v1mirror:host: httpserversubset: v2- route:- destination:host: httpserversubset: v1