# 基于云原生网关(contour)的灰度发布实践
本文将通过以下步骤来进行基于云原生网关的灰度发布的最佳实践,将分为以下几步:
1. 创建应用资源,用于灰度发布的发布对象
2. 创建微服务引擎相关的网关资源
3. 创建基于云原生网关的灰度发布任务
4. 观察发布任务的发布情况
## 前提条件
- 请在 `argo-rollouts` 添加 `contour-plugin` 配置,参考文档部署[argo-rollouts](../pluggable-components.md)
- 当前平台部署了`微服务引擎`模块
## 创建应用资源
登录 DCE 5.0 之后,点击左上角的 **≡** 打开导航栏,依次选择 **应用工作台** -> **向导** -> **基于容器镜像** ,在目标集群/命名空间中创建应用 `rollouts-demo`。
**注意事项:**
- 容器/服务端口:8080
- 容器镜像:argoproj/rollouts-demo:red(镜像 tag 也可以是 blue/green/orange)
![app01](../images/app01.png)
## 微服务引擎网关资源
### 创建网关
参考[创建网关文档](../../skoala/gateway/index.md)。
**注意事项:**
- 网关的管辖命名空间需要包含灰度发布服务所在的命名空间
![skoala01](../images/skoala01.png)
### 创建域名
进入网关详情界面,在`域名管理`中[创建域名](../../skoala/gateway/domain/index.md)。
**注意事项:**
输入一个简单的 HTTP 域名,比如 `gateway.canary`
![skoala02](../images/skoala02.png)
### 创建 API
进入网关详情界面,在 `API 管理`中[创建 API](../../skoala/gateway/api/index.md)。
**注意事项:**
- 域名选择 `gateway.canary`
- 路径匹配规则选择`前缀匹配`,路径填写 `/`
- 请求方法选择 `GET` 和 `POST`,当然也可以`全选`
- 路由配置选择`后端服务`中的`自动发现`服务 `rollouts-demo`
![skoala03](../images/skoala03.png)
### 通过网关访问灰度发布的 Demo 应用
本地配置域名解析,将 gateway.canary 解析到网关地址上,其中网关地址可在网关详情界面`概览`模块的`网络信息`区域获取。
```shell
$ cat /etc/hosts | grep gateway.canary
10.6.222.21 gateway.canary
```
在浏览器中输入 ,可以看到如下界面(流量都是指向 red):
- 需要关闭网络代理,否则访问可能会 502 报错
- 30000 端口是网关的 HTTP 端口,使用的是 HTTP 域名,所以使用 HTTP 端口
![skoala05](../images/skoala05.png)
## 创建金丝雀灰度发布任务
在应用工作台[创建金丝雀灰度发布任务](../user-guide/release/canary.md)。
1. 第一步的基本信息选择目标位置的 rollouts-demo 应用
![contour-rollout](../images/rollout-describe.png)
2. 第二步的发布规则如下:
- 流量管理类型选择云原生网关(该选项的是否可选取决于微服务引擎是否安装)
- 服务选择基本信息中选择的无状态负载对应的服务(即灰度发布的服务)
- 网关实例是由基本信息中目标位置是否是由某个网关管辖决定的
- API 名称选择对应网关中绑定了灰度发布服务的 API
- 流量调度策略参考如下
![contour-rollout](../images/rollout-rule.png)
## 更新发布任务,观察发布情况
需要在发布界面中更新版本,镜像替换为:argoproj/rollouts-demo:blue。
版本更新后,在浏览器中访问 ,然后观察流量统计:
![contour-rollout](../images/contour-rollout01.png)
### 第一阶段
即第一分钟,流量比 red:blue 大概是 4:1
![step01](../images/step01.png)
### 第二阶段
即第二三分钟,流量比 red:blue 大概是 1:1
![step02](../images/step02.png)
### 第三阶段
即第四分钟,流量比 red:blue 大概是 1:4
![step03](../images/step03.png)
### 最后阶段
即发布完成,全部都是 blue 的流量
![step04](../images/step04.png)