Todos os produtos
Search
Central de documentação

Microservices Engine:Configure a liberação canary de ponta a ponta com um gateway ALB

Última atualização: Aug 27, 2026

Em arquiteturas de microsserviços, o desenvolvimento de recursos frequentemente exige alterações em vários services. Para testar essas mudanças, cada service costuma ter um ambiente canary para processar parte do tráfego. Este guia mostra como garantir que uma solicitação, após ser roteada para um ambiente canary, permaneça nele durante toda a cadeia de chamadas. Mesmo que alguns services na cadeia não tenham uma versão canary, as solicitações são encaminhadas corretamente para o ambiente canary do próximo service downstream disponível. Ao combinar o roteamento flexível de um gateway de Ingress do Application Load Balancer (ALB) da Alibaba Cloud e a capacidade de liberação canary de ponta a ponta do MSE Microservices Governance, você implementa esse padrão sem alterar o código da aplicação.

Procedimento

image

Observações de uso

  • Se você utilizar o plug-in de rede Flannel, o Service de backend do gateway de Ingress ALB suporta apenas os tipos NodePort e LoadBalancer.

  • O vSwitch da instância ALB deve estar na mesma VPC (Virtual Private Cloud) do cluster ACK. Para mais informações sobre as regiões suportadas pelo ALB, consulte Supported regions and zones.

Caso de uso: Liberação canary de ponta a ponta com roteamento por domínio

Neste caso de uso, a arquitetura da aplicação consiste em um gateway de Ingress ALB e uma arquitetura de microsserviços Spring Cloud no backend. A cadeia de chamadas do backend envolve três services: um centro de transações (Aplicação A), um product center (Aplicação B) e um centro de inventário (Aplicação C). O acesso aos services de backend ocorre por meio de um cliente ou HTML. Um servidor Nacos realiza a descoberta de services entre essas aplicações.

Use nomes de domínio diferentes para distinguir os ambientes base e canary. Por exemplo, acesse www.example.com para solicitar o ambiente canary e www.aliyundoc.com para solicitar o ambiente base.

Conforme ilustrado na figura a seguir, a cadeia de chamadas é Ingress-ALB > A > B > C. A Aplicação A pode ser uma aplicação Spring Boot.

场景

Antes de começar

Criar um cluster Kubernetes

Crie um cluster Kubernetes versão 1,18 ou posterior. Para mais informações, consulte Create an ACK managed cluster ou Create an ACK dedicated cluster (discontinued).

Conectar-se a um cluster ACK com kubectl

Conecte-se ao cluster ACK usando kubectl. Para mais informações, consulte Connect to an ACK cluster using kubectl.

Instalar o componente ALB Ingress Controller

Instale o componente ALB Ingress Controller no seu cluster ACK. Utilize um dos métodos a seguir:

  • Ao criar um cluster ACK, selecione ALB Ingress no campo Ingress na página Component Configuration para instalar o componente ALB Ingress Controller.

  • Caso já possua um cluster ACK, instale o componente ALB Ingress Controller na página Add-ons. Para mais informações, consulte Manage add-ons.

