Migre os controladores de entrada NGINX ao ativar 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á.

Migre os controladores de entrada NGINX ao ativar o modo automático do Amazon EKS

Criado por Olawale Olaleye (AWS) e Shamanth Devagari (AWS)

Resumo

O EKS Auto Mode para Amazon Elastic Kubernetes Service (Amazon EKS) pode reduzir a sobrecarga operacional da execução de suas cargas de trabalho em clusters Kubernetes. Esse modo também AWS permite configurar e gerenciar a infraestrutura em seu nome. Ao habilitar o EKS Auto Mode em um cluster existente, você deve planejar cuidadosamente a migração das configurações do NGINX Ingress Controller. Isso ocorre porque a transferência direta de balanceadores de carga de rede 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 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. Implantações azul/verdes fornecem recursos de liberação e reversão com tempo de inatividade quase zero. A ideia fundamental é transferir o tráfego entre dois ambientes idênticos que estão executando versões diferentes do seu aplicativo.

A imagem a seguir mostra a migração de balanceadores de carga de rede de duas instâncias diferentes do controlador de entrada NGINX ao ativar o modo automático do EKS. Você usa uma implantação azul/verde para transferir o tráfego entre os dois balanceadores de carga de rede.

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

O namespace original é o namespace azul. É aqui que o serviço e a instância originais do NGINX Ingress Controller são executados, antes de você ativar o EKS Auto Mode. O serviço e a instância originais se conectam a um Network Load Balancer que tem um nome DNS configurado no Route 53. O AWS Load Balancer Controller implantou esse Network Load Balancer na nuvem privada virtual (VPC) de destino.

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

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

  2. No Route 53, configure um nome 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 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 Kubernetes que ajuda você a instalar e gerenciar aplicativos em seu cluster 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 aplicativos e serviços do Kubernetes com tratamento de solicitações, autenticação, recursos personalizados de autoatendimento e depuração.

Épicos

TarefaDescriçãoHabilidades necessárias

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

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

kubectl get all -n ingress-nginx

Na saída, confirme se os pods do NGINX Ingress Controller estão em 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
TarefaDescriçãoHabilidades necessárias

Crie os recursos do Kubernetes.

Insira os comandos a seguir para criar um exemplo de implantação, serviço e entrada 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 comando a seguir para ver 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á acessível.

Digite o comando a seguir para confirmar que o serviço pode ser acessado por meio do nome DNS do Network Load Balancer:

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

A seguir está a saída esperada:

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

(Opcional) Crie um registro DNS.

  1. Siga as instruções em Criação de registros usando o console do Amazon Route 53 (documentação do Route 53) para criar um registro DNS para o domínio configurado.

  2. Digite o comando a seguir para confirmar que o serviço pode ser acessado por meio do nome de domínio configurado:

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

    A seguir está a saída esperada:

    <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
TarefaDescriçãoHabilidades necessárias

Ative o modo automático do EKS.

Siga as instruções em Ativar 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. Baixe o modelo deploy.yaml.

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

  3. Na kind: Namespace seção, insira um nome exclusivo para o namespace, como: 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. Para cada seção, atualize o namespace valor com o novo nome.

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

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

    2. Insira um valor exclusivo para--ingress-class, comonginx-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 kind: IngressClass seção, 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 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

Implante a nova instância do NGINX Instance Controller.

Digite o comando a seguir para aplicar o arquivo de manifesto modificado:

kubectl apply -f deploy.yaml
DevOps engenheiro

Confirme a implantação bem-sucedida.

Insira o comando a seguir para verificar se os recursos no ingress-nginx-v2 namespace estão operacionais:

kubectl get all -n ingress-nginx-v2

Na saída, confirme se os pods do NGINX Ingress Controller estão em 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 funciona.

Digite o comando a seguir para confirmar se a nova entrada funciona:

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

A seguir está a saída esperada:

<html><body><h1>It works!</h1></body></html>
DevOps engenheiro
TarefaDescriçãoHabilidades necessárias

Vá para o novo namespace.

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

  2. Quando você confirmar que a nova instância do NGINX Ingress Controller está operando conforme o esperado, exclua a original.

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

  4. Esvazie os grupos de nós gerenciados. Para obter instruções, consulte Excluindo e drenando grupos de nós (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