KubeVela是一个开箱即用的、现代化的应用交付与管理平台。使用服务网格ASM结合KubeVela可以实现应用的渐进式灰度发布,达到平缓升级应用的目的。本文介绍如何使用服务网格ASM结合KubeVela实现渐进式灰度发布。

前提条件

背景信息

KubeVela是一个开箱即用的、现代化的应用交付与管理平台,能够简化面向混合环境的应用交付过程;同时又足够灵活可以随时满足业务不断高速变化所带来的迭代压力。KubeVela后的应用交付模型Open Application Model(OAM)是一个从设计与实现上都高度可扩展的模型,具有完全以应用为中心、可编程式交付工作流、与基础设施无关的特点。更多信息,请参见基于Istio的渐进式发布kubevala

操作前说明

本文涉及的所有文件都在asm_kubevela文件夹中,在进行操作前,您需要下载并解压asm_kubevela至本地。

asm_kubevela文件夹包含application.yamlapplication_rollback.yamlapplication_rollout-v2.yamlcanary-rollout-wf-def.yamlrollback-wf-def.yamltraffic-trait-def.yaml文件。其中:
  • 步骤三中将使用到canary-rollout-wf-def.yamlrollback-wf-def.yamltraffic-trait-def.yaml文件。
  • 步骤四将使用到application.yaml文件。
  • 步骤五将使用到application_rollout-v2.yaml文件。
  • 步骤六将使用到application_rollback.yaml文件。

步骤一:安装KubeVela

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,选择市场 > 应用市场
  3. 应用目录页面搜索ack-kubevela,然后单击ack-kubevela。
  4. 在ack-kubevela详情页面创建面板选择集群,然后单击创建

步骤二:开启自动注入

  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 在网格详情页面左侧导航栏单击命名空间
  5. 命名空间页面单击default右侧自动注入列下的启用Sidecar自动注入
  6. 确认对话框单击确定

步骤三:部署KubeVela配置文件

部署KubeVela配置文件,用于实现KubeVela和服务网格ASM流量治理规则的集成。
说明 此操作前,请务必开启数据面集群Kubernetes API访问Istio资源,否则会报错。具体操作,请参见使用数据面集群Kubernetes API访问Istio资源

进入asm_kubevela文件夹中,执行以下命令,逐个部署KubeVela配置文件。

kubectl apply -f rollback-wf-def.yaml
kubectl apply -f canary-rollout-wf-def.yaml
kubectl apply -f traffic-trait-def.yaml

步骤四:部署应用和网关

  1. 进入asm_kubevela文件夹中,执行以下命令,部署Bookinfo应用。
    kubectl apply -f application.yaml

    application.yaml文件中为review服务配置traits字段下typecanary-traffic,表示配置了渐进式流量发布的运维特征。

  2. 在ASM控制台中部署网关规则和虚拟服务。
    1. 登录ASM控制台
    2. 在左侧导航栏,选择服务网格 > 网格管理
    3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
    4. 部署网关规则。
      1. 在网格详情页面左侧导航栏选择流量管理 > 网关规则,在右侧页面单击使用YAML创建
      2. 创建页面设置命名空间为default,复制以下内容到文本框中,然后单击创建
        apiVersion: networking.istio.io/v1alpha3
        kind: Gateway
        metadata:
          name: bookinfo-gateway
        spec:
          selector:
            istio: ingressgateway # use istio default controller
          servers:
          - port:
              number: 80
              name: http
              protocol: HTTP
            hosts:
            - "*"
    5. 部署虚拟服务。
      1. 在网格详情页面左侧导航栏选择流量管理 > 虚拟服务,在右侧页面单击使用YAML创建
      2. 创建页面设置命名空间为default,复制以下内容到文本框中,然后单击确定
        apiVersion: networking.istio.io/v1alpha3
        kind: VirtualService
        metadata:
          name: bookinfo
        spec:
          hosts:
          - "*"
          gateways:
          - bookinfo-gateway
          http:
          - match:
            - uri:
                exact: /productpage
            - uri:
                prefix: /static
            - uri:
                exact: /login
            - uri:
                exact: /logout
            - uri:
                prefix: /api/v1/products
            route:
            - destination:
                host: productpage
                port:
                  number: 9080
    6. 访问Bookinfo应用。
      1. 登录容器服务管理控制台
      2. 在控制台左侧导航栏中,单击集群
      3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
      4. 在集群管理页面选择网络 > 服务
      5. 在服务页面顶部设置命名空间为istio-system,查看istio-ingressgateway右侧80端口的外部端点,然后在浏览器地址栏中输入80端口的入口网关地址/productpage,访问Bookinfo应用。
        多次刷新页面,可以看到页面上显示黑色星星。黑色

