虚拟机服务灰度发布
虚拟机上部署ASM-PROXY,且网格化后,可以设置灰度策略实现简单的灰度发布。如下图所示,虚拟机1上部署httptest应用(原版本v1),虚拟机2上部署httptest-canary应用(灰度版本v2),配置v1版本、v2版本分别50%的流量比例。当容器服务访问虚拟机服务时,50%的请求将由v1版本响应,50%的请求由v2版本响应。
实现灰度发布的流程如下:
- 部署虚拟机服务灰度版本:在虚拟机2上部署httptest-canary应用,作为虚拟机服务灰度版本v2。
- 添加虚拟机服务灰度版本到网格:创建v2版本的WorkloadEntry、ServiceEntry,更新VirtualService和DestinationRule,并在其中配置基于流量比例的灰度策略。
- 访问虚拟机服务:容器服务通过服务名访问虚拟机服务,验证灰度策略是否生效。
- 移除虚拟机服务灰度版本:完成灰度发布后,更新VirtualService和DestinationRule,移除虚拟机服务灰度版本。
前提条件
- 已执行添加虚拟机服务到网格,即已创建v1版本的WorkloadEntry、ServiceEntry,已创建VirtualService、DestinationRule。
- 已准备虚拟机2,用来部署虚拟机服务灰度版本。
部署虚拟机服务灰度版本
此处以httptest-canary测试程序作为示例。httptest-canary为go http应用,监听在8080端口,访问正常返回“hello, canary http server”消息。
- 上传httptest-canary应用到虚拟机2。
- 修改权限。
chmod +x httptest-canary
- 启动httptest-canary应用。
./httptest-canary
添加虚拟机服务灰度版本到网格
- 创建v2版本的WorkloadEntry。
使用WorkloadEntry定义虚拟机服务的工作负载属性。
- 登录应用服务网格控制台,单击服务网格的名称,进入网格详情页面。
- 在左侧导航栏选择“网格配置”,单击“istio资源管理”页签。
- 选择“istio资源:workloadentries”,命名空间选择3中填写的命名空间“vmns”,单击“创建”。
- 输入以下内容:
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中填写的服务账号名称。
示例:
- 单击“确定”完成创建。
- 更新DestinationRule。
- 登录应用服务网格控制台,单击服务网格的名称,进入网格详情页面。
- 在左侧导航栏选择“网格配置”,单击“istio资源管理”页签。
- 选择“istio资源:destinationrules”,命名空间选择“vmns”,选择创建DestinationRule中创建的DestinationRule,单击操作列的“编辑”,在spec.subsets下将原有列表复制后并列添加以下内容:
- labels: version: v2 name: v2
示例:
- 单击“确定”完成修改。
- 更新VirtualService。
- 登录应用服务网格控制台,单击服务网格的名称,进入网格详情页面。
- 在左侧导航栏选择“网格配置”,单击“istio资源管理”页签。
- 选择“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%的流量比例。
示例:
- 情况一:虚拟机服务未配置网关
- 单击“确定”完成修改。
访问虚拟机服务
如果虚拟机2未部署ASM-PROXY,未加入网格,要想正常访问到v2版本,需要配置关闭mTLS认证,即在vmns命名空间下的DestinationRule资源对象的spec下添加如下内容:
trafficPolicy: tls: mode: DISABLE
- 在CCE集群中部署容器服务tomcat,具体操作请参见部署容器服务。
- 在kubectl节点执行以下命令,获取tomcat工作负载的Pod名称。
kubectl get pods -n <vmns>|grep tomcat
回显示例:
tomcat-75cbb4b948-nzrfs 2/2 Running 0 19h
- 多次执行以下命令,对虚拟机服务发起访问。
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”,则访问虚拟机服务成功,并且配置的灰度策略生效。
移除虚拟机服务灰度版本
- 更新VirtualService。
- 登录应用服务网格控制台,单击服务网格的名称,进入网格详情页面。
- 在左侧导航栏选择“网格配置”,单击“istio资源管理”页签。
- 选择“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
删除后配置如下:
- 情况一:虚拟机服务未配置网关
- 单击“确定”完成修改。
- 更新DestinationRule。
- 登录应用服务网格控制台,单击服务网格的名称,进入网格详情页面。
- 在左侧导航栏选择“网格配置”,单击“istio资源管理”页签。
- 选择“istio资源:destinationrules”,命名空间选择“vmns”,选择创建DestinationRule中创建的DestinationRule,单击操作列的“编辑”,删除spec.subsets下v2版本配置:
- labels: version: v2 name: v2
删除后配置如下:
- 单击“确定”完成修改。