
# 虚拟机服务灰度发布
虚拟机上部署ASM-PROXY，且网格化后，可以设置灰度策略实现简单的灰度发布。如下图所示，虚拟机1上部署httptest应用（原版本v1），虚拟机2上部署httptest-canary应用（灰度版本v2），配置v1版本、v2版本分别50%的流量比例。当容器服务访问虚拟机服务时，50%的请求将由v1版本响应，50%的请求由v2版本响应。
![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001492570764.png)
实现灰度发布的流程如下：
1. [部署虚拟机服务灰度版本]：在虚拟机2上部署httptest-canary应用，作为虚拟机服务灰度版本v2。
2. [添加虚拟机服务灰度版本到网格]：创建v2版本的WorkloadEntry、ServiceEntry，更新VirtualService和DestinationRule，并在其中配置基于流量比例的灰度策略。
3. [访问虚拟机服务]：容器服务通过服务名访问虚拟机服务，验证灰度策略是否生效。
4. [移除虚拟机服务灰度版本]：完成灰度发布后，更新VirtualService和DestinationRule，移除虚拟机服务灰度版本。
#### 前提条件
- 已执行[添加虚拟机服务到网格](https://support.huaweicloud.com/bestpractice-asm/asm_bestpractice_0010.html#asm_bestpractice_0010__zh-cn_topic_0000001494538437_section1481518471114)，即已创建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. 登录[应用服务网格控制台](https://console.huaweicloud.com/asm/?locale=zh-cn)，单击服务网格的名称，进入网格详情页面。
   
   2. 在左侧导航栏选择"网格配置"，单击"istio资源管理"页签。
   
   3. 选择"istio资源：workloadentries"，命名空间选择[3](https://support.huaweicloud.com/bestpractice-asm/asm_bestpractice_0007.html#asm_bestpractice_0007__zh-cn_topic_0000001494658309_li8573193914511)中填写的命名空间"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](https://support.huaweicloud.com/bestpractice-asm/asm_bestpractice_0007.html#asm_bestpractice_0007__zh-cn_topic_0000001494658309_li8573193914511)中填写的命名空间，\<VM2_IP\>为虚拟机2的私有IP，\<SERVICE_ACCOUNT\>为[3](https://support.huaweicloud.com/bestpractice-asm/asm_bestpractice_0007.html#asm_bestpractice_0007__zh-cn_topic_0000001494658309_li8573193914511)中填写的服务账号名称。
      示例：
      ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001492410876.png)
      
   
   5. 单击"确定"完成创建。
   
   
   
   
2. 更新DestinationRule。 
   1. 登录[应用服务网格控制台](https://console.huaweicloud.com/asm/?locale=zh-cn)，单击服务网格的名称，进入网格详情页面。
   
   2. 在左侧导航栏选择"网格配置"，单击"istio资源管理"页签。
   
   3. 选择"istio资源：destinationrules"，命名空间选择"vmns"，选择[创建DestinationRule](https://support.huaweicloud.com/bestpractice-asm/asm_bestpractice_0010.html#asm_bestpractice_0010__zh-cn_topic_0000001494538437_li362725171218)中创建的DestinationRule，单击操作列的"编辑"，在spec.subsets下将原有列表复制后并列添加以下内容：
      ```
      - labels:
              version: v2
            name: v2
      ```
      示例：
      ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001543770673.png)
      
   
   4. 单击"确定"完成修改。
   
   
   
   
3. 更新VirtualService。 
   1. 登录[应用服务网格控制台](https://console.huaweicloud.com/asm/?locale=zh-cn)，单击服务网格的名称，进入网格详情页面。
   
   2. 在左侧导航栏选择"网格配置"，单击"istio资源管理"页签。
   
   3. 选择"istio资源：virtualservices"，命名空间选择"vmns"，选择[创建VirtualService](https://support.huaweicloud.com/bestpractice-asm/asm_bestpractice_0010.html#asm_bestpractice_0010__zh-cn_topic_0000001494538437_li865313575122)中创建的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](https://support.huaweicloud.com/bestpractice-asm/asm_bestpractice_0007.html#asm_bestpractice_0007__zh-cn_topic_0000001494658309_li8573193914511)中填写的命名空间。配置v1、v2版本分别50%的流量比例。
        示例：
        ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001543650805.png)
        
      
      - 情况二：虚拟机服务已配置网关 复制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](https://support.huaweicloud.com/bestpractice-asm/asm_bestpractice_0007.html#asm_bestpractice_0007__zh-cn_topic_0000001494658309_li8573193914511)中填写的命名空间。配置v1、v2版本分别50%的流量比例。
        示例：
        ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001543410801.png)
        
       
   
   4. 单击"确定"完成修改。
   
   
   
   
 
 #### 访问虚拟机服务
![](https://support.huaweicloud.com/bestpractice-asm/public_sys-resources/note_3.0-zh-cn.png)
如果虚拟机2未部署ASM-PROXY，未加入网格，要想正常访问到v2版本，需要配置关闭mTLS认证，即在vmns命名空间下的DestinationRule资源对象的spec下添加如下内容：
```
trafficPolicy:
    tls:
      mode: DISABLE
```
![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001492251020.png)
1. 在CCE集群中部署容器服务tomcat，具体操作请参见[部署容器服务](https://support.huaweicloud.com/bestpractice-asm/asm_bestpractice_0009.html#asm_bestpractice_0009__zh-cn_topic_0000001444458356_section117282214281)。
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](https://support.huaweicloud.com/bestpractice-asm/asm_bestpractice_0007.html#asm_bestpractice_0007__zh-cn_topic_0000001494658309_li8573193914511)中填写的命名空间。
   若交替回显"hello, http protocol server"和"hello, canary http server"，则访问虚拟机服务成功，并且配置的灰度策略生效。
   ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001543530609.png)
   
   
 
 #### 移除虚拟机服务灰度版本
1. 更新VirtualService。 
   1. 登录[应用服务网格控制台](https://console.huaweicloud.com/asm/?locale=zh-cn)，单击服务网格的名称，进入网格详情页面。
   
   2. 在左侧导航栏选择"网格配置"，单击"istio资源管理"页签。
   
   3. 选择"istio资源：virtualservices"，命名空间选择"vmns"，选择[创建VirtualService](https://support.huaweicloud.com/bestpractice-asm/asm_bestpractice_0010.html#asm_bestpractice_0010__zh-cn_topic_0000001494538437_li865313575122)中创建的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
        ```
        删除后配置如下：
        ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001492570768.png)
        
      
      - 情况二：虚拟机服务已配置网关 分别删除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
        ```
        删除后配置如下：
        ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001492730660.png)
        
       
   
   4. 单击"确定"完成修改。
   
   
   
   
2. 更新DestinationRule。 
   1. 登录[应用服务网格控制台](https://console.huaweicloud.com/asm/?locale=zh-cn)，单击服务网格的名称，进入网格详情页面。
   
   2. 在左侧导航栏选择"网格配置"，单击"istio资源管理"页签。
   
   3. 选择"istio资源：destinationrules"，命名空间选择"vmns"，选择[创建DestinationRule](https://support.huaweicloud.com/bestpractice-asm/asm_bestpractice_0010.html#asm_bestpractice_0010__zh-cn_topic_0000001494538437_li362725171218)中创建的DestinationRule，单击操作列的"编辑"，删除spec.subsets下v2版本配置：
      ```
      - labels:
              version: v2
            name: v2
      ```
      删除后配置如下：
      ![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001492410880.png)
      
   
   4. 单击"确定"完成修改。
   
   
   
   
 
