You need to enable JavaScript to run this app.
导航
通过控制台实现 Nacos 蓝绿部署和灰度发布
最近更新时间:2024.08.05 11:30:18首次发布时间:2024.08.05 11:30:18

API 网关深度集成火山引擎微服务引擎 Nacos,可实时动态获取 VKE 集群中部署的 Nacos 服务信息,作为 Nacos 服务对外提供服务的流量入口。同时,API 网关提供 Upstream 流量分配,方便用户进行服务的灰度发布,实现敏捷迭代、平滑升级。
本文为您介绍如何通过 API 网关实现 Nacos 蓝绿部署和灰度发布。

前提条件

步骤一:部署应用

部署 v1 应用,并通过 API 网关对外提供服务。

  1. 使用以下 YAML 样例,在容器服务控制台目标集群的 default 命名空间下部署一个 Nacos 服务 sprint-cloud。具体操作可参见 创建无状态负载集群内访问(ClusterIP)

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: apig-test-nacos-v1
      name: apig-test-nacos-v1
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: apig-test-nacos-v1
      template:
        metadata:
          labels:
            app: apig-test-nacos-v1
        spec:
          containers:
          - env:
            - name: NACOS_SERVERS
              value: 100.67.226.159:8848
            - name: NACOS_NAMESPACE
              value: public
            - name: NACOS_GROUP
              value: DEFAULT_GROUP
            - name: NACOS_SERVICE
              value: sprint-cloud
            - name: SERVICE_PORT
              value: "80"
            - name: NACOS_USERNAME
              value: nacos
            - name: NACOS_PASSWORD
              value: nacos
            - name: MATEDATA_VALUE
              value: v1
            image: "cr-apig-cn-beijing.cr.volces.com/apig-demo/nacos-demo:latest"
            imagePullPolicy: IfNotPresent
            livenessProbe:
              failureThreshold: 3
              httpGet:
                path: /
                port: 80
                scheme: HTTP
              initialDelaySeconds: 1
              periodSeconds: 10
              successThreshold: 1
              timeoutSeconds: 1
            name: apig-test-demo
            ports:
            - containerPort: 80 # python-server-http-80
    
  2. 将当前 Nacos 应用所在注册中心导入 API 网关。具体操作可参见 导入 MSE Nacos 信息

  3. 将该 VKE 集群中 default 命名空间下的 sprint-cloud 服务抽象为一个 Upstream。具体操作请参见 创建注册中心类型 Upstream

  4. 为该 Upstream 添加 version: v1 版本标识。该标识对应 Nacos 服务中对应的 metadata(key:value),用于区分应用的不同版本。具体操作请参见 添加 Upstream 版本。 添加完成后, v1 应用即对应当前 Upstream 的 version1。

  5. 创建一条路由规则,将 sprint-cloud 暴露给外部用户。具体操作请参见 创建路由。 请求路径为/version,目标 Upstream 为 spring-cloud version1,权重为 100%。


  6. 执行以下测试请求命令:

    for i in `seq 1 10`;do curl ${您的网关服务访问域名}/version;echo;done
    

    响应结果:

    {"code": 200, "message": "version: v1"}
    {"code": 200, "message": "version: v1"}
    {"code": 200, "message": "version: v1"}
    {"code": 200, "message": "version: v1"}
    {"code": 200, "message": "version: v1"}
    {"code": 200, "message": "version: v1"}
    {"code": 200, "message": "version: v1"}
    {"code": 200, "message": "version: v1"}
    {"code": 200, "message": "version: v1"}
    {"code": 200, "message": "version: v1"}
    

    可以发现,所有请求均转发至 v1,符合预期。

步骤二:发布新版本

允许引流一小部分流量到服务新版本,待验证通过后,逐步调大流量,直至切流完毕,期间可伴随着新版本的扩容,旧版本的缩容操作,达到资源利用率最大化。

  1. 使用以下 YAML 样例,在容器服务控制台目标集群的 default 命名空间下部署 spring-cloud 服务的新版本 v2。灰度发布策略中,新版本的副本数无需与原始保持一致,仅需保持资源始终满足灰度流量,故将副本数调为 1。

    注意

    v2 应用支持同集群部署和跨集群部署。

    • 同集群部署时,需部署在同一集群同一命名空间下。

    • 跨集群部署时,需部署在跨集群的同名命名空间下。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: apig-test-nacos-v2
      name: apig-test-nacos-v2
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: apig-test-nacos-v2
      template:
        metadata:
          labels:
            app: apig-test-nacos-v2
        spec:
          containers:
          - env:
            - name: NACOS_SERVERS
              value: 100.67.226.159:8848
            - name: NACOS_NAMESPACE
              value: public
            - name: NACOS_GROUP
              value: DEFAULT_GROUP
            - name: NACOS_SERVICE
              value: sprint-cloud
            - name: SERVICE_PORT
              value: "80"
            - name: NACOS_USERNAME
              value: nacos
            - name: NACOS_PASSWORD
              value: nacos
            - name: MATEDATA_VALUE
              value: v2
            image: "cr-apig-cn-beijing.cr.volces.com/apig-demo/nacos-demo:latest"
            imagePullPolicy: IfNotPresent
            livenessProbe:
              failureThreshold: 3
              httpGet:
                path: /
                port: 80
                scheme: HTTP
              initialDelaySeconds: 1
              periodSeconds: 10
              successThreshold: 1
              timeoutSeconds: 1
            name: apig-test-demo
            ports:
            - containerPort: 80
    
  2. (可选)如果 v2 应用跨集群部署,需将 v2 应用所在 VKE 集群导入同一 API 网关实例。导入成功后,之前创建的 Upstream 将同时监听这两个集群的 default 命名空间下的 spring-cloud 服务。具体操作请参见 导入 MSE Nacos 信息

  3. 为之前创建的 Upstream 添加 version: v2 版本标识。具体操作可参见 添加 Upstream 版本。添加完成后, v1 应用对应当前 Upstream 的 version1,v2 应用对应当前 Upstream 的 version2。

  4. 修改之前创建的路由规则,将流量按所需权重转发至新旧版本。具体操作可参见 管理路由。 本示例设置 v1 应用权重为 80%,v2 应用权重为 20%。

    1. 将 spring-cloud version1 的权重修改为 80%。

    2. 目标 Upstream 新增 spring-cloud version2,并将 version2 的权重配置为 20%。

  5. 执行以下测试请求命令:

    for i in `seq 1 10`;do curl ${您的网关服务访问域名}/version;echo;done
    

    响应结果:

    for i in 
    `seq 1 10`
    ;do curl sch51h4dt82rcefali1qg.apigateway-cn-beijing.volceapi.com/version;echo;done
    {"code": 200, "message": "version: v1"}
    {"code": 200, "message": "version: v1"}
    {"code": 200, "message": "version: v2"}
    {"code": 200, "message": "version: v1"}
    {"code": 200, "message": "version: v2"}
    {"code": 200, "message": "version: v1"}
    {"code": 200, "message": "version: v1"}
    {"code": 200, "message": "version: v1"}
    {"code": 200, "message": "version: v1"}
    {"code": 200, "message": "version: v1"}
    

    可以发现,10 个请求中有 2 个请求转发至新版本 v2,流量比符合期望比例。

    在真实业务场景中,新版本验证完毕后,便可继续调大访问新版本的流量权重。期间注意对新版本扩容,按需对旧版本缩容。