基于MSE云原生网关实现全链路灰度
全链路灰度的组件支持
ack服务接入mse微服务治理中心(可以按ack的ns维度来接入,接入后,ack后续ns里新部署的服务会自动同步到治理中心,已存在的服务需要重新部署才能同步)
# 应用A的基线版本
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-a
namespace: mse-test
spec:
selector:
matchLabels:
app: spring-cloud-a
template:
metadata:
labels:
app: spring-cloud-a
msePilotCreateAppName: spring-cloud-a
msePilotAutoEnable: 'on'
spec:
containers:
- name: spring-cloud-a
image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1
imagePullPolicy: Always
ports:
- containerPort: 20001
livenessProbe:
tcpSocket:
port: 20001
initialDelaySeconds: 30
periodSeconds: 60
env:
- name: spring.cloud.nacos.discovery.server-addr
value: mse-b81dd3c6-nacos-ans.mse.aliyuncs.com
- name: dubbo.registry.address
value: 'nacos://mse-b81dd3c6-nacos-ans.mse.aliyuncs.com:8848'
---
# 应用B的基线版本
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-b
namespace: mse-test
spec:
selector:
matchLabels:
app: spring-cloud-b
template:
metadata:
labels:
app: spring-cloud-b
msePilotCreateAppName: spring-cloud-b
msePilotAutoEnable: 'on'
spec:
containers:
- name: spring-cloud-b
image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-b:3.0.1
imagePullPolicy: Always
ports:
- containerPort: 20002
livenessProbe:
tcpSocket:
port: 20002
initialDelaySeconds: 30
periodSeconds: 60
env:
- name: spring.cloud.nacos.discovery.server-addr
value: mse-b81dd3c6-nacos-ans.mse.aliyuncs.com
- name: dubbo.registry.address
value: 'nacos://mse-b81dd3c6-nacos-ans.mse.aliyuncs.com:8848'
---
# 应用C的基线版本
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-c
namespace: mse-test
spec:
selector:
matchLabels:
app: spring-cloud-c
template:
metadata:
labels:
app: spring-cloud-c
msePilotCreateAppName: spring-cloud-c
msePilotAutoEnable: 'on'
spec:
containers:
- name: spring-cloud-c
image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1
imagePullPolicy: Always
ports:
- containerPort: 20003
livenessProbe:
tcpSocket:
port: 20003
initialDelaySeconds: 30
periodSeconds: 60
env:
- name: spring.cloud.nacos.discovery.server-addr
value: mse-b81dd3c6-nacos-ans.mse.aliyuncs.com
- name: dubbo.registry.address
value: 'nacos://mse-b81dd3c6-nacos-ans.mse.aliyuncs.com:8848'步骤2:通过MSE云原生网关暴露应用A
情况一:新服务
如果您未在云原生网关上添加过应用A,可通过如下操作暴露应用A。(一个网关只能关联一个nacos实例)
登录MSE管理控制台,在服务列表页面创建服务,配置如下。
服务来源:选择MSE Nacos。
命名空间:选择public。
选择服务:选择sc-A。
关于如何创建服务,请参见添加服务。
在服务列表页面的操作列,单击服务sc-A的策略配置。查看sc-A的服务版本配置是否满足如下条件:
版本名称为base。
标签名为opensergo.io/canary。
标签值为空。
正常情况下,云原生网关默认为导入的Nacos的服务添加以上base版本,且base版本的实例数大于0。
在路由配置页面,单击创建路由,为服务sc-A创建路由完成对外暴露。
在请求信息页面,配置路由名称和关联域名,匹配规则选择前缀匹配,其他配置选择默认即可。

在目标服务页面,配置如下:
目标服务选择单服务。
服务选择sc-A,服务的版本选择base。
勾选设置fallback服务,并将其版本设置为不限制,使sc-A达到高可用的目的。