Ativar o MSE Microservices Governance

  1. Na página de ativação do MSE Microservices Governance, ative o Microservices Governance Professional Edition.

    Para mais detalhes sobre o faturamento do MSE Microservices Governance, consulte Billing of MSE Microservices Governance.

  2. Ative o Microservices Governance para as aplicações de microsserviços no cluster Container Service for Kubernetes (ACK). Escolha o método mais adequado às suas necessidades de negócio. Para mais informações, consulte Enable Microservices Governance for Java microservice applications in an ACK or ACS cluster.

    Ativar o Microservices Governance para aplicações em um namespace ACK

    1. Faça login no console MSE e selecione uma região na barra de navegação superior.

    2. No painel de navegação à esquerda, escolha Microservices Governance > Application Governance.

    3. Na página Application list, clique em ACK Application Access.

    4. Na caixa de diálogo ACK Application Access, configure os parâmetros e clique em OK.

      Defina Onboarding Type como Namespace ou Single Application. Na lista suspensa Container Cluster Namespace, selecione o namespace desejado, como default. No campo Governance Namespace, insira um nome para o namespace correspondente.

      Parâmetro

      Descrição

      Cluster type

      Selecione ACK Cluster, ACK Serverless Cluster ou ACS Cluster.

      Nota

      Caso ainda não tenha autorizado o Container Service for Kubernetes a chamar o MSE, clique em Authorize Now para conceder as permissões necessárias.

      Cluster Name/ID

      Selecione o Cluster Name/ID do cluster que deseja conectar ao centro de governança do MSE. É possível buscar o cluster por palavra-chave.

      ack-onepilot

      Exibe o status do componente ack-onepilot. Para mais informações sobre este componente e como atualizá-lo, consulte ack-onepilot component e Install and upgrade the MSE microservices governance component.

      • Se o ack-onepilot não estiver instalado, o sistema inicia automaticamente a instalação após a seleção de um cluster e exibe a mensagem "The installation process takes about 1 minute. Wait for a while."

        Caso utilize um usuário RAM e receba um erro de permissão, faça login no console do Container Service for Kubernetes. Acesse o cluster desejado e, no painel de navegação à esquerda, clique em Add-ons. Localize o ack-onepilot e clique em Install.

      • Se o ack-onepilot já estiver instalado, a interface exibirá a versão instalada, por exemplo, Installed 4.2.0.

      Nota
      • Para visualizar detalhes sobre o componente ack-onepilot, faça login no console do Container Service for Kubernetes, navegue até o cluster alvo e escolha Operations > Add-ons.

      • Após a instalação do ack-onepilot, ele injeta automaticamente um agente Java. Isso pode aumentar o tempo de inicialização da aplicação em até 10 segundos.

      • Ao conectar por namespace, se o cluster alvo não estiver em uma das regiões listadas, garanta que ele tenha acesso à rede pública e possa se conectar a acm.aliyun.com:8080: China (Qingdao), China (Hangzhou), China (Beijing), China (Shanghai), Shanghai Finance Cloud, China (Shenzhen), Hong Kong (China), Singapore, Germany (Frankfurt), Australia (Sydney), US (Silicon Valley) e US (Virginia).

      Access Type

      Selecione Namespace Access.

      Cluster Namespace

      Selecione o Cluster Namespace.

      Microservices Governance Namespace

      Selecione um Microservices Governance Namespace.

    Ativar o Microservices Governance para uma aplicação

    1. Faça login no console MSE e selecione uma região na barra de navegação superior.

    2. No painel de navegação à esquerda, escolha Microservices Governance > Application Governance.

    3. Na página Application list, clique em ACK Application Access.

    4. Na caixa de diálogo ACK Application Access, configure os parâmetros e clique em OK.

      Defina Onboarding Type como Single Application. Na seção Edit Labels (YAML format), adicione os seguintes rótulos sob spec.template.metadata.labels no arquivo YAML do Deployment da aplicação: msePilotAutoEnable: "on" para ativar a governança de microsserviços, mseNamespace: default para especificar o namespace MSE e msePilotCreateAppName: "your-deployment-name" para definir o nome da aplicação. Substitua your-deployment-name pelo nome real do Deployment.

      Parâmetro

      Descrição

      Cluster type

      Selecione ACK Cluster, ACK Serverless Cluster ou ACS Cluster.

      Nota

      Caso ainda não tenha autorizado o Container Service for Kubernetes a chamar o MSE, clique em Authorize Now para conceder as permissões necessárias.

      Cluster Name/ID

      Selecione o Cluster Name/ID do cluster que deseja conectar ao centro de governança do MSE. É possível buscar o cluster por palavra-chave.

      ack-onepilot

      Exibe o status do componente ack-onepilot. Para mais informações sobre este componente e como atualizá-lo, consulte ack-onepilot component e Install and upgrade the MSE microservices governance component.

      • Se o ack-onepilot não estiver instalado, o sistema inicia automaticamente a instalação após a seleção de um cluster e exibe a mensagem "The installation process takes about 1 minute. Wait for a while."

        Caso utilize um usuário RAM e receba um erro de permissão, faça login no console do Container Service for Kubernetes. Acesse o cluster desejado e, no painel de navegação à esquerda, clique em Add-ons. Localize o ack-onepilot e clique em Install.

      • Se o ack-onepilot já estiver instalado, a interface exibirá a versão instalada, por exemplo, Installed 4.2.0.

      Nota
      • Para visualizar detalhes sobre o componente ack-onepilot, faça login no console do Container Service for Kubernetes, navegue até o cluster alvo e escolha Operations > Add-ons.

      • Após a instalação do ack-onepilot, ele injeta automaticamente um agente Java. Isso pode aumentar o tempo de inicialização da aplicação em até 10 segundos.

      • Ao conectar por namespace, se o cluster alvo não estiver em uma das regiões listadas, garanta que ele tenha acesso à rede pública e possa se conectar a acm.aliyun.com:8080: China (Qingdao), China (Hangzhou), China (Beijing), China (Shanghai), Shanghai Finance Cloud, China (Shenzhen), Hong Kong (China), Singapore, Germany (Frankfurt), Australia (Sydney), US (Silicon Valley) e US (Virginia).

      Access Type

      Selecione Single Application Access.

      Access Procedure

      Siga estas etapas.

      Step 1: No console do Container Service for Kubernetes, navegue até a página Workloads > Deployments do seu cluster e mude para o namespace da sua aplicação.

      Step 2: Localize a aplicação desejada e clique em Edit YAML.

      Step 3: Edite o campo labels conforme mostrado no exemplo a seguir e clique em Update.

      spec:
            template:
              metadata:
                labels:
                  # Set to "on" to enable connection. The value must be enclosed in double quotation marks.
                  msePilotAutoEnable: "on"
                  # Specify the target governance namespace. If the namespace does not exist, it is automatically created.
                  mseNamespace: default
                  # Specify the application name to be displayed in MSE. The value must be enclosed in double quotation marks.
                  msePilotCreateAppName: "your-deployment-name"

