Uma ferramenta de migração automatizada converte suas configurações de NGINX Ingress para o formato ALB Ingress, eliminando o trabalho manual. Transfira o tráfego gradualmente por meio do ajuste de peso via DNS para alcançar zero downtime.
Processo de migração
Resolva um nome de domínio tanto para o NGINX Ingress quanto para o ALB Ingress e ajuste os pesos do DNS progressivamente para transferir o tráfego sem interrupções. O diagrama a seguir ilustra o processo. O Migration example abaixo apresenta as etapas detalhadas.
A transferência de tráfego baseada em DNS é uma das abordagens para migração sem downtime. Este processo é fornecido apenas como referência.
Exemplo de migração
O exemplo a seguir percorre a migração com operações específicas.
Uma empresa executa um controlador NGINX Ingress em seu cluster. O service do tipo LoadBalancer voltado para a Internet provisiona automaticamente uma instância CLB voltada para a Internet. O DNS resolve www.example.net para o CLB, que encaminha as requisições para os pods de backend.
Etapa 1: Configure o ALB Ingress
O NGINX Ingress não consegue mais atender aos requisitos de desempenho e gera altos custos de O&M. A empresa usa a ferramenta de migração para converter a configuração do NGINX Ingress para ALB Ingress e adiciona o ALB Ingress ao DNS com um peso menor.
O DNS não permite que um nome de domínio resolva simultaneamente para um registro A e um registro CNAME. Instâncias CLB recebem requisições via endereços IP, enquanto instâncias ALB expõem um nome de domínio padrão (What is Application Load Balancer?). Configure um nome de domínio temporário para a instância CLB a fim de viabilizar a distribuição de tráfego baseada em peso.
Etapa 2: Transfira o tráfego gradualmente para o ALB Ingress
Após verificar que o ALB Ingress funciona conforme esperado, aumente o peso do DNS para o ALB Ingress a fim de rotear mais tráfego por ele.
Etapa 3: Exclua os recursos do NGINX Ingress
Após migrar todo o tráfego para o ALB Ingress, exclua as entradas DNS do NGINX Ingress, remova os recursos do NGINX Ingress e desinstale o add-on do controlador NGINX Ingress.
Pré-requisitos
Um cliente kubectl está conectado ao cluster ACK. Para mais informações, consulte Connect to an ACK cluster using kubectl.
Etapa 1: Configure o ALB Ingress
-
A ferramenta de migração converte automaticamente os recursos
AlbConfig,IngressClasseIngress. Portanto, ao instale o add-on, selecione None para ALB Instance.ACK: Faça login no console do Container Service for Kubernetes (ACK) e install the ALB Ingress controller add-on no cluster em que deseja realizar a migração.
ACS: Faça login no console do Container Compute Service e install the ALB Ingress controller add-on no cluster em que deseja realizar a migração.
ImportantePara acessar serviços por meio de um ALB Ingress em um cluster ACK dedicado, conceda permissões ao controlador ALB Ingress antes de implantar os serviços. Grant permissions to the ALB Ingress controller in an ACK dedicated cluster.
-
Crie um arquivo chamado ingress2albconfig.yaml com o seguinte conteúdo.
apiVersion: batch/v1 kind: Job metadata: name: ingress2albconfig namespace: default spec: template: spec: containers: - name: ingress2albconfig image: registry-cn-hangzhou.ack.aliyuncs.com/acs/ingress2albconfig:0.0.2 command: ["/bin/ingress2albconfig", "print", "-A"] restartPolicy: Never serviceAccount: ingress2albconfig serviceAccountName: ingress2albconfig backoffLimit: 4 --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: system:ingress2albconfig rules: - apiGroups: - networking.k8s.io resources: - ingresses - ingressclasses verbs: - get - list - watch - update - create - patch --- apiVersion: v1 kind: ServiceAccount metadata: name: ingress2albconfig namespace: default --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: system:ingress2albconfig roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:ingress2albconfig subjects: - kind: ServiceAccount name: ingress2albconfig namespace: default -
Execute o comando a seguir para iniciar o Job. O Job converte as configurações existentes do NGINX Ingress em recursos
AlbConfig,IngressClass,Ingresse outros, exibindo os resultados nos logs do pod.kubectl apply -f ingress2albconfig.yamlSaída esperada:
job.batch/ingress2albconfig created clusterrole.rbac.authorization.k8s.io/system:ingress2albconfig created serviceaccount/ingress2albconfig created clusterrolebinding.rbac.authorization.k8s.io/system:ingress2albconfig created -
Visualize o pod pertencente ao Job.
kubectl get pod -l job-name=ingress2albconfigSaída esperada:
NAME READY STATUS RESTARTS AGE ingress2albconfig-vw*** 0/1 Completed 0 16m -
Visualize os logs do pod.
kubectl logs ingress2albconfig-vw*** # Replace this with the pod name from the previous step.Saída esperada. Implante esses recursos no cluster para configure o ALB Ingress.
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: from-nginx spec: config: accessLogConfig: {} edition: Standard name: from-nginx tags: - key: converted/ingress2albconfig value: "true" zoneMappings: - vSwitchId: vsw-xxx # Replace this with the ID of a vSwitch in your VPC. - vSwitchId: vsw-xxx # Replace this with the ID of a vSwitch in your VPC. listeners: - port: 80 protocol: HTTP --- apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: from-nginx spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: from-nginx --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":80}]' name: from-ingress1 namespace: default spec: ingressClassName: from-nginx rules: - http: paths: - backend: service: name: nginx-svc-g1msr port: number: 80 path: / pathType: Prefix status: loadBalancer: {}
Anotações convertidas automaticamente
A ferramenta de migração converte as seguintes anotações do NGINX Ingress para anotações do ALB Ingress.
Anotações que não constam nesta tabela são ignoradas durante a conversão. Verifique a configuração do ALB Ingress após a conversão.
Etapa 2: Transfira o tráfego gradualmente para o ALB Ingress
Antes de alternar o tráfego, compare e teste as regras de encaminhamento do NGINX Ingress e do ALB Ingress para garantir funcionalidade idêntica.
Alterne o tráfego durante períodos de baixa utilização.
Após configure o ALB Ingress, direcione uma pequena parcela do tráfego para ele como canary release. Verifique as regras de encaminhamento e as configurações antes de aumentar o peso gradualmente.
Configure um domínio temporário para a instância CLB
O DNS não suporta a resolução de um nome de domínio para um registro A e um registro CNAME simultaneamente. Como instâncias ALB utilizam um nome de domínio padrão, configure um nome de domínio temporário para a instância CLB.
Faça login no console do Alibaba Cloud DNS.
Na página Public Zone, localize e clique em no nome de domínio DNS
www.example.netque aponta para a instância CLB a ser migrada.Na página Settings, localize o registro A que aponta de
www.example.netpara o endereço IP da instância CLB. Na coluna Actions, clique em Edit.No painel Edit Record, altere o Hostname e clique em OK. Neste exemplo, o Hostname é alterado para web0. Mantenha os demais parâmetros sem alteração.
-
Na página Settings, clique em Add Record. No painel Add Record, configure os parâmetros a seguir e clique em OK.
Parâmetro
Descrição
Record Type
Selecione CNAME.
Hostname
O prefixo do nome de domínio. Neste exemplo, insira
www.Query Source
Selecione Default.
Record Value
Insira o nome de domínio temporário. Neste exemplo, insira
web0.example.net.TTL
Mantenha o valor padrão.
NotaO registro CNAME agora resolve
www.example.netparaweb0.example.net, e o registro A resolveweb0.example.netpara o endereço IP do CLB.
Adicione um registro CNAME para a instância ALB
-
Execute o comando a seguir para localizar o nome de domínio da instância ALB.
kubectl get albconfigSaída esperada.
alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.comé o nome de domínio da instância ALB.NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE from_nginx alb-a8mmh2tqbmrm11**** alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com 20m -
Na página Settings, clique em Add Record. No painel Add Record, configure os parâmetros a seguir e clique em OK.
Parâmetro
Descrição
Record Type
Selecione CNAME.
Hostname
O prefixo do nome de domínio. Neste exemplo, insira
www.Query Source
Selecione Default.
Record Value
Insira o nome de domínio da instância ALB.
TTL
Mantenha o valor padrão.
Defina o peso do tráfego
Na página Settings, localize o registro CNAME adicionado na etapa anterior. Na coluna Actions, clique em na seta ao lado de Edit e selecione Edit Record Set.
No painel Edit Record, defina o peso do CLB como 100 e o peso do ALB como 0. Clique em OK.
Diminua gradualmente o peso do CLB e aumente o peso do ALB após confirme que não há impacto nos negócios.
-
Execute o comando
digvárias vezes para verifique o efeito da transferência de tráfego.[root@xxx 2uvl6raykm3Z ~]# dig www.xxx.net ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.10 <<>> www.xxx.net ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31592 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.xxx.net. IN A ;; ANSWER SECTION: www.xxx.net. 5 IN CNAME web0.xxx.net. web0.xxx.net. 5 IN A 47.xxx.144 ;; Query time: 63 msec ;; SERVER: 100.xxx.136#53(100.xxx.136) ;; WHEN: Thu Jan 19 15:46:40 CST 2023 ;; MSG SIZE rcvd: 66[root@xxx ~]# dig www.xxx.net ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.10 <<>> www.xxx.net ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14224 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.xxx.net. IN A ;; ANSWER SECTION: www.xxx.net. 5 IN CNAME alb-a8mmh2xxxm74.cn-hangzhou.alb.aliyuncs.com. alb-a8mxxxm74.cn-hangzhou.alb.aliyuncs.com. 60 IN A 116.xxx.54 alb-a8mxxxm74.cn-hangzhou.alb.aliyuncs.com. 60 IN A 118.xxx.39 ;; Query time: 4 msec ;; SERVER: 100.xxx.136#53(100.xxx.136) ;; WHEN: Thu Jan 19 15:47:52 CST 2023 ;; MSG SIZE rcvd: 128 Após a verificação, defina gradualmente o peso do CLB como 0 e o peso do ALB como 100.
Etapa 3: Exclua os recursos do NGINX Ingress
Após o encerramento de todas as conexões persistentes com o NGINX Ingress e a cessação de novo tráfego direcionado a ele, monitore o sistema por um período adequado ao seu negócio antes de liberar os recursos redundantes.
Exclua as entradas DNS relacionadas ao NGINX Ingress pelo console do Alibaba Cloud DNS.
-
Desinstale o add-on do controlador NGINX Ingress.
Faça login no ACK console.
Na página Clusters, clique em no nome do cluster de destino. No painel de navegação à esquerda, escolha .
Localize o NGINX Ingress. Na coluna Actions, escolha
> Delete. Na caixa de diálogo exibida, clique em Confirm Deletion.No painel de navegação à esquerda, escolha Add-ons. Clique em na aba Networking. No card NGINX Ingress controller, clique em Uninstall.
-
Na caixa de diálogo exibida, clique em OK.
A desinstalação do add-on libera automaticamente a instância CLB utilizada pelo controlador NGINX Ingress, encerrando a cobrança correspondente.
Faça login no console do Container Compute Service. No painel de navegação à esquerda, clique em Applications > Helm e desinstale o add-on do controlador NGINX Ingress.
