更新时间:2024-01-02 GMT+08:00
分享

虚拟机服务灰度发布

虚拟机上部署ASM-PROXY,且网格化后,可以设置灰度策略实现简单的灰度发布。如下图所示,虚拟机1上部署httptest应用(原版本v1),虚拟机2上部署httptest-canary应用(灰度版本v2),配置v1版本、v2版本分别50%的流量比例。当容器服务访问虚拟机服务时,50%的请求将由v1版本响应,50%的请求由v2版本响应。

实现灰度发布的流程如下:

  1. 部署虚拟机服务灰度版本:在虚拟机2上部署httptest-canary应用,作为虚拟机服务灰度版本v2。
  2. 添加虚拟机服务灰度版本到网格:创建v2版本的WorkloadEntry、ServiceEntry,更新VirtualService和DestinationRule,并在其中配置基于流量比例的灰度策略。
  3. 访问虚拟机服务:容器服务通过服务名访问虚拟机服务,验证灰度策略是否生效。
  4. 移除虚拟机服务灰度版本:完成灰度发布后,更新VirtualService和DestinationRule,移除虚拟机服务灰度版本。

前提条件

  • 已执行添加虚拟机服务到网格,即已创建v1版本的WorkloadEntry、ServiceEntry,已创建VirtualService、DestinationRule。
  • 已准备虚拟机2,用来部署虚拟机服务灰度版本。

部署虚拟机服务灰度版本

此处以httptest-canary测试程序作为示例。httptest-canary为go http应用,监听在8080端口,访问正常返回“hello, canary http server”消息。

  1. 上传httptest-canary应用到虚拟机2。
  2. 修改权限。

    chmod +x httptest-canary

  3. 启动httptest-canary应用。

    ./httptest-canary

添加虚拟机服务灰度版本到网格

  1. 创建v2版本的WorkloadEntry。

    使用WorkloadEntry定义虚拟机服务的工作负载属性。

    1. 登录应用服务网格控制台,单击服务网格的名称,进入网格详情页面。
    2. 在左侧导航栏选择“网格配置”,单击“istio资源管理”页签。
    3. 选择“istio资源:workloadentries”,命名空间选择3中填写的命名空间“vmns”,单击“创建”。
    4. 输入以下内容:
      apiVersion: networking.istio.io/v1alpha3
      kind: WorkloadEntry
      metadata:
        name: "<vm-server1>-v2"
        namespace: "<NS>"
      spec:
        address: "<VM2_IP>"
        labels:
          app: <vm-server1>
          version: v2
        serviceAccount: "<SERVICE_ACCOUNT>"

      其中,<vm-server1>为虚拟机服务名称,<NS>为3中填写的命名空间,<VM2_IP>为虚拟机2的私有IP,<SERVICE_ACCOUNT>为3中填写的服务账号名称。

      示例:

    5. 单击“确定”完成创建。

  2. 更新DestinationRule。

    1. 登录应用服务网格控制台,单击服务网格的名称,进入网格详情页面。
    2. 在左侧导航栏选择“网格配置”,单击“istio资源管理”页签。
    3. 选择“istio资源:destinationrules”,命名空间选择“vmns”,选择创建DestinationRule中创建的DestinationRule,单击操作列的“编辑”,在spec.subsets下将原有列表复制后并列添加以下内容:
          - labels:
              version: v2
            name: v2

      示例:

    4. 单击“确定”完成修改。

  3. 更新VirtualService。

    1. 登录应用服务网格控制台,单击服务网格的名称,进入网格详情页面。
    2. 在左侧导航栏选择“网格配置”,单击“istio资源管理”页签。
    3. 选择“istio资源:virtualservices”,命名空间选择“vmns”,选择创建VirtualService中创建的VirtualService,单击操作列的“编辑”,区分两种情况:
      • 情况一:虚拟机服务未配置网关

        复制spec.http[0].route下的destination后,在下方并列位置添加以下内容:

                  weight: 50
                - destination:
                    host: <vm-server1>.<vmns>.svc.cluster.local
                    port:
                      number: 8080
                    subset: v2
                  weight: 50

        其中,<vm-server1>为虚拟机服务名称,<vmns>为3中填写的命名空间。配置v1、v2版本分别50%的流量比例。

        示例:

      • 情况二:虚拟机服务已配置网关

        复制spec.http[0].route下的destination后,在下方并列位置添加以下内容:

                  weight: 50
                - destination:
                    host: <vm-server1>.<vmns>.svc.cluster.local
                    port:
                      number: 8080
                    subset: v2
                  weight: 50

        复制spec.http[1].route下的destination后,在下方并列位置添加以下内容:

                  weight: 50
                - destination:
                    host: <vm-server1>.<vmns>.svc.cluster.local
                    port:
                      number: 8080
                    subset: v2
                  weight: 50

        其中,<vm-server1>为虚拟机服务名称,<vmns>为3中填写的命名空间。配置v1、v2版本分别50%的流量比例。

        示例:

    4. 单击“确定”完成修改。

