Migração dos NGINX Ingress Controllers ao habilitar o Modo Automático do Amazon EKS - Recomendações da AWS

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Migração dos NGINX Ingress Controllers ao habilitar o Modo Automático do Amazon EKS

Olawale Olaleye e Shamanth Devagari, Amazon Web Services

Resumo

O Modo Automático do EKS para o Amazon Elastic Kubernetes Service (Amazon EKS) pode reduzir a sobrecarga operacional de executar as workloads em clusters do Kubernetes. Esse modo também AWS permite configurar e gerenciar a infraestrutura em seu nome. Ao habilitar o Modo Automático do EKS em um cluster existente, é necessário planejar cuidadosamente a migração das configurações do NGINX Ingress Controller. Isso ocorre porque a transferência direta de Network Load Balancers não é possível.

Você pode usar uma estratégia de blue/green implantação para migrar uma instância do NGINX Ingress Controller ao habilitar o EKS Auto Mode em um cluster Amazon EKS existente.

Pré-requisitos e limitações

Pré-requisitos

Arquitetura

Uma implantação azul/verde é uma estratégia de implantação na qual você cria dois ambientes separados, mas idênticos. Blue/green as implantações fornecem recursos de liberação e reversão com tempo de inatividade quase zero. A ideia fundamental consiste em alternar o tráfego entre dois ambientes idênticos que estão executando versões diferentes da aplicação.

A imagem apresentada a seguir ilustra a migração de Network Load Balancers de duas instâncias diferentes do NGINX Ingress Controller ao habilitar o Modo Automático do EKS. Você usa uma blue/green implantação para transferir o tráfego entre os dois balanceadores de carga de rede.

Usando uma estratégia de blue/green implantação para migrar instâncias do NGINX Ingress Controller.

O namespace de origem é o namespace azul. Este é o local em que o serviço e a instância originais do NGINX Ingress Controller são executados, antes de você habilitar o Modo Automático do EKS. O serviço e a instância originais estabelecem conexão com um Network Load Balancer que tem um nome de DNS configurado no Route 53. O AWS Load Balancer Controller implantou este Network Load Balancer na nuvem privada virtual (VPC) de destino.

O diagrama mostra o seguinte fluxo de trabalho para configurar um ambiente para uma blue/green implantação:

  1. Instale e configure outra instância do NGINX Ingress Controller em um namespace diferente, o namespace verde.

  2. No Route 53, configure um nome de DNS para um novo Network Load Balancer.

Ferramentas

Serviços da AWS

  • O Amazon Elastic Kubernetes Service (Amazon EKS) ajuda você a executar o AWS Kubernetes sem precisar instalar ou manter seu próprio plano de controle ou nós do Kubernetes.

  • O Elastic Load Balancing (ELB) distribui o tráfego de entrada de aplicativos ou de rede em vários destinos. Por exemplo, você pode distribuir o tráfego entre instâncias, contêineres e endereços IP do Amazon Elastic Compute Cloud (Amazon EC2) em uma ou mais zonas de disponibilidade.

  • O Amazon Route 53 é um serviço web de DNS altamente disponível e escalável.

  • A Amazon Virtual Private Cloud (Amazon VPC) ajuda você a lançar AWS recursos em uma rede virtual que você definiu. Essa rede virtual é semelhante a uma rede tradicional que você operaria no próprio datacenter, com os benefícios de usar a infraestrutura escalável da AWS.

Outras ferramentas

  • O Helm é um gerenciador de pacotes de código aberto para o Kubernetes que auxilia na instalação e no gerenciamento de aplicações no cluster do Kubernetes.

  • kubectl é uma interface de linha de comando que ajuda você na execução de comandos em clusters do Kubernetes.

  • O NGINX Ingress Controller conecta aplicações e serviços do Kubernetes, fornecendo gerenciamento de solicitações, autenticação, recursos personalizados de autoatendimento e depuração.

Épicos

TarefaDescriptionHabilidades necessárias

Confirme que a instância original do NGINX Ingress Controller está operacional.

Digite o comando apresentado a seguir para verificar se os recursos no namespace ingress-nginx estão operacionais. Se o NGINX Ingress Controller foi implantado em outro namespace, atualize o nome do namespace neste comando.

kubectl get all -n ingress-nginx

Na saída do comando, certifique-se de que os pods do NGINX Ingress Controller estão no estado de execução. Veja a seguir um exemplo de saída:

NAME READY STATUS RESTARTS AGE pod/ingress-nginx-admission-create-xqn9d 0/1 Completed 0 88m pod/ingress-nginx-admission-patch-lhk4j 0/1 Completed 1 88m pod/ingress-nginx-controller-68f68f859-xrz74 1/1 Running 2 (10m ago) 72m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/ingress-nginx-controller LoadBalancer 10.100.67.255 k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com 80:30330/TCP,443:31462/TCP 88m service/ingress-nginx-controller-admission ClusterIP 10.100.201.176 <none> 443/TCP 88m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/ingress-nginx-controller 1/1 1 1 88m NAME DESIRED CURRENT READY AGE replicaset.apps/ingress-nginx-controller-68f68f859 1 1 1 72m replicaset.apps/ingress-nginx-controller-d8c96cf68 0 0 0 88m NAME STATUS COMPLETIONS DURATION AGE job.batch/ingress-nginx-admission-create Complete 1/1 4s 88m job.batch/ingress-nginx-admission-patch Complete 1/1 5s 88m
DevOps engenheiro
TarefaDescriptionHabilidades necessárias

Crie os recursos do Kubernetes.

Digite os seguintes comandos para criar uma implantação, um serviço e uma entrada de amostra do Kubernetes:

kubectl create deployment demo --image=httpd --port=80
kubectl expose deployment demo
kubectl create ingress demo --class=nginx \ --rule nginxautomode.local.dev/=demo:80
DevOps engenheiro

Analise os recursos implantados.

Digite o seguinte comando para visualizar uma lista dos recursos implantados:

kubectl get all,ingress

Na saída, confirme se o HTTPd pod de amostra está em execução. Veja a seguir um exemplo de saída:

NAME READY STATUS RESTARTS AGE pod/demo-7d94f8cb4f-q68wc 1/1 Running 0 59m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/demo ClusterIP 10.100.78.155 <none> 80/TCP 59m service/kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 117m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/demo 1/1 1 1 59m NAME DESIRED CURRENT READY AGE replicaset.apps/demo-7d94f8cb4f 1 1 1 59m NAME CLASS HOSTS ADDRESS PORTS AGE ingress.networking.k8s.io/demo nginx nginxautomode.local.dev k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com 80 56m
DevOps engenheiro

Confirme se o serviço está disponível.

Digite o seguinte comando para confirmar que o serviço está disponível por meio do nome de DNS do Network Load Balancer:

curl -H "Host: nginxautomode.local.dev" http://k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com

A saída esperada é a seguinte:

<html><body><h1>It works!</h1></body></html>
DevOps engenheiro

(Opcional) Crie um registro de DNS.

  1. Siga as instruções apresentadas em Creating records by using the Amazon Route 53 console (documentação do Route 53) para criar um registro de DNS para o domínio configurado.

  2. Digite o seguinte comando para confirmar que o serviço está disponível por meio do nome de domínio configurado:

    curl "http://nginxautomode.local.dev/?[1-5]"

    A saída esperada é a seguinte:

    <html><body><h1>It works!</h1></body></html> <html><body><h1>It works!</h1></body></html> <html><body><h1>It works!</h1></body></html> <html><body><h1>It works!</h1></body></html> <html><body><h1>It works!</h1></body></html>
DevOps engenheiro, AWS DevOps
TarefaDescriptionHabilidades necessárias

Habilite o Modo Automático do EKS.

Siga as instruções apresentadas em Habilitar o Modo Automático do EKS em um cluster existente (documentação do Amazon EKS).

AWS DevOps
TarefaDescriptionHabilidades necessárias

Configure uma nova instância do NGINX Ingress Controller.

  1. Realize o download do modelo deploy.yaml.

  2. Abra o modelo deploy.yaml no editor de sua preferência.

  3. Na seção kind: Namespace, digite um nome exclusivo para o namespace, por exemplo ingress-nginx-v2:

    apiVersion: v1 kind: Namespace metadata: labels: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx name: ingress-nginx-v2
  4. Em cada seção, atualize o valor do namespace para o novo nome.

  5. Na seção kind: Deployment, faça o seguinte:

    1. Insira um valor exclusivo para --controller-class, como k8s.io/ingress-nginx-v2.

    2. Insira um valor exclusivo para --ingress-class, como nginx-v2.

    apiVersion: apps/v1 kind: Deployment name: ingress-nginx-controller namespace: ingress-nginx-v2 ... spec: containers: - args: - /nginx-ingress-controller - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller - --election-id=ingress-nginx-leader - --controller-class=k8s.io/ingress-nginx-v2 - --ingress-class=nginx-v2
  6. Na seção kind: IngressClass, insira os mesmos valores para --controller-class e --ingress-class que você usou na seção anterior:

    apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.12.0 name: nginx-v2 spec: controller: k8s.io/ingress-nginx-v2
  7. Na seção apresentada a seguir, adicione loadBalancerClass: eks.amazonaws.com/nlb para provisionar um Network Load Balancer para a instância do NGINX Ingress Controller:

    apiVersion: v1 kind: Service metadata: name: ingress-nginx-controller namespace: ingress-nginx-v2 spec: ... selector: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx type: LoadBalancer loadBalancerClass: eks.amazonaws.com/nlb
  8. Salve e feche o modelo deploy.yaml.