Implantar as aplicações de demonstração

  1. Faça login no console ACK. No painel de navegação à esquerda, clique em Clusters.

  2. Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Workloads > Deployments.

  3. Na página Stateless, selecione um namespace e clique em Create from YAML. Cole o conteúdo a seguir no editor e clique em Create.

    Neste exemplo, três aplicações (A, B e C) são implantadas. Uma versão base e uma versão canary são implantadas para cada aplicação. Uma aplicação Nacos Server também é implantada para descoberta de services.

    # Base version of application A
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-a
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: spring-cloud-a
      template:
        metadata:
          labels:
            msePilotCreateAppName: spring-cloud-a
            app: spring-cloud-a
        spec:
          containers:
          - env:
            - name: JAVA_HOME
              value: /usr/lib/jvm/java-1.8-openjdk/jre
            image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1
            imagePullPolicy: Always
            name: spring-cloud-a
            ports:
            - containerPort: 20001
            livenessProbe:
              tcpSocket:
                port: 20001
              initialDelaySeconds: 10
              periodSeconds: 30
    
    # Canary version of application A
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-a-new
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: spring-cloud-a-new
      strategy:
      template:
        metadata:
          labels:
            alicloud.service.tag: gray
            msePilotCreateAppName: spring-cloud-a
            app: spring-cloud-a-new
        spec:
          containers:
          - env:
            - name: JAVA_HOME
              value: /usr/lib/jvm/java-1.8-openjdk/jre
            - name: profiler.micro.service.tag.trace.enable
              value: "true"
            image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1
            imagePullPolicy: Always
            name: spring-cloud-a-new
            ports:
            - containerPort: 20001
            livenessProbe:
              tcpSocket:
                port: 20001
              initialDelaySeconds: 10
              periodSeconds: 30
    
    # Base version of application B
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-b
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: spring-cloud-b
      strategy:
      template:
        metadata:
          labels:
            msePilotCreateAppName: spring-cloud-b
            app: spring-cloud-b
        spec:
          containers:
          - env:
            - name: JAVA_HOME
              value: /usr/lib/jvm/java-1.8-openjdk/jre
            image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-b:3.0.1
            imagePullPolicy: Always
            name: spring-cloud-b
            ports:
            - containerPort: 8080
            livenessProbe:
              tcpSocket:
                port: 20002
              initialDelaySeconds: 10
              periodSeconds: 30
    
    # Canary version of application B
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-b-new
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: spring-cloud-b-new
      template:
        metadata:
          labels:
            alicloud.service.tag: gray
            msePilotCreateAppName: spring-cloud-b
            app: spring-cloud-b-new
        spec:
          containers:
          - env:
            - name: JAVA_HOME
              value: /usr/lib/jvm/java-1.8-openjdk/jre
            image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-b:3.0.1
            imagePullPolicy: Always
            name: spring-cloud-b-new
            ports:
            - containerPort: 8080
            livenessProbe:
              tcpSocket:
                port: 20002
              initialDelaySeconds: 10
              periodSeconds: 30
    
    # Base version of application C
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-c
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: spring-cloud-c
      template:
        metadata:
          labels:
            msePilotCreateAppName: spring-cloud-c
            app: spring-cloud-c
        spec:
          containers:
          - env:
            - name: JAVA_HOME
              value: /usr/lib/jvm/java-1.8-openjdk/jre
            image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1
            imagePullPolicy: Always
            name: spring-cloud-c
            ports:
            - containerPort: 8080
            livenessProbe:
              tcpSocket:
                port: 20003
              initialDelaySeconds: 10
              periodSeconds: 30
    
    # Canary version of application C
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-c-new
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: spring-cloud-c-new
      template:
        metadata:
          labels:
            alicloud.service.tag: gray
            msePilotCreateAppName: spring-cloud-c
            app: spring-cloud-c-new
        spec:
          containers:
          - env:
            - name: JAVA_HOME
              value: /usr/lib/jvm/java-1.8-openjdk/jre
            image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1
            imagePullPolicy: IfNotPresent
            name: spring-cloud-c-new
            ports:
            - containerPort: 8080
            livenessProbe:
              tcpSocket:
                port: 20003
              initialDelaySeconds: 10
              periodSeconds: 30
    
    # Nacos Server
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nacos-server
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nacos-server
      template:
        metadata:
          labels:
            app: nacos-server
        spec:
          containers:
          - env:
            - name: MODE
              value: standalone
            image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/nacos-server:v2.1.2
            imagePullPolicy: Always
            name: nacos-server
          dnsPolicy: ClusterFirst
          restartPolicy: Always
    
    # Nacos Server Service configuration
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nacos-server
    spec:
      ports:
      - port: 8848
        protocol: TCP
        targetPort: 8848
      selector:
        app: nacos-server
      type: ClusterIP
                    

