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

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. Com esse modo, a AWS passa a cuidar da configuração e do gerenciamento da infraestrutura por você. 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 implantação azul/verde para migrar uma instância do NGINX Ingress Controller ao habilitar o Modo Automático do EKS em um cluster do Amazon EKS existente.

Pré-requisitos e limitações

Pré-requisitos

Arquitetura

Uma implantação azul/verde consiste em uma estratégia de implantação na qual você cria dois ambientes separados, mas idênticos. As implantações azul/verde garantem lançamentos com praticamente nenhum tempo de inatividade e suporte a funcionalidades de reversão. 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 implantação azul/verde para alternar o tráfego entre os dois Network Load Balancers.

Uso de uma estratégia de implantação azul/verde para a migração de 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 ilustra o seguinte fluxo de trabalho para configurar um ambiente para a implantação azul/verde:

  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 Kubernetes na AWSsem precisar instalar e manter seus próprios nós ou painel de controle do Kubernetes.

  • O Elastic Load Balancing (ELB) distribui o tráfego de entrada de aplicativos ou de rede em vários destinos. Por exemplo, é possível 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 a iniciar recursos da AWS em uma rede virtual definida por você. 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

TarefaDescriçãoHabilidades 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
Engenheiro de DevOps
TarefaDescriçãoHabilidades 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
Engenheiro de DevOps

Analise os recursos implantados.

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

kubectl get all,ingress

Na saída do comando, certifique-se de que o pod HTTPd de amostra está no estado de 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
Engenheiro de DevOps

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>
Engenheiro de DevOps

(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>
Engenheiro de DevOps, AWS DevOps
TarefaDescriçãoHabilidades 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
TarefaDescriçãoHabilidades 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.

Engenheiro de DevOps

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
Engenheiro de DevOps

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
Engenheiro de DevOps

Crie uma nova entrada para a workload HTTPd de amostra.

Digite o seguinte comando para criar uma nova entrada para a workload HTTPd de amostra existente:

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

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>
Engenheiro de DevOps
TarefaDescriçãoHabilidades 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 AWS Load Balancer Controller 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, engenheiro de DevOps

Analise as duas entradas.

Digite o seguinte comando para analisar as duas entradas que foram criadas para a workload HTTPd 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
Engenheiro de DevOps

Recursos relacionados