API 网关深度集成火山引擎微服务引擎 Nacos,可实时动态获取 VKE 集群中部署的 Nacos 服务信息,作为 Nacos 服务对外提供服务的流量入口。同时,API 网关提供 Upstream 流量分配,方便用户进行服务的灰度发布,实现敏捷迭代、平滑升级。
本文为您介绍如何通过 API 网关实现 Nacos 蓝绿部署和灰度发布。
容器服务 VKE
已开通容器服务。
已创建 VKE 集群,具体操作请参见 创建集群。
微服务引擎
已创建治理中心,详情请参见 创建治理中心。
已创建实例,详情请参见 创建实例。
已创建命名空间,具体操作请参见 创建命名空间。
已创建服务,具体操作请参见 创建服务。
已创建 Nacos 用户,详情请参见 创建 Nacos 用户。
API 网关
部署 v1 应用,并通过 API 网关对外提供服务。
使用以下 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
将当前 Nacos 应用所在注册中心导入 API 网关。具体操作可参见 导入 MSE Nacos 信息。
将该 VKE 集群中 default 命名空间下的 sprint-cloud 服务抽象为一个 Upstream。具体操作请参见 创建注册中心类型 Upstream。
为该 Upstream 添加 version: v1
版本标识。该标识对应 Nacos 服务中对应的 metadata(key:value),用于区分应用的不同版本。具体操作请参见 添加 Upstream 版本。 添加完成后, v1 应用即对应当前 Upstream 的 version1。
创建一条路由规则,将 sprint-cloud 暴露给外部用户。具体操作请参见 创建路由。 请求路径为/version
,目标 Upstream 为 spring-cloud version1,权重为 100%。
执行以下测试请求命令:
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,符合预期。
允许引流一小部分流量到服务新版本,待验证通过后,逐步调大流量,直至切流完毕,期间可伴随着新版本的扩容,旧版本的缩容操作,达到资源利用率最大化。
使用以下 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
(可选)如果 v2 应用跨集群部署,需将 v2 应用所在 VKE 集群导入同一 API 网关实例。导入成功后,之前创建的 Upstream 将同时监听这两个集群的 default 命名空间下的 spring-cloud 服务。具体操作请参见 导入 MSE Nacos 信息。
为之前创建的 Upstream 添加 version: v2
版本标识。具体操作可参见 添加 Upstream 版本。添加完成后, v1 应用对应当前 Upstream 的 version1,v2 应用对应当前 Upstream 的 version2。
修改之前创建的路由规则,将流量按所需权重转发至新旧版本。具体操作可参见 管理路由。 本示例设置 v1 应用权重为 80%,v2 应用权重为 20%。
将 spring-cloud version1 的权重修改为 80%。
目标 Upstream 新增 spring-cloud version2,并将 version2 的权重配置为 20%。
执行以下测试请求命令:
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,流量比符合期望比例。
在真实业务场景中,新版本验证完毕后,便可继续调大访问新版本的流量权重。期间注意对新版本扩容,按需对旧版本缩容。