1 - 蓝绿发布

什么是蓝绿发布

蓝绿部署是一种应用发布模式,可将用户流量从先前版本的应用或微服务全量转移到新版本中(两者均保持在生产环境中运行)。

旧版本可以称为蓝色环境,而新版本则可称为绿色环境。一旦生产流量从蓝色完全转移到绿色,蓝色就可以在回滚或退出生产的情况下保持待机,也可以更新成为下次更新的模板。

蓝绿发布的适用场景

  • 机器资源有富余或者可以按需分配
  • 单体应用、调用复杂度不高的业务系统
  • 对用户体验具备一定的容忍度

北极星如何支持蓝绿发布

蓝绿发布需要依赖几个关键的技术点:

  • 流量入口侧需要支持按百分比进行流量切换,并对灰度流量进行染色(打上灰度标签)。
  • 微服务框架需要支持灰度标签的透传。
  • 服务治理中心支持灰度流量只路由到灰度版本的服务中,非灰度流量只路由到原版本服务中 。

北极星提供以下功能,支持蓝绿发布:

  • 网关直通微服务:北极星支持直接打通网关到微服务的链路(支持主流网关Envoy/Kong/Nginx/Spring Cloud Gateway),网关侧可以直接将流量打通到微服务的节点/POD,无需通过ClusterIP来中转。
  • 提供自定义路由能力,支持流量按标签(版本等)进行路由。
  • 微服务框架SpringCloudTencent,以及流量代理Envoy支持流量标签透传能力。

北极星支持Spring Cloud Tencent以及服务网格(Envoy)的方式接入使用蓝绿发布的能力。

前置条件

部署polaris

如果已经部署好了polaris,可忽略这一步。

polaris支持在kubernetes环境中进行部署,注意必须保证暴露HTTP端口为8090,gRPC端口为8091。具体部署方案请参考:

阶段一:实例打标

Spring Cloud Tencent 接入

打标实例版本号

Spring Cloud Tencent支持通过以下2种方式进行实例的版本号打标:

  • 方式一:配置文件

在服务实例的配置文件中添加配置,如在 bootstrap.yml 添加如下所示即可:

spring:
  cloud:
    tencent:
      metadata:
        content:
          version: 2.0.0
  • 方式二:环境变量

在服务实例所在的操作系统中添加环境变量也可进行打标,例如:SCT_METADATA_CONTENT_version=2.0.0

打标灰度标签透传

由于Spring Cloud默认不会对所有的请求标签进行透传,因此需要增加Spring Cloud透传标识,可以通过添加环境变量SCT_PROTOCOL_CONTENT_TRANSITIVE_HEADER=gray的方式,进行灰度标识gray:true的透传。

Envoy Proxy 接入

应用需要基于K8S进行部署,才可以使用Envoy Proxy的接入模式。

实例的版本标签需要通过POD标签的方式打入,然后在部署过程中,北极星的controller会自动把POD标签同步到北极星。

可以在K8S的部署配置中,在template配置中,添加labels的方式完成版本打标。可参考这里的部署配置:微服务部署配置

spec:
  template:
    metadata:
      labels:
        app: user
        version: 2.0.0

阶段二:部署应用

Spring Cloud Tencent 接入

支持虚拟机、Docker Composer、K8S等多种部署模式,注意需要保证业务进程与北极星服务的网络连通性。

Envoy Proxy 接入

只支持K8S的部署模式,同时,为了实现POD标签的自动同步,以及Envoy Proxy的自动注入,需要预先部署K8s Controller组件。具体部署方案请参考:

阶段三:网关路由&染色

网关作为流量入口,配置网关路由的目标主要是为了可以将流量按比例进行切分到不同版本的微服务中去,同时通过流量打标的方式,将路由到新版本的请求,在Header上打入gray:true的标签,便于后续微服务按照标签进行路由。

用户可以使用任意对接了北极星服务发现的网关进行操作(Envoy, Nginx, Kong等),这里给出Envoy的VirtualHost路由配置,便于大家理解,具体配置可以参考LDS配置

