链接

全链路灰度的组件支持

https://help.aliyun.com/zh/mse/user-guide/component-support-for-the-end-to-end-canary-release-feature?spm=a2c4g.11186623.0.i1

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

去全链路灰