Configurar definições de rede

Configure dois Services do Kubernetes para a aplicação de ingresso A: spring-cloud-a-base para a versão base e spring-cloud-a-gray para a versão canary.

apiVersion: v1
kind: Service
metadata:
  name: spring-cloud-a-base
spec:
  ports:
    - name: http
      nodePort: 32605
      port: 20001
      protocol: TCP
      targetPort: 20001
  selector:
    app: spring-cloud-a
  sessionAffinity: None
  type: NodePort

---
apiVersion: v1
kind: Service
metadata:
  name: spring-cloud-a-gray
spec:
  ports:
    - name: http
      nodePort: 31622
      port: 20001
      protocol: TCP
      targetPort: 20001
  selector:
    app: spring-cloud-a-new
  sessionAffinity: None
  type: NodePort

Etapa 1: Configurar o roteamento ALB

  1. Crie um objeto AlbConfig. Para mais informações, consulte Create an AlbConfig.

    Importante

    Certifique-se de que o vSwitch da instância ALB esteja na mesma VPC do cluster. Caso contrário, seus services podem ser afetados.

  2. Configure um Ingress.

    Copie o conteúdo a seguir para um arquivo chamado gray-ingress.yaml.

    • Para clusters com versão do Kubernetes anterior a 1,19:

      apiVersion: networking.k8s.io/v1beta1
      kind: Ingress
      metadata:
        name: demo
        namespace: default
      spec:
        ingressClassName: alb
        rules:
          - host: www.aliyundoc.com
            http:
              paths:
                - path: /a
                  backend:
                    serviceName: spring-cloud-a-base
                    servicePort: 20001
          - host: www.example.com
            http:
              paths:
                - backend:
                    serviceName: spring-cloud-a-gray
                    servicePort: 20001
                  path: /a
                  pathType: ImplementationSpecific
    • Para clusters com versão do Kubernetes 1,19 ou posterior:

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: cafe-ingress
      spec:
        ingressClassName: alb
        rules:
         - host: www.aliyundoc.com
           http:
            paths:
            # Configure the context path.
            - path: /a
              pathType: ImplementationSpecific
              backend:
                service:
                  name: spring-cloud-a-base
                  port:
                    number: 20001
         - host: www.example.com
           http:
            paths:
            # Configure the context path.
            - path: /a
              pathType: ImplementationSpecific
              backend:
                service:
                  name: spring-cloud-a-gray
                  port:
                    number: 20001
  3. Execute o seguinte comando:

    kubectl apply -f gray-ingress.yaml

    Execute o comando abaixo para verificar se o recurso Ingress canary foi criado e se o gray-ingress obteve o ADDRESS do ALB.

    shell@Alicloud:~$ kubectl get ing
    NAME            CLASS    HOSTS                        ADDRESS                                                PORTS   AGE
    cafe-ingress    alb      *                            alb-828vagckg5omzfy49n.cn-beijing.alb.aliyuncs.com     80      29h
    gray-ingress    <none>   www.base.com,www.gray.com    alb-828vagckg5omzfy4yn.cn-beijing.alb.aliyuncs.com     80      28n

    Se nenhum endpoint for exibido na coluna ADDRESS, verifique os eventos e solucione o problema consultando a seção "Antes de começar".