virtual_hosts:
- name: local_service
domains:
- "*"
routes:              
- match:
	prefix: "/"
  route:
	weighted_clusters:
	  total_weight: 100
	  clusters:
	  - name: user
		weight: 80
		metadata_match:
		  filter_metadata:
			envoy.lb:
			  version: 1.0.0
	  - name: user
		weight: 20
		request_headers_to_add:
		- header:
			key: gray
			value: "true"
		metadata_match:
		  filter_metadata:
			envoy.lb:
			  version: 2.0.0   

阶段四:微服务路由

通过配置微服务路由,目标是使得对于灰度流量的调用,都只在新版本的服务分组中进行。

打开北极星控制台,通过点击侧边栏:动态路由->自定义规则页面,配置自定义路由规则,规则可配置对命名空间下全部服务生效。

  • 配置灰度规则,使得header中带有gray:true灰度标签的流量都只流向version=2.0.0的分组:

  • 配置兜底规则,使得不带灰度标签的流量都只流向version=1.0.0的分组:

阶段五:观察监控并查看流量的灰度过程

通过北极星的可观测性能力,可以准确看到不同分组的流量切换的过程,以及服务调用成功率,等到所有流量都切换到新版本分组以及没有失败请求,代表灰度完成。

阶段六:灰度完成的收尾动作

灰度完成后,需要做以下事情:

  • 对老版本分组的实例进行缩容下线
  • 删除网关的路由规则
  • 在北极星控制台删除自定义路由规则

一键部署体验

北极星提供了一键部署demo,可以通过一键部署demo快速体验蓝绿发布。详细请参考:

2 - 金丝雀发布

什么是金丝雀发布

金丝雀发布是已经将新版本应用部署到生产环境了,然后根据一定的特征,一般是用户ID、用户地域、用户类型等不同维度,允许部分用户使用部署到生产环境上的新版本应用。这个过程中,通过观察新版本的表现(比如成功率、时延、负载等),以判断新版本是否符合预期。

金丝雀发布的适用场景

  • 用户体验不能中断的业务
  • 微服务业务的独立服务的特性变更

北极星如何支持金丝雀发布

金丝雀发布需要依赖几个关键的技术点:

  • 微服务框架需要支持灰度标签的透传。
  • 服务治理中心支持将灰度用户的流量只路由到灰度版本的服务中,其他流量只路由到原版本服务中 。

北极星提供以下功能,支持金丝雀发布:

  • 提供自定义路由能力,支持流量按标签(版本等)进行路由。
  • 微服务框架SpringCloudTencent,以及流量代理Envoy支持流量标签透传能力。

北极星支持Spring Cloud Tencent以及服务网格(Envoy)的方式接入使用金丝雀发布的能力。

前置条件

部署polaris

如果已经部署好了polaris,可忽略这一步。

polaris支持在kubernetes环境中进行部署,注意必须保证暴露HTTP端口为8090,gRPC端口为8091。具体部署方案请参考:

阶段一:实例打标

Spring Cloud Tencent 接入

打标实例版本号

Spring Cloud Tencent支持通过以下2种方式进行实例的版本号打标:

  • 方式一:配置文件

在服务实例的配置文件中添加配置,如在 bootstrap.yml 添加如下所示即可:

spring:
  cloud:
    tencent:
      metadata:
        content:
          version: 2.0.0
  • 方式二:环境变量

在服务实例所在的操作系统中添加环境变量也可进行打标,例如:SCT_METADATA_CONTENT_version=2.0.0

打标灰度标签透传

由于Spring Cloud默认不会对所有的请求标签进行透传,因此需要增加Spring Cloud透传标识,可以通过添加环境变量SCT_PROTOCOL_CONTENT_TRANSITIVE_HEADER=gray的方式,进行灰度标识gray:true的透传。

Envoy Proxy 接入

应用需要基于K8S进行部署,才可以使用Envoy Proxy的接入模式。

