多集群灰度发布¶
多集群灰度发布的实现逻辑是,通过在不同集群部署不同的业务应用,然后通过服务网格配置相应的策略实现业务版本之间流量调整,然后根据运行情况下线版本。
前置准备,参考网格多云部署文档,搭建网格基础设施。
创建 demo 应用并且验证流量¶
集群部署 v1 版本 helloworld¶
首先选择一个命名空间(gray-demo),并且在网格页面开启该命名空间边车注入。
在应用工作台部署应用,在这里我们以 istio 的 helloworld 为例。

选择对应集群(mdemo-cluster2)与命名空间,并且配置工作负载基本信息。

- 选择镜像:docker.m.daocloud.io/istio/examples-helloworld-v1
 - 版本:latest
 
配置服务信息:
- 访问类型:集群内访问
 -  
端口配置
- 协议:TCP
 - 名称:http-5000
 - 容器端口:5000
 - 服务端口:5000
 
 


为了区分不同版本的工作负载,需要在 容器管理平台 找到对应的工作负载,点击 标签与注解 ,给容器组标签添加键值对: "version":"v1"


集群部署 v2 版本 helloworld¶
注意服务命名与命名空间必须相同。
首先选择上面一致命名空间(gray-demo),并且在网格页面开启该命名空间边车注入。
部署流程与上面一样,其主要区别是:
- 镜像发生了变化: 
docker.m.daocloud.io/istio/examples-helloworld-v2 - 在容器平台给相应 容器组标签 加上 label "version":"v2"
 
部署灰度应用策略¶
多集群目标规则¶
首先创建 DestinationRule,通过定义 SubSet 定义不同集群的业务版本。
其标签键值对为上文中添加的容器组标签: version: 
策略:必须开启 Istio 双向 TLS


必须开启 Istio 双向 TLS 模式

目标规则 YAML 如下:
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: helloworld
  namespace: gray-demo
spec:
  host: helloworld
  subsets:
    - labels:
        version: v1
      name: v1
      trafficPolicy:
        tls:
          mode: ISTIO_MUTUAL
    - labels:
        version: v2
      name: v2
      trafficPolicy:
        tls:
          mode: ISTIO_MUTUAL
  trafficPolicy:
    tls:
      mode: ISTIO_MUTUAL
通过 ingress 暴露服务¶
首先需要创建一条网关规则:

网关规则 YAML 如下:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: gray-demo-gateway
  namespace: gray-demo
spec:
  selector:
    istio: ingressgateway # (1)!
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - "*"
- use istio default controller
 
然后配置访问服务所需的虚拟服务规则。


虚拟服务 YAML 如下:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: gray-demo-vs
  namespace: gray-demo
spec:
  gateways:
    - gray-demo-gateway
  hosts:
    - "*"
  http:
    - name: http-5000
      route:
        - destination:
            host: helloworld.gray-demo.svc.cluster.local
            port:
              number: 5000
            subset: v1
          weight: 80
        - destination:
            host: helloworld.gray-demo.svc.cluster.local
            port:
              number: 5000
            subset: v2
          weight: 20
验证¶
INGRESS_LB_IP 是指 Ingress 网格负载均衡地址,可以在容器管理平台中查看,如果没有有效的负载均衡 IP 可以通过 NodePort 方式访问。

(由于容器管理平台界面无法直接查看外部 IP,因此使用控制台的能力查看)
在浏览器中访问: http://${INGRESS_LB_IP}/hello
确认其 v1 与 v2 版本的访问比例是否与上面策略的比例为 8:2