步骤五:渐进式发布应用

  1. 进入asm_kubevela文件夹中,执行以下命令,升级reviews应用,并调整流量。
    kubectl apply -f application_rollout-v2.yaml
    • 在application_rollout-v2.yaml文件中更新了reviews镜像,从review v2升级到了review v3版本。并且设置升级的目标实例个数为2个,分两个批次升级,每批升级1个实例。

      ...
          - name: reviews
            type: webservice
            properties:
              image: docker.io/istio/examples-bookinfo-reviews-v3:1.16.2
              port: 9080
              volumes:
                - name: wlp-output
                  type: emptyDir
                  mountPath: /opt/ibm/wlp/output
                - name: tmp
                  type: emptyDir
                  mountPath: /tmp
      
      
            traits:
              - type: expose
                properties:
                  port:
                    - 9080
      
              - type: rollout
                properties:
                  targetSize: 2
                  rolloutBatches:
                    - replicas: 1
                    - replicas: 1
      
              - type: canary-traffic
                properties:
                  port: 9080
      ...
      • targetSize:升级实例的批次。
      • rolloutBatches:每批实例升级的个数。
    • 在application_rollout-v2.yaml文件中设置了以下三个执行工作流:
      1. 设置batchPartition等于0,表示只升级第一批次实例,即将reviews服务的2个Pod中,只升级其中的1个Pod。然后设置traffic.weightedTargets参数,将10%流量导向新升级的reviews服务,90%的流量仍然流向旧版本的服务。
      2. 设置typesuspend,完成第一步工作流后,将暂停工作流。
      3. 设置batchPartition等于1,表示升级第二批次实例,即将reviews服务的2个Pod都升级到v3版本镜像。然后设置traffic.weightedTargets参数,将100%流量导向新升级的reviews服务。
      ...
        workflow:
          steps:
            - name: rollout-1st-batch
              type: canary-rollout
              properties:
                # just upgrade first batch of component
                batchPartition: 0
                traffic:
                  weightedTargets:
                    - revision: reviews-v1
                      weight: 90 # 90% shift to new version
                    - revision: reviews-v2
                      weight: 10 # 10% shift to new version
      
            # give user time to verify part of traffic shifting to newRevision
            - name: manual-approval
              type: suspend
      
            - name: rollout-rest
              type: canary-rollout
              properties:
                # upgrade all batches of component
                batchPartition: 1
                traffic:
                  weightedTargets:
                    - revision: reviews-v2
                      weight: 100 # 100% shift to new version
      ...
  2. 在浏览器地址栏中输入80端口的入口网关地址/productpage,访问Bookinfo应用。
    多次刷新页面,10%概率可以看到红色星星,90%概率看到黑色星星。黑色星星红色星星
  3. 执行以下命令,继续执行工作流,使reviews服务全部升级到v3版本。
    vela workflow resume book-info
  4. 在浏览器地址栏中输入80端口的入口网关地址/productpage,访问Bookinfo应用。
    多次刷新页面,页面上只显示红色星星。说明reviews服务全部升级到v3版本。红色星星

(可选)步骤六:回滚应用

如果发现发布的新版本应用不符合预期,您可以终止发布工作流量,并将应用回滚到之前的版本。

  1. 执行以下命令,回滚应用。
    kubectl apply -f  rollback.yaml
    在rollback.yaml文件中设置typecanary-rollback,会自动进行以下操作:
    • 更新Rollout对象的targetRevisionName成旧的版本,自动回滚所有已发布的新版本的实例回到旧版本,并且保持还没升级的旧版本实例。
    • 更新VirtualService对象的route字段,将所有流量导向旧的版本。
    • 更新DestinationRule对象的subset字段,只容纳旧的版本。
      ...
      workflow:
        steps:
          - name: rollback
            type: canary-rollback
  2. 在浏览器地址栏中输入80端口的入口网关地址/productpage,访问Bookinfo应用。

    多次刷新页面,页面上只显示黑色星星。说明reviews服务回滚到v2版本。

    黑色星星