DevOps engenheiro

Realize a implantação da nova instância do NGINX Ingress Controller.

Digite o seguinte comando para aplicar o arquivo de manifesto modificado:

kubectl apply -f deploy.yaml
DevOps engenheiro

Confirme se a implantação teve êxito.

Digite o seguinte comando para verificar se os recursos no namespace ingress-nginx-v2 estão operacionais:

kubectl get all -n ingress-nginx-v2

Na saída do comando, certifique-se de que os pods do NGINX Ingress Controller estão em um estado de execução. Veja a seguir um exemplo de saída:

NAME READY STATUS RESTARTS AGE pod/ingress-nginx-admission-create-7shrj 0/1 Completed 0 24s pod/ingress-nginx-admission-patch-vkxr5 0/1 Completed 1 24s pod/ingress-nginx-controller-757bfcbc6d-4fw52 1/1 Running 0 24s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/ingress-nginx-controller LoadBalancer 10.100.208.114 k8s-ingressn-ingressn-2e5e37fab6-848337cd9c9d520f.elb.eu-west-1.amazonaws.com 80:31469/TCP,443:30658/TCP 24s service/ingress-nginx-controller-admission ClusterIP 10.100.150.114 <none> 443/TCP 24s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/ingress-nginx-controller 1/1 1 1 24s NAME DESIRED CURRENT READY AGE replicaset.apps/ingress-nginx-controller-757bfcbc6d 1 1 1 24s NAME STATUS COMPLETIONS DURATION AGE job.batch/ingress-nginx-admission-create Complete 1/1 4s 24s job.batch/ingress-nginx-admission-patch Complete 1/1 5s 24s
DevOps engenheiro

Crie uma nova entrada para a carga de HTTPd trabalho de amostra.

Insira o comando a seguir para criar uma nova entrada para a carga de HTTPd trabalho de amostra existente:

kubectl create ingress demo-new --class=nginx-v2 \ --rule nginxautomode.local.dev/=demo:80
DevOps engenheiro

Confirme se a nova entrada está funcionando.

Digite o seguinte comando para confirmar se a nova entrada está funcionando:

curl -H "Host: nginxautomode.local.dev" k8s-ingressn-ingressn-2e5e37fab6-848337cd9c9d520f.elb.eu-west-1.amazonaws.com

A saída esperada é a seguinte:

<html><body><h1>It works!</h1></body></html>
DevOps engenheiro
TarefaDescriptionHabilidades necessárias

Realize a substituição para o novo namespace.

  1. (Opcional) Siga as instruções apresentadas em Editing records (documentação do Route 53) para atualizar o registro de DNS.

  2. Após confirmar que a nova instância do NGINX Ingress Controller está funcionando conforme esperado, exclua a original.

  3. Exclua o controlador de AWS balanceador de carga autogerenciado. Para obter instruções, consulte Migrar aplicações do ALB Ingress Controller descontinuado (documentação do Amazon EKS).

  4. Drene os grupos de nós gerenciados. Para obter instruções, consulte Deleting and draining node groups (documentação do eksctl).

AWS DevOps, DevOps engenheiro

Analise as duas entradas.

Insira o comando a seguir para analisar as duas entradas que foram criadas para a carga de HTTPd trabalho de amostra:

kubectl get ingress

Veja a seguir um exemplo de saída:

NAME CLASS HOSTS ADDRESS PORTS AGE demo nginx nginxautomode.local.dev k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com 80 95m demo-new nginx-v2 nginxautomode.local.dev k8s-ingressn-ingressn-2e5e37fab6-848337cd9c9d520f.elb.eu-west-1.amazonaws.com 80 33s
DevOps engenheiro

Recursos relacionados