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.

A migração segue cinco etapas:
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.
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).
Converter recursos de Ingress para configurações do Istio -- Traduza suas regras do NGINX Ingress em recursos de Gateway e VirtualService do Istio.
Verifique a configuração -- Envie tráfego de teste para confirmar se o gateway do ASM roteia as solicitações corretamente.
Transferir o tráfego -- Aumente gradualmente o peso do gateway do ASM até que ele processe todo o tráfego.
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:
Uma instância do ASM Enterprise Edition ou Ultimate Edition na versão mais recente. Para obter mais informações, consulte Criar uma instância do ASM
Um cluster do Container Service for Kubernetes (ACK) adicionado à instância do ASM. Para obter mais informações, consulte Adicionar um cluster a uma instância do ASM
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
Abra o Server Load Balancer console.
-
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.deleteeack.aliyun.com.Renomeie os grupos vServer que começam com
k8s/para o formatoshared-<port>. Por exemplo, renomeiek8s/80/nginx-ingress-lb/kube-system/c553a74e6ad13423aa839c8e5********parashared-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 |
|
|
ID da instância de CLB da etapa anterior |
|
|
|
ID do grupo vServer para a porta 80 |
|
|
|
ID do grupo vServer para a porta 443 |
|
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 |
|
|
Seu ID de instância de CLB |
Reutiliza o CLB existente |
|
|
|
Impede que o Istio substitua os listeners existentes do CLB (o Istio substitui os listeners por padrão) |
|
|
Mapeamento de ID do grupo vServer e porta |
Roteia o tráfego para o grupo de backend correto |
|
|
|
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 |
|
|
|
Reescrita de URL |
Anotação |
Campo |
|
Correspondência de host |
|
|
|
Vinculação de gateway |
Implícita (o controlador de Ingress) |
Explícita (campo |
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 |
|
|
|
VirtualService |
|
|
Seção |
Gateway |
|
|
Campo |
VirtualService |
|
|
|
DestinationRule |
|
|
Campo |
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
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.