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
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
-
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.
-
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
Faça login no console MSE e selecione uma região na barra de navegação superior.
No painel de navegação à esquerda, escolha Microservices Governance > Application Governance.
Na página Application list, clique em ACK Application Access.
-
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.
NotaCaso 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
Faça login no console MSE e selecione uma região na barra de navegação superior.
No painel de navegação à esquerda, escolha Microservices Governance > Application Governance.
Na página Application list, clique em ACK Application Access.
-
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.labelsno arquivo YAML do Deployment da aplicação:msePilotAutoEnable: "on"para ativar a governança de microsserviços,mseNamespace: defaultpara especificar o namespace MSE emsePilotCreateAppName: "your-deployment-name"para definir o nome da aplicação. Substituayour-deployment-namepelo nome real do Deployment.Parâmetro
Descrição
Cluster type
Selecione ACK Cluster, ACK Serverless Cluster ou ACS Cluster.
NotaCaso 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
labelsconforme 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
Faça login no console ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em .
-
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
-
Crie um objeto AlbConfig. Para mais informações, consulte Create an AlbConfig.
ImportanteCertifique-se de que o vSwitch da instância ALB esteja na mesma VPC do cluster. Caso contrário, seus services podem ser afetados.
-
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
-
-
Execute o seguinte comando:
kubectl apply -f gray-ingress.yamlExecute 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 28nSe 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
Faça login no console MSE e selecione uma região na barra de navegação superior.
No painel de navegação à esquerda, escolha Microservices Governance > Full link Grayscale.
Clique em Create Lane Group and Lane. Se já existir um grupo de faixas, clique em + Create Lane Group.
-
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.
-
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.comsã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.comsã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]%
Nos comandos acima, alb-828vagckg5omzfy49n.cn-beijing.alb.aliyuncs.com é o endpoint do gateway de Ingress ALB.