灰度发布应用实例


升级应用到新版本时,灰度发布可降低应用发布风险,保障应用版本平稳过度。灰度策略为金丝雀发布,利用 Istio 流量管控能力,将部分新版本流量推动到客户,逐渐增加新版本发送的流量比例直到确定新版本稳定可用,把所有流量路由至新版本。


灰度发布的 Chart 规范

灰度服务的 Chart 中所有的资源文件名以及 App 标签均以:{{ .Chart.Name }}-{{ .Release.Name }} 方式命名,以便隔离正式和灰度两套资源。故同一个 SubChart 内各个资源之间的引用,也需要基于此名称。比如 Deployment 中引用Secret 和 Configmap 等。其中,{{ .Release.Name }} 是发布名称和 父 chartVersion 的组合,即通过chartVersion 的不同来隔离灰度版本和正式版本两套资源。下面仅以 Deployment、Ingress 和 Service 三种特殊资源做示例说明,其他资源只需要严格遵循上述资源名称和 App 标签的命名方式即可。

Deployment 资源文件编写

  1. Deployment 资源名、labels 中的 App 标签以及 Selector 中的 App 标签均命名为:{{ .Chart.Name }}-{{ .Release.Name }} 。

    备注

    Selector 中的标签建议只有一个 App,若有其他标签,则这些标签后续均不可更改。


    ../../_images/chart_deployment.png
  2. 服务健康检查方式需要全部使用 http 方式,因为灰度部署底层依赖于 Istio,而 Istio 的使用会使 TCP 方式的健康检查失效。http 健康检查方式如下:

    ../../_images/chart_http.png

Ingress 资源文件编写

名称命名以及 App 标签均为:{{ .Chart.Name }}-{{ .Release.Name }} 。

备注

灰度规则会读取每个 SubChart 中的 Ingress 资源中 port 信息用来实现固定域名访问:

  1. 仅支持一个 port 的 Ingress 资源, 如果有多个 port,则只会解析并生效第一个 port,会导致部分端口不可用。若需生效多个端口,可通过灰度部署的高级功能实现(自己撰写 istio 相关的 yaml 文件)。

  2. 灰度期间两个 Ingress 资源中的 host 如果相同,会导致 Ingress 不生效,所以无法使用Ingress的host访问,只能通过 Istio 的域名访问。

  3. 灰度部署的各个子服务,只有存在 Ingress 文件,且按照上述规则编写,才能够通过固定域名方式访问,否则无法通过固定域名的方式访问各子服务。


../../_images/chart_ingress.png

Service 资源文件编写

  1. 命名方式以及 App 标签均为:{{ .Chart.Name }}-{{ .Release.Name }} 。

    备注

    为实现固定 svc 方式访问,灰度部署规则会读取每个 SubChart 中的 Service资源中 Port 信息。只支持一个 port 的 service 资源,若需多个 port 并基于不同 path 访问不同 port,可通过高级灰度规则实现(自己撰写相应的 istio 规则的 yaml 文件)。


    ../../_images/chart_service.png
  2. 按照上述规则配置后,则每个 SubChart 对应的 svc 访问方式为:chartName.namespace.svc.cluster.local。例如在 beta 环境的灰度部署服务,其子服务 chart 名称为:ecp-log-service,在 op 这个 namespace下,则该服务的 svc访问方式固定为:ecp-log-service.op.svc.cluster.local 。

    备注

    使用固定svc方式访问的前提是 chart 中该子服务存在相应的 Service 资源文件,当 chart 加入灰度部署白名单后,如果该 chart 已经在集群中正常部署过,则需再次正常升级部署一次后才能用上述固定 svc 方式访问。

灰度发布应用实例

应用开发者可通过以下步骤部署应用实例:

  1. 在左侧导航栏中,选择 应用商店 > 目录

  2. 浏览各个分类下已上架的应用模板,点击需要使用的应用模板。

  3. 查看应用模板的详细信息,选择需要部署的模板版本,点击 灰度发布

    备注

    仅限在模板白名单的应用模板支持灰度发布。如需申请,请联系系统管理员。


    ../../_images/deploying_app_instance_2.png
  4. 在发布信息页中,选择部署应用实例的项目、环境、集群和所需覆盖的旧版本。

    ../../_images/deploying_app_instance_1.png
  5. 点击 下一步 进入灰度策略页,选择 按流量比例按请求header 进行发布策略配置。

    • 按流量比例:选择新旧版本的流量比值。

    • 按请求header:支持精确匹配、前缀匹配和正则匹配三种匹配方式。关于正则语法详细信息,参见 Syntax

  6. 点击 提交,完成灰度发布。

灰度发布后切换版本

当发布状态在 灰度中 时,可在部署详情页中,点击 切至新版本切回旧版本,将流量完全指向新 / 旧版本。

../../_images/deploying_app_cancel_1.png

取消应用发布

当发布状态仍在 运行中 时,可在部署详情页中,点击 取消,取消发布。

../../_images/deploying_app_cancel.png

查看已部署的应用实例

应用实例部署完成后,可通过应用模板详情页中的 部署历史 一栏,查看应用实例的详细信息:

  1. 在应用模板列表中,点击应用模板列表中的应用模板名称,打开应用模板详情页。

  2. 部署历史 一栏中,查看应用实例的详细信息和该应用部署在不同集群中的全部记录。

    ../../_images/deployed_app_instance.png