访问虚拟机服务

如果虚拟机2未部署ASM-PROXY,未加入网格,要想正常访问到v2版本,需要配置关闭mTLS认证,即在vmns命名空间下的DestinationRule资源对象的spec下添加如下内容:

  trafficPolicy:
    tls:
      mode: DISABLE

  1. 在CCE集群中部署容器服务tomcat,具体操作请参见部署容器服务
  2. 在kubectl节点执行以下命令,获取tomcat工作负载的Pod名称。

    kubectl get pods -n <vmns>|grep tomcat

    回显示例:

    tomcat-75cbb4b948-nzrfs       2/2      Running   0      19h

  3. 多次执行以下命令,对虚拟机服务发起访问。

    kubectl exec -it <tomcat-xxx> -n <vmns> -- curl <vm-server1>.<vmns>.svc.cluster.local:8080

    其中,<vm-server1>为虚拟机服务名称,<vmns>为3中填写的命名空间。

    若交替回显“hello, http protocol server”和“hello, canary http server”,则访问虚拟机服务成功,并且配置的灰度策略生效。

移除虚拟机服务灰度版本

  1. 更新VirtualService。

    1. 登录应用服务网格控制台,单击服务网格的名称,进入网格详情页面。
    2. 在左侧导航栏选择“网格配置”,单击“istio资源管理”页签。
    3. 选择“istio资源:virtualservices”,命名空间选择“vmns”,选择创建VirtualService中创建的VirtualService,单击操作列的“编辑”,区分两种情况:
      • 情况一:虚拟机服务未配置网关

        删除spec.http[0].route下v2版本的destination配置,以及v1版本的weight参数:

                  weight: 50
                - destination:
                    host: <vm-server1>.<vmns>.svc.cluster.local
                    port:
                      number: 8080
                    subset: v2
                  weight: 50

        删除后配置如下:

      • 情况二:虚拟机服务已配置网关

        分别删除spec.http[0].route和spec.http[1].route下v2版本的destination配置,以及v1版本的weight参数:

                  weight: 50
                - destination:
                    host: <vm-server1>.<vmns>.svc.cluster.local
                    port:
                      number: 8080
                    subset: v2
                  weight: 50

        删除后配置如下:

    4. 单击“确定”完成修改。

  2. 更新DestinationRule。

    1. 登录应用服务网格控制台,单击服务网格的名称,进入网格详情页面。
    2. 在左侧导航栏选择“网格配置”,单击“istio资源管理”页签。
    3. 选择“istio资源:destinationrules”,命名空间选择“vmns”,选择创建DestinationRule中创建的DestinationRule,单击操作列的“编辑”,删除spec.subsets下v2版本配置:
          - labels:
              version: v2
            name: v2

      删除后配置如下:

    4. 单击“确定”完成修改。

相关文档