
# Bookinfo应用的灰度发布实践
应用服务网格（Application Service Mesh，简称ASM）是基于开源Istio推出的服务网格平台，它深度、无缝对接了企业级Kubernetes集群服务云容器引擎（CCE），在易用性、可靠性、可视化等方面进行了一系列增强，可为客户提供开箱即用的上手体验。
#### 入门指引
灰度发布是迭代软件产品在生产环境安全上线的一种重要手段。本教程以Bookinfo应用为例，向您讲解服务网格基于Istio提供的服务治理能力。
Bookinfo应用灰度发布流程包含以下步骤：
图1入门流程   
![](https://support.huaweicloud.com/qs-asm/zh-cn_image_0000001248120679.png)
#### Bookinfo应用分析
Bookinfo是一个模仿在线书店的应用，页面上会显示一本书籍的描述，书籍的细节（如页数），以及关于书籍的一些评论。
Bookinfo应用由四个单独的服务构成，几个服务是由不同的语言编写的。这些服务对应用服务网格ASM并无依赖，但是构成了一个有代表性的服务网格的例子，即由多个服务、多个语言构成，且reviews服务具有多个版本。这四个服务的说明如下：
- productpage：会调用details和reviews两个服务，用来生成页面。
- details：包含了书籍的信息。
- reviews：包含了书籍相关的评论，同时会调用ratings服务。
- ratings：包含了由书籍评价组成的评级信息。
其中，reviews服务有3个版本：
- v1（1.17.0）版本不会调用ratings服务。
- v2（1.17.1）版本会调用ratings服务，并使用1到5个黑色星形图标来显示评分信息。
- v3（1.17.2）版本会调用ratings服务，并使用1到5个红色星形图标来显示评分信息。
![](https://support.huaweicloud.com/qs-asm/public_sys-resources/note_3.0-zh-cn.png)
为了直观的展示灰度版本之间流量切换情况，本教程以reviews服务的1.17.1版本（黑星形）、1.17.2版本（红星形）为例进行说明。
图2Bookinfo应用的端到端架构   
![](https://support.huaweicloud.com/qs-asm/zh-cn_image_0000001440024745.png)
在ASM中运行Bookinfo应用，无需对应用自身做出任何改变，只需简单的在ASM环境中对服务进行配置和运行，即把Envoy Sidecar注入到每个服务之中。最终的部署结果如[图3]所示。
图3Envoy Sidecar注入之后的Bookinfo应用   
![](https://support.huaweicloud.com/qs-asm/zh-cn_image_0000001389665636.png)
所有的服务都和Envoy Sidecar集成在一起，被集成服务的所有出入流量都被Sidecar所劫持，这样就可以利用ASM为应用提供服务路由、遥测数据收集以及策略实施等功能。
#### 准备工作
在开始之前，您需要完成如下的准备工作。
1. 创建虚拟私有云和子网。
   
   虚拟私有云（Virtual Private Cloud，简称VPC）提供一个隔离的、用户自主配置和管理的虚拟网络环境，可以提升资源的安全性，简化用户的网络部署。
   1. 登录虚拟私有云VPC控制台。
   
   2. 单击右上角的"创建虚拟私有云"。
   
   3. 如果无特殊需求，界面参数均可保持默认，单击"立即创建"。 详细参数说明可参考[创建虚拟私有云和子网](https://support.huaweicloud.com/usermanual-vpc/zh-cn_topic_0013935842.html)。
      
   
   
   
   
2. （可选）创建密钥对。
   
   创建集群节点时，如果使用密钥对登录方式，需要提前创建好密钥对。
   1. 登录数据加密服务DEW控制台。
   
   2. 选择左侧导航中的"密钥对管理"，单击"创建账号密钥对"。
   
   3. 输入密钥对名称，单击"确定"。 密钥对名称由两部分组成：KeyPair-4位随机数字，使用一个容易记住的名称，如KeyPair-xxxx_asm。
      图4创建密钥对   
      ![](https://support.huaweicloud.com/qs-asm/zh-cn_image_0000001959112649.png)
      
      
      
   
   4. 您的浏览器会提示您下载或自动下载私钥文件。文件名是您为密钥对指定的名称，文件扩展名为".pem"。请将私钥文件保存在安全位置。然后在系统弹出的提示框中单击"确定"。
      ![](https://support.huaweicloud.com/qs-asm/public_sys-resources/note_3.0-zh-cn.png)
      为保证安全，私钥只能下载一次，请妥善保管，否则将无法登录节点。
      
   
   
   
   
3. 创建负载均衡。 
   弹性负载均衡将作为服务网格对外访问入口，被服务网格管理的应用流量，均从此实例进入并分发到后端服务。
   1. 登录弹性负载均衡ELB控制台。
   
   2. 单击右上角的"购买弹性负载均衡"。
   
   3. 参考[创建共享型负载均衡器](https://support.huaweicloud.com/usermanual-elb/zh-cn_topic_0015479967.html)完成共享型弹性负载均衡的购买。
      - 网络类型：选择"公网"。
      
      - 所属VPC、子网：选择[1]中创建的虚拟私有云和子网。
      
      
      图5购买弹性负载均衡   
      ![](https://support.huaweicloud.com/qs-asm/zh-cn_image_0000001932037382.png) 
   
   
   
   
4. 创建集群。
   
   1. 登录云容器引擎CCE控制台。
   
   2. 选择左侧导航中的"资源管理 \> 集群管理"，单击"CCE集群"右侧的"购买"按钮。 创建集群的详细步骤请参见[购买CCE集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0028.html)。
      
   
   3. 在"服务选型"页面设置如下参数，其余参数均采用默认值。
      - 集群名称：用户自行输入，此处设置为"cce-asm"。
      
      - 虚拟私有云、所在子网：选择[1]中创建的虚拟私有云和子网。
       
   
   4. 单击"下一步：创建节点"，配置添加节点的参数。除节点规格和登录方式外，其余参数保持默认。
      - 节点规格：vCPUs为4核，内存为8GiB。
        ![](https://support.huaweicloud.com/qs-asm/public_sys-resources/note_3.0-zh-cn.png)
        此规格为部署Bookinfo应用所需的最小资源。
        
      
      - 登录方式：选择[2]中创建的密钥对，用于远程登录节点时的身份认证。
       
   
   5. 单击"下一步：安装插件"，在"安装插件"步骤中选择要安装的插件。 "系统资源插件"为必装插件，"高级功能插件"可根据实际需求进行选择性安装。
      
   
   6. 单击"下一步：配置确认"，阅读使用说明并勾选"我已知晓上述限制"，确认所设置的服务选型参数、规格等信息。
   
   7. 确认订单无误后，单击"提交"，集群开始创建。 如果选择购买"包年/包月"的集群，请单击"去支付"，根据界面提示进行付款操作。
      集群创建预计需要6-10分钟，您可以单击"返回集群管理"进行其他操作或单击"查看集群事件列表"后查看集群详情。
      
   
   
   
   
5. 自行准备Bookinfo应用所需的镜像（如[表1]所示），将它们上传至SWR镜像仓库，并且设置为"公开"。
   
   ![](https://support.huaweicloud.com/qs-asm/public_sys-resources/caution_3.0-zh-cn.png)
   每个服务的镜像名称和镜像tag必须与[表1]保持一致，否则体验任务可能部署失败。
    表1镜像列表 
   | 服务          | 镜像名称                             | 镜像tag        |
   |:---|:---|:---|
   | productpage | examples-bookinfo-productpage-v1 | 1.17.0       |
   | details     | examples-bookinfo-details-v1     | 1.17.01.17.0 |
   | ratings     | examples-bookinfo-ratings-v1     | 1.17.01.17.0 |
   | reviews     | examples-bookinfo-reviews-v1     | 1.17.1       |
   | reviews     | examples-bookinfo-reviews-v1     | 1.17.2       |
      
   以社区的Bookinfo镜像为例，详细指导如下所述：
   1. 准备一台机器，要求可访问Internet，并且已安装1.11.2及以上版本的Docker。
   
   2. 依次执行以下命令，下载Bookinfo应用所需的镜像。
      **docker pull docker.io/istio/examples-bookinfo-productpage-v1:1.17.0**
      **docker pull docker.io/istio/examples-bookinfo-details-v1:1.17.0**
      **docker pull docker.io/istio/examples-bookinfo-ratings-v1:1.17.0**
      **docker pull docker.io/istio/examples-bookinfo-reviews-v2:1.17.0**
      **docker pull docker.io/istio/examples-bookinfo-reviews-** **v3:1.17.0**
      
   
   3. 连接容器镜像服务，具体操作请参见[使用容器引擎客户端上传镜像](https://support.huaweicloud.com/qs-swr/index.html#section5)。
   
   4. 为[5.b]中下载的镜像打标签，注意镜像名称和镜像tag与[表1]保持一致。
      **docker tag docker.io/istio/examples-bookinfo-productpage-v1:1.17.0** *swr.cn-north-4.myhuaweicloud.com* **/** *group* **/examples-bookinfo-productpage-v1:1.17.0**
      **docker tag docker.io/istio/examples-bookinfo-details-v1:1.17.0** *swr.cn-north-4.myhuaweicloud.com* **/** *group* **/examples-bookinfo-details-v1:1.17.0**
      **docker tag docker.io/istio/examples-bookinfo-ratings-v1:1.17.0** *swr.cn-north-4.myhuaweicloud.com* **/** *group* **/examples-bookinfo-ratings-v1:1.17.0**
      **docker tag docker.io/istio/examples-bookinfo-reviews-v2:1.17.0** *swr.cn-north-4.myhuaweicloud.com* **/** *group* **/examples-bookinfo-reviews-v1:1.17.1**
      **docker tag docker.io/istio/examples-bookinfo-reviews-v3:1.17.0** *swr.cn-north-4.myhuaweicloud.com* **/** *group* **/examples-bookinfo-reviews-v1:1.17.2**
      其中，*swr.cn-north-4.myhuaweicloud.com* 为镜像仓库地址，*group*为组织名称，请替换为实际取值。
      
   
   5. 上传镜像至SWR镜像仓库。 **docker push** *swr.cn-north-4.myhuaweicloud.com* **/** *group* **/examples-bookinfo-productpage-v1:1.17.0**
      **docker push** *swr.cn-north-4.myhuaweicloud.com* **/** *group* **/examples-bookinfo-details-v1:1.17.0**
      **docker push** *swr.cn-north-4.myhuaweicloud.com* **/** *group* **/examples-bookinfo-ratings-v1:1.17.0**
      **docker push** *swr.cn-north-4.myhuaweicloud.com* **/** *group* **/examples-bookinfo-reviews-v1:1.17.1**
      **docker push** *swr.cn-north-4.myhuaweicloud.com* **/** *group* **/examples-bookinfo-reviews-v1:1.17.2**
      
   
   6. 将镜像类型修改为"公开"，具体操作请参见[编辑镜像属性](https://support.huaweicloud.com/usermanual-swr/swr_01_0016.html)。
   
   
   
   
 
#### 购买网格
基础版网格支持一键体验任务。可治理单个集群，且免费提供200实例规格。
1. 登录应用服务网格ASM控制台。
2. 单击右上角"购买网格"。
3. 设置如下参数，其余参数均采用默认值。 
   - **网格类型**
     选择基础版。
     
   
   - **网格名称**
     设置网格的名称。
     
   
   - **Istio版本**
     网格支持的Istio版本。
     
   
   - **集群**
     选择[4]中创建的集群。
     
   
   - **Istio控制面节点**
     如果需要高可用，建议选择两个或以上不同可用区的节点。
     
   
   
   
   
4. 设置完成后，在右侧的配置清单中确认网格配置，单击"提交"。 
   创建时间预计需要1\~3分钟，请耐心等待。当网格状态从"安装中"变为"运行中"，表示网格创建成功。
   
   
 
#### 一键创建Bookinfo应用
为集群开启应用服务网格功能后，可以通过"体验任务"创建一个Bookinfo应用Demo，具体操作如下：
1. 登录应用服务网格ASM控制台。
2. 单击网格名称，进入详情页面。
3. 选择左侧导航中的"体验任务"，单击Bookinfo任务中的"安装"。
4. 在右侧页面设置Bookinfo应用所在的集群，在"负载均衡"中选择与所选集群处于同一VPC和子网的共享型负载均衡实例，设置一个对外端口，并填写Bookinfo应用镜像所在的镜像仓库地址，如"swr.cn-north-4.myhuaweicloud.com/group"（group表示组织名称），单击"安装"。 
   图6安装Bookinfo   
   ![](https://support.huaweicloud.com/qs-asm/zh-cn_image_0000001959244001.png)
   
   
5. 等待Bookinfo应用创建完成。创建完成后进入"服务管理"页面，配置诊断栏将显示为"正常"，Bookinfo应用包含productpage、details、reviews、ratings四个服务。 
   图7服务列表   
   ![](https://support.huaweicloud.com/qs-asm/zh-cn_image_0000001959266105.png)
   
   
 
#### 为服务添加灰度版本
本步骤将为Bookinfo应用的"reviews"服务添加新的灰度版本，并配置相应的灰度策略，将原有生产环境的默认版本的流量引流一部分到新版本中。
下面将以为"reviews"服务添加一个v3新版本，且v3新版本接收Bookinfo应用的30%流量为例进行配置。
**部署灰度版本**
1. 在左侧导航中选择"灰度发布"，在金丝雀发布下，单击"立即发布"。
2. 配置灰度发布基本信息。 
   - 灰度任务名称：用户自定义，此处设置为reviews-v3。
   
   - 命名空间：选择服务所在命名空间。
   
   - 灰度发布服务：在下拉框中选择reviews。
   
   - 工作负载：选择服务所属的工作负载。
   
   
   
   
3. 配置灰度版本信息。 
   - 部署集群：选择服务所属的集群。
   
   - 版本号：配置为v3。
   
   - 实例数量：使用默认。
   
   - 实例配置：镜像版本选择1.17.2，其他参数保持默认。
   
   
   
   
4. 单击"发布"，待启动进度为100%，表明灰度版本部署成功。 
   图8查看启动进度   
   ![](https://support.huaweicloud.com/qs-asm/zh-cn_image_0000001932069804.png)
   
   
**配置流量策略**
为灰度版本设置流量策略，灰度版本会根据配置的流量配比引流老版本中的部分或全部流量。
1. 灰度版本部署成功后，单击"配置流量策略"。
2. 设置流量策略。 
   策略类型分为"基于流量比例"和"基于请求内容"，通过页签选择确定。
   - 基于流量比例：根据流量比例配置规则，将从原版本中切分指定比例的流量到灰度版本。例如80%的流量走原版本，20%的流量走灰度版本。
   
   - 基于请求内容：根据请求内容配置规则，只有请求内容中满足特定条件的流量会切分到灰度版本上。例如只有在Windows操作系统上的用户可以访问灰度版本。
   
   
   以"基于流量比例"为例，且v3版本流量配比为20%。
   图9流量策略   
   ![](https://support.huaweicloud.com/qs-asm/zh-cn_image_0000001202053160.png)
   
   
3. 单击"策略下发"。 
   灰度策略的生效需要几秒的时间，您需要在"监测与处理"页面开通免费体验APM，或者购买APM套餐包，否则无法观测到原版本和灰度版本的流量监控数据。
   
   
4. 在"服务列表"页面，单击productpage服务中的"访问地址"。不断刷新页面，页面在v1和v3版本之间来回切换，并且比例大致接近4:1。 
   图10v1版本页面   
   ![](https://support.huaweicloud.com/qs-asm/zh-cn_image_0000001247893125.png)
   图11v3版本页面   
   ![](https://support.huaweicloud.com/qs-asm/zh-cn_image_0000001203053124.png)
   
   
5. 您也可以在一台已连接公网的机器上执行如下命令，持续访问productpage服务。 
   **while true;do wget -q -O- http://** *ip:port* **/productpage; done**
   返回控制台的"监测与处理"页面查看v1和v3版本的实时流量监控情况。
   图12流量监控详情   
   ![](https://support.huaweicloud.com/qs-asm/zh-cn_image_0000001203333110.png)
   
   
6. 在"流量监控"页面，您可以查看Bookinfo应用各服务之间的实时拓扑。ASM提供的流量监控功能，可监控服务之间的拓扑、会话请求调用链、各环节耗时和RPS、RT等性能状态。 
   图13流量监控拓扑   
   ![](https://support.huaweicloud.com/qs-asm/zh-cn_image_0000001247213167.png)
   从拓扑图可以看出，reviews-v1和reviews-v3服务的调用次数分别为706和167，比例大致接近4:1，符合设定的流量比例策略。成功实现了灰度发布。
   ![](https://support.huaweicloud.com/qs-asm/public_sys-resources/caution_3.0-zh-cn.png)
   
   
   
 
#### 灰度版本切换
检查v3版本的资源数与v1版本是否相匹配，确认其能承接v1的所有流量后，即可将v1流量全部切换到v3。
1. 在"监测与处理"页面，单击v3版本后的"全流量接管"。 
   图14全流量接管   
   ![](https://support.huaweicloud.com/qs-asm/zh-cn_image_0000001959167297.png)
   
   
2. 单击"确定"。 
   页面右上角会提示全流量接管成功。在Bookinfo应用页面，不断刷新页面，页面仅显示v3版本信息，即星形图标全部为红色。
   图15v3版本页面   
   ![](https://support.huaweicloud.com/qs-asm/zh-cn_image_0000001203040696.png)
   
   
 
#### 结束灰度任务
v3承接v1版本所有流量后，即可结束灰度任务，释放v1版本的资源。
1. 在"监测与处理"页面，单击"结束灰度任务"。
2. 单击"确定"，结束灰度任务将下线原版本，并删除灰度任务。 
   图16结束灰度任务   
   ![](https://support.huaweicloud.com/qs-asm/zh-cn_image_0000001959377537.png)
   下线服务版本，会将包含的工作负载和Istio相关配置资源全部删除。
   
   
 
#### 清除资源
到此本Demo已全部操作完成，因节点和应用运行过程中会产生费用，如果无特殊要求，请及时删除应用和节点，避免费用产生。
1. 选择左侧导航中的"体验任务"，单击Bookinfo任务中的"卸载"。
2. 单击"确定"。卸载Bookinfo体验任务，会自动删除productpage、details、reviews、ratings服务及相关资源。 
   图17卸载体验任务   
   ![](https://support.huaweicloud.com/qs-asm/zh-cn_image_0000001959344809.png)
   ![](https://support.huaweicloud.com/qs-asm/public_sys-resources/note_3.0-zh-cn.png)
   卸载体验任务后，已完成灰度发布的服务，其灰度版本对应的负载需要手动在CCE控制台删除。
   
   
 