搭建灰度版本
# 应用A的灰度版本
apiVersion: apps/v1 #app版本
kind: Deployment #ack中的资源对象类别(这里是deployment)
metadata: #服务元数据
name: spring-cloud-a-gray #在ack-deployment中显示的服务名
namespace: mse-test #服务所在的namespace
spec:
selector: #选择器相关
matchLabels: #匹配标签
app: spring-cloud-a-gray #ack中的服务名
template: #模板
metadata: #元数据
labels: #标签
alicloud.service.tag: gray
#灰度标签设置为gray,这个字段很重要,base版服务留空,gray版服务需要设置,不然mse建立泳道就无法识别gray服务
app: spring-cloud-a-gray #ack中显示的服务名
msePilotCreateAppName: spring-cloud-a #泳道创建时需要选择的应用名,这个很重要,base、gray的服务都需要设置同一个名称
msePilotAutoEnable: 'on' #这个是mse对接的标识,很重要
spec:
containers:
- name: spring-cloud-a #容器名
image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1 #容器的镜像地址
imagePullPolicy: Always #容器拉取镜像的策略
ports:
- containerPort: 20001
livenessProbe: #live探针配置
tcpSocket:
port: 20001
initialDelaySeconds: 30
periodSeconds: 60
env: #服务注册环境配置
- name: spring.cloud.nacos.discovery.server-addr #指定nacos为服务发现中心
value: mse-b81dd3c6-nacos-ans.mse.aliyuncs.com #nacos的地址
- name: dubbo.registry.address #待确认
value: 'nacos://mse-b81dd3c6-nacos-ans.mse.aliyuncs.com:8848' #nacos的链接地址
---
# 应用C的灰度版本
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-c-gray
namespace: mse-test
spec:
selector:
matchLabels:
app: spring-cloud-c-gray
template:
metadata:
labels:
alicloud.service.tag: gray
app: spring-cloud-c-gray
msePilotCreateAppName: spring-cloud-c
msePilotAutoEnable: 'on'
spec:
containers:
- name: spring-cloud-c
image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1
imagePullPolicy: Always
ports:
- containerPort: 20003
livenessProbe:
tcpSocket:
port: 20003
initialDelaySeconds: 30
periodSeconds: 60
env:
- name: spring.cloud.nacos.discovery.server-addr
value: mse-b81dd3c6-nacos-ans.mse.aliyuncs.com
- name: dubbo.registry.address
value: 'nacos://mse-b81dd3c6-nacos-ans.mse.aliyuncs.com:8848'用模板来自动输出关键字段,使用values.Gray来判断微服务是灰度还



基于自建Spring Cloud Gateway实现全链路灰度
对比云原生网关,需要多部署一个spring cloud gateway 服务和deployment
# Source: mse-simple-demo/templates/spring-cloud-gateway-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-gateway
spec:
replicas: 1
selector:
matchLabels:
app: spring-cloud-gateway
template:
metadata:
labels:
msePilotAutoEnable: "on"
msePilotCreateAppName: "spring-cloud-gateway"
app: spring-cloud-gateway
spec:
containers:
- image: "registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-gateway:3.0.1"
imagePullPolicy: Always
env:
- name: nacos.host
value: "nacos-server"
- name: nacos.namespace
value: "public"
#如果是saas版nacos,需要把上面更换为下面
###saas nacos配置内容###
#- name: spring.cloud.nacos.discovery.server-addr
#value: mse-b81dd3c6-nacos-ans.mse.aliyuncs.com
#- name: dubbo.registry.address
#value: 'nacos://mse-b81dd3c6-nacos-ans.mse.aliyuncs.com:8848'
###saas nacos配置内容###
- name: enable.auto
value: "true"
- name: enable.rpc.invoke
value: "true"
- name: enable.sql
value: "false"
- name: enable.sentinel.demo.flow
value: "true"
name: "spring-cloud-gateway"
resources:
requests:
cpu: 1
memory: 2Gi
limits:
cpu: 1
memory: 2Gi
ports:
- containerPort: 20000
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
topologyKey: failure-domain.beta.kubernetes.io/zone
weight: 50
- podAffinityTerm:
topologyKey: kubernetes.io/hostname
weight: 100
---
# Source: mse-simple-demo/templates/spring-cloud-gateway-service.yaml
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: slb.s1.small
service.beta.kubernetes.io/alicloud-loadbalancer-address-type: internet
name: spring-cloud-gateway-slb
spec:
ports:
- port: 80
protocol: TCP
targetPort: 20000
selector:
app: spring-cloud-gateway
type: LoadBalancer去全链路灰



本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 云架构师夏天
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果