Etapa 2: Configurar a liberação canary de ponta a ponta do MSE

  1. Faça login no console MSE e selecione uma região na barra de navegação superior.

  2. No painel de navegação à esquerda, escolha Microservices Governance > Full link Grayscale.

  3. Clique em Create Lane Group and Lane. Se já existir um grupo de faixas, clique em + Create Lane Group.

  4. No painel Create Lane Group, configure os parâmetros e clique em OK.

    Adicione as aplicações spring-cloud-a, spring-cloud-b e spring-cloud-c ao grupo de faixas.

  5. Na parte inferior da página End-to-end Canary Release, clique em Create First Split Lane. No painel Create Lane, configure os parâmetros da faixa, selecione a tag gray e clique em OK.

Etapa 3: Verificar o resultado

  • As solicitações para www.aliyundoc.com são roteadas para o ambiente base.

    # Test command
    curl -H"Host:www.aliyundoc.com" http://alb-828vagckg5omzfy49n.cn-beijing.alb.aliyuncs.com/a
    # Test result
    A[172.18.XX.XX] -> B[172.18.XX.XX] -> C[172.18.XX.XX]%
  • As solicitações para www.example.com são roteadas para o ambiente canary.

    # Test command
    curl -H"Host:www.example.com" http://alb-828vagckg5omzfy49n.cn-beijing.alb.aliyuncs.com/a
    # Test result
    Agray[172.18.XX.XX] -> Bgray[172.18.XX.XX] -> Cgray[172.18.XX.XX]%
Nota

Nos comandos acima, alb-828vagckg5omzfy49n.cn-beijing.alb.aliyuncs.com é o endpoint do gateway de Ingress ALB.