实例的版本标签需要通过POD标签的方式打入,然后在部署过程中,北极星的controller会自动把POD标签同步到北极星。

可以在K8S的部署配置中,在template配置中,添加labels的方式完成版本打标。可参考这里的部署配置:微服务部署配置

spec:
  template:
    metadata:
      labels:
        app: user
        version: 2.0.0

阶段二:部署应用

Spring Cloud Tencent 接入

支持虚拟机、Docker Composer、K8S等多种部署模式,注意需要保证业务进程与北极星服务的网络连通性。

Envoy Proxy 接入

只支持K8S的部署模式,同时,为了实现POD标签的自动同步,以及Envoy Proxy的自动注入,需要预先部署北极星的Controller组件(polaris-controller)。具体部署方案请参考:

阶段三:微服务路由

通过配置微服务路由,目标是使得对于灰度流量的调用,都只在新版本的服务分组中进行。

打开北极星控制台,通过点击侧边栏:动态路由->自定义规则页面,配置自定义路由规则,规则只对credit服务生效。

  • 配置灰度规则,使得header中带有gray:true灰度标签的流量都只流向version=2.0.0的分组:

  • 配置兜底规则,使得不带灰度标签的流量都流向其他版本分组:

阶段四:观察监控并查看流量的灰度过程

通过北极星的可观测性能力,可以准确看到不同分组的流量切换的过程,以及服务调用成功率,等到灰度分组相关指标没有问题,代表灰度验证完成。

阶段五:灰度完成的收尾动作

灰度验证完成后,需要做以下事情:

  • 对老版本分组的实例进行滚动升级到新版本
  • 在北极星控制台删除自定义路由规则

一键部署体验

北极星提供了一键部署demo,可以通过一键部署demo快速体验蓝绿发布。详细请参考:

3 - 全链路灰度-场景1

什么是全链路灰度

微服务架构下,有些开发需求,微服务调用链路上的多个微服务同时发生了改动,通常每个微服务都会有灰度环境或分组来接收灰度流量。此时希望通过进入上游灰度环境的流量,也能进入下游灰度的环境中,确保1个请求始终在灰度环境中传递。

全链路灰度适用场景

  • 用户体验不能中断的业务。
  • 微服务业务的存在关联关系的多个微服务的特性变更。

全链路灰度的实现方案

可以基于域名分离的方式实现全链路灰度,通过不同的域名区分灰度环境和稳定环境。用户的请求通过灰度域名访问到灰度版本的服务,通过稳定域名访问到稳定版本的服务。

灰度请求通过灰度域名接入到网关,网关通过域名识别到灰度请求后,将请求优先路由到灰度版本的服务,并通过请求头的方式进行灰度染色。后续微服务之间,服务框架通过请求头识别到灰度请求,会优先将请求路由到灰度版本服务,如果寻址不到灰度版本,则路由到稳定版本服务。

前置条件

部署polaris

如果已经部署好了polaris,可忽略这一步。

polaris支持在kubernetes环境中进行部署,注意必须保证暴露HTTP端口为8090,gRPC端口为8091。具体部署方案请参考:

阶段一:实例打标

Spring Cloud Tencent 接入

打标实例版本号

Spring Cloud Tencent支持通过以下2种方式进行实例的版本号打标:

  • 方式一:配置文件

在服务实例的配置文件中添加配置,如在 bootstrap.yml 添加如下所示即可:

spring:
  cloud:
    tencent:
      metadata:
        content:
          version: 2.0.0
  • 方式二:环境变量

在服务实例所在的操作系统中添加环境变量也可进行打标,例如:SCT_METADATA_CONTENT_version=2.0.0

打标灰度标签透传

由于Spring Cloud默认不会对所有的请求标签进行透传,因此需要增加Spring Cloud透传标识,可以通过添加环境变量SCT_TRAFFIC_CONTENT_RAW_TRANSHEADERS=gray的方式,进行灰度标识gray:true的透传。

Envoy Proxy 接入

应用需要基于K8S进行部署,才可以使用Envoy Proxy的接入模式。

