Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Migrate an Nginx Ingress that uses a CLB instance to an ASM gateway

Última atualização: Jun 28, 2026

Ao adotar o Alibaba Cloud Service Mesh (ASM), transfira o tratamento de tráfego de entrada do NGINX Ingress Controller para o gateway de entrada do ASM. Este guia descreve uma migração sem tempo de inatividade que reutiliza sua instância existente do Classic Load Balancer (CLB) e o endereço IP, mantendo os registros DNS inalterados. Se ocorrerem problemas em qualquer etapa, redefina os pesos para rotear todo o tráfego de volta ao NGINX Ingress imediatamente.

Como funciona

O NGINX Ingress Controller e o gateway de entrada do ASM operam lado a lado atrás da mesma instância de CLB. Os pesos de backend do CLB controlam a distribuição de tráfego entre eles. O processo começa com todo o tráfego direcionado ao NGINX Ingress, transfere-o gradualmente para o gateway do ASM e desativa o NGINX Ingress após a conclusão da migração.

Migration architecture

A migração segue cinco etapas:

  1. Desvincular o CLB do NGINX Ingress -- Torne a instância existente do CLB reutilizável para que tanto o NGINX Ingress quanto o gateway do ASM possam compartilhá-la.

  2. Crie um gateway do ASM -- Implante o gateway de entrada do ASM e vincule-o ao mesmo CLB com um peso inicial de 0 (sem tráfego).

  3. Converter recursos de Ingress para configurações do Istio -- Traduza suas regras do NGINX Ingress em recursos de Gateway e VirtualService do Istio.

  4. Verifique a configuração -- Envie tráfego de teste para confirmar se o gateway do ASM roteia as solicitações corretamente.

  5. Transferir o tráfego -- Aumente gradualmente o peso do gateway do ASM até que ele processe todo o tráfego.

Nota

Como ambos os gateways compartilham o mesmo CLB, seu endereço IP externo e os registros DNS permanecem inalterados durante toda a migração. O NGINX Ingress continua a atender ao tráfego de produção até que você altere explicitamente os pesos. Para reverter a qualquer momento, defina o peso do gateway do ASM como 0 e o peso do NGINX Ingress como 100.

Pré-requisitos

Antes de começar, verifique se você tem:

Etapa 1: Tornar a instância de CLB do NGINX Ingress reutilizável

Por padrão, o ACK gerencia a instância de CLB para o NGINX Ingress e impede alterações manuais. Para compartilhar esse CLB com o gateway do ASM, desvincule-o primeiro do gerenciamento do ACK.

Obter o ID da instância de CLB

Execute o comando a seguir para recuperar o ID da instância de CLB:

kubectl -n kube-system get svc nginx-ingress-lb -o yaml | grep service.k8s.alibaba/loadbalancer-id

Saída esperada:

service.k8s.alibaba/loadbalancer-id: lb-bp1gts52ced2vgaw1ni78

Anote o ID da instância de CLB (por exemplo, lb-bp1gts52ced2vgaw1ni78). Você precisará dele nas etapas posteriores.

Atualize as configurações do CLB no console

  1. Abra o Server Load Balancer console.

  2. Localize sua instância de CLB e faça as seguintes alterações:

    • Desative o configuration read-only mode.

    • Exclua as tags kubernetes.do.not.delete e ack.aliyun.com.

    • Renomeie os grupos vServer que começam com k8s/ para o formato shared-<port>. Por exemplo, renomeie k8s/80/nginx-ingress-lb/kube-system/c553a74e6ad13423aa839c8e5******** para shared-80.

Adicionar anotações ao Serviço NGINX Ingress

Adicione as seguintes anotações ao Serviço NGINX Ingress para que ele referencie o CLB explicitamente, em vez de depender da descoberta gerenciada pelo ACK:

metadata:
  annotations:
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "<your-clb-instance-id>"
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "false"
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: "<your-vgroup-id-1>:80,<your-vgroup-id-2>:443"
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "100"

Substitua os seguintes espaços reservados pelos valores reais:

Espaço reservado

Descrição

Exemplo

<your-clb-instance-id>

ID da instância de CLB da etapa anterior

lb-bp1gts52ced2vgaw1ni78

<your-vgroup-id-1>

ID do grupo vServer para a porta 80

rsp-bp1k5xxxxxxx

<your-vgroup-id-2>

ID do grupo vServer para a porta 443

rsp-bp1k5yyyyyyy

Importante

Use o ID do grupo vServer (não o nome de exibição, como shared-80). Para encontrar o ID, verifique os detalhes do grupo vServer no Server Load Balancer console.

Etapa 2: Crie um gateway do ASM

Crie um gateway do ASM usando YAML. Para gerar um arquivo YAML base, abra a página de criação de gateway do ASM no console do ASM, configure o formulário visual e clique em preview.

Edite a seção serviceAnnotations para reutilizar a mesma instância de CLB. As anotações são idênticas às da Etapa 1, exceto pelo peso, definido como "0" para impedir que o gateway do ASM receba tráfego inicialmente.

serviceAnnotations:
  service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "<your-clb-instance-id>"
  service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "false"
  service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: "<your-vgroup-id>:80"
  service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "0"

A tabela a seguir explica cada anotação:

Anotação

Valor

Finalidade

alibaba-cloud-loadbalancer-id

Seu ID de instância de CLB

Reutiliza o CLB existente

alibaba-cloud-loadbalancer-force-override-listeners

"false"

Impede que o Istio substitua os listeners existentes do CLB (o Istio substitui os listeners por padrão)

alibaba-cloud-loadbalancer-vgroup-port

Mapeamento de ID do grupo vServer e porta

