基于 Argo Rollout 实现渐进式灰度发布¶
本文介绍如何基于开源的 Argo Rollout 实现渐进式灰度发布。
前提条件¶
-
示例中的镜像需要访问公网:
argoproj/rollouts-demo:yellow
和argoproj/rollouts-demo:blue
。 -
仅适用于通过安装器以 metlb 方式部署出来的 DCE 5.0 平台。
-
使用灰度发布能力需要所在集群中安装 Istio 和 Argo Rollout 组件。
操作步骤¶
整个过程分为四个步骤:首先基于容器镜像构建应用,然后配置 Istio 相关资源,创建灰度发布任务,最后验证效果。
基于容器镜像构建应用¶
具体操作步骤可参考基于 Git 仓构建微服务应用、基于 Jar 包部署 Java 应用。
需要注意:
-
容器镜像为:argoproj/rollouts-demo:blue
-
服务端口:名称为
http
、容器端口为8082
、服务端口为8082
。 -
填写高级配置时需要开启灰度发布。
Istio 相关资源配置¶
在服务网格模块或者控制台创建以下资源。
-
创建 Gateway
gateway.yamlapiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: rollout-demo namespace: rollout-demo # (1) spec: selector: istio: ingressgateway servers: - hosts: - * port: name: http number: 8082 protocol: HTTP
- 部署应用的命名空间
-
部署 Gateway
-
修改 VirtualService
仅需修改提示的字段,其余字段无需修改。
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: creationTimestamp: "2022-11-07T10:46:23Z" generation: 84 name: demo01 namespace: default resourceVersion: "5741370" uid: 8109f754-aa9d-49f1-b8a9-d4daf5108032 spec: gateways: - rollout-demo # (1) hosts: - '*' # (2) http: - name: primary route: - destination: host: demo01 subset: stable weight: 100 - destination: host: demo01 subset: canary weight: 0
- 修改此处,需要新增 gateway,指向上一步创建的 gateway 名称
- 修改此处,原来 host 为 vs 的名称,需要删除后更改为
‘*’
-
配置 istio-ingressgateway 网关
仅需修改提示的字段,其余字段无需修改。
apiVersion: v1 kind: Service metadata: labels: app: istio-ingressgateway app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: istio-ingressgateway app.kubernetes.io/version: 1.15.0 helm.sh/chart: gateway-1.15.0 istio: ingressgateway name: istio-ingressgateway namespace: istio-system resourceVersion: "5775680" uid: 53bd7344-ba45-4547-b695-aca2c4dd713d spec: allocateLoadBalancerNodePorts: true clusterIP: 100.66.222.131 clusterIPs: - 100.66.222.131 externalTrafficPolicy: Cluster internalTrafficPolicy: Cluster ipFamilies: - IPv4 ipFamilyPolicy: SingleStack ports: - name: status-port nodePort: 32384 port: 15021 protocol: TCP targetPort: 15021 # 新增以下内容 - name: rollout-demo port: 8082 protocol: TCP targetPort: 8082 # -------------- selector: app: istio-ingressgateway istio: ingressgateway sessionAffinity: None type: LoadBalancer
-
创建 AuthorizationPolicy 资源
此步骤的目的是在浏览器访问是可以正常访问到 js 相关的资源。
创建灰度发布任务¶
在应用工作台创建灰度发布任务。如需了解更详细的创建说明,可参考创建金丝雀发布任务。
-
选择开启灰度发布的应用
-
修改发布规则(为了更明显的演示效果)
-
点击创建并更新应用,在弹出的对话框中填写镜像地址:
argoproj/rollouts-demo:yellow
验证效果¶
访问地址:http://{istio-ingressgateway LB IP}:8082
,得到如下所示的访问效果。
此界面会并发调用 http://{istio-ingressgateway LB IP}:8082/color
,将获取到颜色信息填充到方格中。 在灰度发布对象中,指定的颜色为 blue、yellow,会按照定义规则 1:9 的流量比进行展示。
此时可以在应用工作台灰度发布模块选择继续发布应用来调整流量比例,直到最终成功发布。