实例的版本标签需要通过POD标签的方式打入,然后在部署过程中,北极星的controller会自动把POD标签同步到北极星。

可以在K8S的部署配置中,在template配置中,添加labels的方式完成版本打标。可参考这里的部署配置:微服务部署配置

spec:
  template:
    metadata:
      labels:
        app: user
        version: 2.0.0

阶段二:部署应用

Spring Cloud Tencent 接入

支持虚拟机、Docker Composer、K8S等多种部署模式,注意需要保证业务进程与北极星服务的网络连通性。

Envoy Proxy 接入

只支持K8S的部署模式,同时,为了实现POD标签的自动同步,以及Envoy Proxy的自动注入,需要预先部署北极星的Controller组件(polaris-controller)。具体部署方案请参考:

阶段三:网关路由&染色

网关作为流量入口,配置网关路由的目标主要是为了可以将通过灰度域名接入的流量,导入到灰度版本的下游微服务上,同时通过流量打标的方式,将路由到灰度版本的请求,在Header上打入gray:true的标签,便于后续微服务按照标签进行路由。

配置域名切流量的规则

用户可以使用任意对接了北极星服务发现的网关进行操作(Envoy, Nginx, Kong等),这里给出Envoy的VirtualHost路由配置,便于大家理解,具体配置可以参考LDS配置

virtual_hosts:
- name: local_service
  domains:
  - "*"
  routes:              
  - match:
	  prefix: "/"
    route:
	  weighted_clusters:
	    total_weight: 100
	    clusters:
	    - name: user
		  weight: 80
		  metadata_match:
		    filter_metadata:
			  envoy.lb:
			    version: 1.0.0
	    - name: user
		  weight: 20
		  request_headers_to_add:
		  - header:
			  key: gray
			  value: "true"
		  metadata_match:
		    filter_metadata:
			  envoy.lb:
			    version: 2.0.0

阶段四:微服务路由

通过配置微服务路由,目标是使得对于灰度流量的调用,都只在新版本的服务分组中进行。

打开北极星控制台,通过点击侧边栏:动态路由->自定义规则页面,配置自定义路由规则,规则可配置对命名空间下全部服务生效。

  • 配置灰度规则,使得header中带有gray:true灰度标签的流量都只流向version=2.0.0的分组:

  • 配置兜底规则,使得不带灰度标签的流量都只流向version=1.0.0的分组:

阶段五:观察监控并查看流量的灰度过程

通过北极星的可观测性能力,可以准确看到不同分组的流量切换的过程,以及服务调用成功率,等到所有流量都切换到新版本分组以及没有失败请求,代表灰度完成。

阶段六:灰度完成的收尾动作

灰度完成后,需要做以下事情:

  • 对老版本分组的实例进行缩容下线
  • 删除网关的路由规则
  • 在北极星控制台删除自定义路由规则

一键部署体验

北极星提供了一键部署demo,可以通过一键部署demo快速体验蓝绿发布。详细请参考:

4 - 全链路灰度-场景2

什么是全链路灰度

微服务架构下,有些开发需求,微服务调用链路上的多个微服务同时发生了改动,通常每个微服务都会有灰度环境或分组来接收灰度流量。此时希望通过进入上游灰度环境的流量,也能进入下游灰度的环境中,确保1个请求始终在灰度环境中传递。

全链路灰度适用场景

  • 用户体验不能中断的业务。
  • 微服务业务的存在关联关系的多个微服务的特性变更。

全链路灰度的实现方案

灰度环境和稳定环境对外只暴露一个域名,系统基于特定的请求标识(UID等)识别到灰度请求,并将灰度请求优化路由到灰度环境。

针对UID=2000的请求进行灰度,灰度请求接入到网关后,网关通过特定UID识别到灰度请求后,将请求优先路由到灰度版本的服务,并将UID透传到下一跳服务中。后续微服务之间,服务框架通过UID识别到灰度请求,会优先将请求路由到灰度版本服务,如果寻址不到灰度版本,则路由到稳定版本服务,UID的请求头会随着微服务调用每一级进行透传。