Roteia o tráfego para o grupo de backend correto

alibaba-cloud-loadbalancer-weight

"0"

Inicia sem tráfego no gateway do ASM

Etapa 3: Converter recursos de Ingress para configurações do Istio

Traduza cada recurso de NGINX Ingress em um par de Gateway e VirtualService do Istio. O exemplo a seguir mostra como converter uma regra básica de Ingress com reescrita de URL.

NGINX Ingress (antes)

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: helloworld
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
    - http:
        paths:
          - backend:
              serviceName: helloworld
              servicePort: 80
            path: /helloworld(/|$)(.*)
      host: example.com

VirtualService do Istio (depois)

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: example-vs
spec:
  gateways:
  - istio-system/ingressgateway    # Replace with your ASM gateway name
  hosts:
  - example.com
  http:
  - name: route-helloworld
    match:
    - uri:
        prefix: /helloworld/
    - uri:
        prefix: /helloworld
    rewrite:
      uri: /
    route:
    - destination:
        host: helloworld
        port:
          number: 80

Principais diferenças entre Ingress e VirtualService

A tabela a seguir resume o mapeamento entre os campos do NGINX Ingress e seus equivalentes no VirtualService do Istio:

Aspecto

NGINX Ingress

VirtualService do Istio

Destino do roteamento

serviceName e servicePort

destination.host e destination.port.number

Reescrita de URL

Anotação rewrite-target

Campo rewrite.uri

Correspondência de host

rules[].host

hosts[]

Vinculação de gateway

Implícita (o controlador de Ingress)

Explícita (campo gateways[])

Equivalentes comuns de anotações do NGINX Ingress

Se você usar anotações avançadas do NGINX Ingress, consulte a tabela a seguir para ver os equivalentes no Istio:

Anotação do NGINX Ingress

Equivalente no Istio

Tipo de recurso

nginx.ingress.kubernetes.io/rewrite-target

http[].rewrite.uri

VirtualService

nginx.ingress.kubernetes.io/ssl-redirect

Seção tls no Gateway

Gateway

nginx.ingress.kubernetes.io/proxy-read-timeout

Campo timeout

VirtualService

nginx.ingress.kubernetes.io/upstream-hash-by

consistentHash em trafficPolicy

DestinationRule

nginx.ingress.kubernetes.io/cors-enable

Campo corsPolicy

VirtualService

Roteamento entre namespaces

Se um VirtualService e seu Serviço de destino estiverem no mesmo namespace, use o nome curto do serviço (por exemplo, helloworld). Se estiverem em namespaces diferentes, use o formato de Nome de Domínio Totalmente Qualificado (FQDN):

<service-name>.<namespace>.svc.cluster.local
Nota

Sempre que possível, coloque o VirtualService e o DestinationRule no mesmo namespace do Deployment do Serviço de destino. Isso simplifica a configuração de roteamento e evita a necessidade de FQDN.

Etapa 4: Verifique a configuração

Antes de transferir o tráfego de produção, verifique se o gateway do ASM lida com as solicitações corretamente.

Opção A: Testar por meio de um CLB temporário

Crie uma nova instância de CLB e aponte-a para o gateway de entrada do ASM. Envie solicitações de teste para este CLB:

curl -s -I -H "Host: example.com" http://<test-clb-ip>/helloworld/

Saída esperada (principais cabeçalhos):

HTTP/1.1 200 OK
server: istio-envoy

O cabeçalho server: istio-envoy confirma que o tráfego está fluindo pelo gateway do ASM.

Opção B: Testar de dentro do cluster

Envie solicitações diretamente para o Serviço do gateway de entrada do ASM dentro do cluster:

# Get the ASM ingress gateway ClusterIP
GATEWAY_IP=$(kubectl -n istio-system get svc istio-ingressgateway -o jsonpath='{.spec.clusterIP}')

# Send a test request
curl -s -I -H "Host: example.com" http://$GATEWAY_IP/helloworld/

Confirme se a resposta corresponde ao que o NGINX Ingress retorna para a mesma solicitação. O cabeçalho server: istio-envoy na resposta indica que o tráfego está fluindo pelo gateway do ASM.

Etapa 5: Transferir tráfego do NGINX Ingress para o gateway do ASM

Após a verificação, transfira gradualmente o tráfego de produção para o gateway do ASM ajustando os pesos de backend do CLB.

Cronograma de migração recomendado

Aumente o peso do gateway do ASM incrementalmente e monitore em cada estágio:

Estágio

Peso do gateway do ASM

Peso do NGINX Ingress

Ação

1

1

99

Verificar com tráfego mínimo de produção

2

10

90

Monitorar taxas de erro e latência

3

50

50

Confirmar comportamento em estado estacionário

4

100

0

Concluir a migração

Ajustar pesos

Peso do gateway do ASM: Atualize a anotação service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight no serviceAnnotations do IstioGateway:

serviceAnnotations:
  service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "50"    # Adjust this value

Peso do NGINX Ingress: Atualize a anotação service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight no Serviço NGINX Ingress. Se essa anotação não estiver configurada, ajuste o peso diretamente no CLB console.

Rollback

Se ocorrerem problemas durante a migração de tráfego, defina o peso do gateway do ASM como "0" e o peso do NGINX Ingress como "100":

# ASM gateway: stop receiving traffic
serviceAnnotations:
  service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "0"
# NGINX Ingress Service: restore full traffic
metadata:
  annotations:
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "100"

Todo o tráfego retorna ao NGINX Ingress imediatamente. Nenhuma alteração de DNS é necessária porque ambos os gateways compartilham a mesma instância de CLB.