Ao adotar o Service Mesh (ASM) para gerenciamento de tráfego, os serviços existentes atrás do Nginx Ingress Controller devem continuar a receber tráfego sem interrupções. O ASM permite executar ambos os gateways atrás da mesma instância do Classic Load Balancer (CLB) e transferir o tráfego gradualmente por meio de roteamento baseado em peso. Assim, você valida cada etapa e reverte instantaneamente se necessário.
Como funciona
No Nginx Ingress Controller, um único recurso Ingress gerencia tanto a configuração do listener (portas, hosts, TLS) quanto as regras de roteamento (caminhos, backends). O Istio separa essas responsabilidades em dois recursos:
Gateway -- Define a camada de infraestrutura: quais portas expor, quais protocolos aceitar e quais hosts atender.
VirtualService -- Define a camada de roteamento: como corresponder às solicitações recebidas e para onde enviá-las.
Durante a migração, o Nginx Ingress Controller e o gateway de entrada ASM compartilham a mesma instância CLB. A divisão de tráfego baseada em peso permite transferir o tráfego incrementalmente, verificar o comportamento em cada etapa e reverter definindo o peso como 0.

Pré-requisitos
Antes de começar, verifique se você tem:
Uma instância ASM da Enterprise Edition ou Ultimate Edition, executando a versão mais recente. Consulte Criar uma instância ASM
Um cluster Container Service for Kubernetes (ACK) adicionado à instância ASM. Consulte Adicionar um cluster a uma instância ASM
O ID da instância CLB e os IDs dos grupos vServer da sua configuração existente do Nginx Ingress Controller
O algoritmo de agendamento do CLB definido como weighted round-robin (WRR)
Etapa 1: Criar um gateway de entrada que compartilha o CLB existente
Crie um gateway de entrada ASM que reutilize a instância CLB já associada ao Nginx Ingress Controller. Isso permite que ambos os gateways coexistam atrás do mesmo balanceador de carga durante a migração.
Adicione as seguintes anotações de serviço ao YAML do gateway para vincular o gateway de entrada ao seu CLB existente:
|
Anotação |
Finalidade |
Valor de exemplo |
|
|
Instância CLB a ser reutilizada |
|
|
|
Indica se deve sobrescrever os listeners existentes do CLB. Defina como |
|
|
|
Grupos vServer a serem vinculados, no formato |
|
|
|
Peso do tráfego para o gateway de entrada. Defina como |
|
Exemplo de configuração do gateway:
serviceAnnotations:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "lb-xxxxx"
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: "60"
Substitua os valores de espaço reservado:
|
Espaço reservado |
Descrição |
Onde encontrar |
|
|
ID da instância CLB |
Console CLB > Instances |
|
|
ID do grupo vServer |
Console CLB > vServer Groups |
Se você definir o peso como 0, o gateway de entrada deixará de receber tráfego. É possível definir o peso como 0 quando as regras de roteamento não tiverem sido configuradas ou quando ocorrerem exceções.
Para obter detalhes sobre a reutilização de instâncias CLB criadas com o tipo de serviço LoadBalancer, consulte FAQ.
Verificar o gateway
Confirme se o pod do gateway de entrada está em execução e se a instância CLB mostra os novos membros do grupo vServer:
kubectl get pods -n istio-system -l istio=ingressgateway
Saída esperada:
NAME READY STATUS RESTARTS AGE
istio-ingressgateway-xxxx-xxxxx 1/1 Running 0 1m
Etapa 2: Traduzir regras de Ingress para VirtualService e DestinationRule do Istio
Converta cada recurso Nginx Ingress em um par de recursos Istio: um Gateway (já criado na Etapa 1) e um VirtualService. Caso precise de políticas de tráfego, como configurações de pool de conexões ou detecção de outliers, crie também um DestinationRule.
Exemplo: regra de Ingress baseada em rewrite
Ingress original:
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 equivalente:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: example-vs
spec:
gateways:
- istio-system/ingressgateway # Reference your 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 em relação ao recurso Ingress:
A anotação
rewrite-targettorna-se o camporewrite.urino VirtualService.O caminho regex
/helloworld(/|$)(.*)transforma-se em duas correspondências explícitas de prefixo:/helloworld/e/helloworld.O
hoste as regras de roteamento são definidos separadamente (Gateway vs. VirtualService), em vez de em um único recurso.
Implante os recursos VirtualService e DestinationRule no mesmo namespace do Serviço Kubernetes correspondente. Se você os implantar em um namespace diferente, use o formato de nome de domínio totalmente qualificado (FQDN) para destination.host (por exemplo, helloworld.default.svc.cluster.local).
Verificar as rotas
Aplique o VirtualService e confirme se as rotas foram aceitas:
kubectl apply -f virtualservice.yaml
kubectl get virtualservice example-vs -o yaml
Verifique se a seção status não apresenta erros ou avisos.
Etapa 3: Verificar as configurações
Valide se as configurações são válidas e estão em vigor verificando o fluxo de tráfego. Crie uma instância CLB, envie tráfego para essa instância e verifique se o fluxo atende às expectativas. Para mais informações, consulte Fluxo de tráfego.
Etapa 4: Transferir o tráfego gradualmente
Após validar a configuração de roteamento, aumente o peso do gateway de entrada incrementalmente para migrar o tráfego:
Comece com um peso baixo (por exemplo,
1) e monitore a ocorrência de erros.Aumente o peso em etapas — por exemplo,
1->10->30->60->100.Em cada etapa, verifique se a latência, as taxas de erro e o conteúdo da resposta permanecem consistentes.
Depois que todo o tráfego for roteado pelo gateway de entrada, defina o peso do Nginx Ingress Controller como
0.
Como ajustar pesos
|
Componente |
Como ajustar |
|
Gateway de entrada ASM |
Edite a anotação |
|
Nginx Ingress Controller |
Edite a anotação |
O algoritmo de agendamento do CLB deve estar definido como weighted round-robin (WRR) para que a divisão de tráfego baseada em peso funcione.
Próximas etapas
Depois que todo o tráfego fluir pelo gateway de entrada ASM:
Configure o término TLS no gateway de entrada ASM
Configure o monitoramento e logs de acesso para o gateway de entrada
Remova a implantação do Nginx Ingress Controller após confirmar a operação estável
Explore os recursos de gerenciamento de tráfego do Istio, como injeção de falhas, circuit breaking e canary releases