前置条件

部署polaris

如果已经部署好了polaris,可忽略这一步。

polaris支持在kubernetes环境中进行部署,注意必须保证暴露HTTP端口为8090,gRPC端口为8091。具体部署方案请参考:

阶段一:实例打标

Spring Cloud Tencent 接入

打标实例版本号

Spring Cloud Tencent支持通过以下2种方式进行实例的版本号打标:

  • 方式一:配置文件

在服务实例的配置文件中添加配置,如在 bootstrap.yml 添加如下所示即可:

spring:
  cloud:
    tencent:
      metadata:
        content:
          version: 2.0.0
  • 方式二:环境变量

在服务实例所在的操作系统中添加环境变量也可进行打标,例如:SCT_METADATA_CONTENT_version=2.0.0

打标灰度标签透传

由于Spring Cloud默认不会对所有的请求标签进行透传,因此需要增加Spring Cloud透传标识,可以通过添加环境变量SCT_TRAFFIC_CONTENT_RAW_TRANSHEADERS=uid的方式,进行灰度标识uid:200的透传。

Envoy Proxy 接入

应用需要基于K8S进行部署,才可以使用Envoy Proxy的接入模式。

实例的版本标签需要通过POD标签的方式打入,然后在部署过程中,北极星的controller会自动把POD标签同步到北极星。

可以在K8S的部署配置中,在template配置中,添加labels的方式完成版本打标。可参考这里的部署配置:微服务部署配置

spec:
  template:
    metadata:
      labels:
        app: user
        version: 2.0.0

阶段二:部署应用

Spring Cloud Tencent 接入

支持虚拟机、Docker Composer、K8S等多种部署模式,注意需要保证业务进程与北极星服务的网络连通性。

Envoy Proxy 接入

只支持K8S的部署模式,同时,为了实现POD标签的自动同步,以及Envoy Proxy的自动注入,需要预先部署北极星的Controller组件(polaris-controller)。具体部署方案请参考:

阶段三:网关路由&染色

网关作为流量入口,配置网关路由的目标主要是为了可以将灰度用户的请求,路由灰度版本的微服务中去。

按标签切流量

用户可以使用任意对接了北极星服务发现的网关进行操作(Envoy, Nginx, Kong等),这里给出Envoy的VirtualHost路由配置,便于大家理解,具体配置可以参考LDS配置

virtual_hosts:
- name: gray_service
  domains:
	- base.service.com
  routes:
	- match:
		prefix: /
		headers:
		  - name: uid
			exact_match: '200'
	  route:
		cluster: user
		metadata_match:
		  filter_metadata:
			envoy.lb:
			  version: v2.0.0
	  request_headers_to_add:
		- header:
			key: gray
			value: 'true'
	- match:
		prefix: /
	  route:
		cluster: user
		metadata_match:
		  filter_metadata:
			envoy.lb:
			  version: v1.0.0     

阶段四:微服务路由

通过配置微服务路由,目标是使得对于灰度流量的调用,都只在新版本的服务分组中进行。

打开北极星控制台,通过点击侧边栏:动态路由->自定义规则页面,配置自定义路由规则,规则可配置对命名空间下全部服务生效。

  • 配置灰度规则,使得header中带有uid:200灰度标签的流量都只流向version=2.0.0的分组:

  • 配置兜底规则,使得不带灰度标签的流量都只流向version=1.0.0的分组:

阶段五:观察监控并查看流量的灰度过程

通过北极星的可观测性能力,可以准确看到不同分组的流量切换的过程,以及服务调用成功率,等到所有流量都切换到新版本分组以及没有失败请求,代表灰度完成。

阶段六:灰度完成的收尾动作

灰度完成后,需要做以下事情:

  • 对老版本分组的实例进行缩容下线
  • 删除网关的路由规则
  • 在北极星控制台删除自定义路由规则

一键部署体验

北极星提供了一键部署demo,可以通过一键部署demo快速体验蓝绿发布。详细请参考: