Conceitos do Kubernetes - Amazon EKS

Ajudar a melhorar esta página

Quer contribuir para este guia do usuário? Role até o final desta página e selecione Editar esta página no GitHub. Suas contribuições ajudarão a tornar nosso guia do usuário melhor para todos.

Conceitos do Kubernetes

O Amazon Elastic Kubernetes Service (Amazon EKS) é um serviço gerenciado da AWS baseado no projeto do Kubernetes de código aberto. Embora seja necessário saber como o serviço Amazon EKS se integra à Nuvem AWS (especialmente quando você cria um cluster do Amazon EKS pela primeira vez), uma vez instalado e em execução, o cluster do Amazon EKS poderá ser usado da mesma forma que qualquer outro cluster do Kubernetes. Portanto, para começar a gerenciar clusters do Kubernetes e implantar workloads, é necessário ter pelo menos uma compreensão básica dos conceitos do Kubernetes.

Esta página divide os conceitos do Kubernetes em três seções: Por que o Kubernetes?, Clusters e Workloads. A primeira seção descreve o valor da execução de um serviço da Kubernetes, em particular como um serviço gerenciado como o Amazon EKS. A seção Workloads aborda como as aplicações do Kubernetes são criadas, armazenadas, executadas e gerenciadas. A seção Clusters apresenta os diferentes componentes que compõem os clusters do Kubernetes e quais são suas responsabilidades pela criação e manutenção dos clusters do Kubernetes.

À medida que você avançar nesse conteúdo, os links levarão a descrições adicionais dos conceitos do Kubernetes, tanto no Amazon EKS quanto na documentação do Kubernetes, caso deseje se aprofundar em algum dos tópicos abordados aqui. Para obter detalhes sobre como o Amazon EKS implementa o ambiente de gerenciamento e os recursos computacionais do Kubernetes, consulte Arquitetura do Amazon EKS.

Por que o Kubernetes?

O Kubernetes foi projetado para aprimorar a disponibilidade e a escalabilidade ao executar aplicações em contêineres essenciais e com qualidade de produção. Em vez de apenas executar o Kubernetes em uma única máquina (embora isso seja possível), o Kubernetes atinge esses objetivos permitindo que você execute aplicações em conjuntos de computadores que podem se expandir ou se contrair para atender à demanda. O Kubernetes inclui recursos que facilitam para você:

  • Implantar aplicações em várias máquinas (usando contêineres implantados em pods)

  • Monitorar a integridade de contêineres e reiniciar contêineres que falharam

  • Aumentar ou reduzir a escala dos contêineres verticalmente dependendo da carga

  • Atualizar os contêineres com versões novas

  • Alocar recursos entre contêineres

  • Equilibrar o tráfego entre máquinas

A automatização desses tipos de tarefas complexas com o Kubernetes permite que os desenvolvedores de aplicações se concentrem em criar e melhorar suas workloads de aplicações, em vez de se preocupar com a infraestrutura. O desenvolvedor normalmente cria arquivos de configuração formatados como arquivos YAML que descrevem o estado desejado da aplicação. Isso pode incluir quais contêineres executar, limites de recursos, número de réplicas de pod, alocação de CPU/memória, regras de afinidade e muito mais.

Atributos do Kubernetes

Para atingir seus objetivos, o Kubernetes oferece os seguintes atributos:

  • Conteinerizado: o Kubernetes é uma ferramenta de orquestração de contêineres. Para usar o Kubernetes, suas aplicações deverão ser conteinerizadas primeiro. Dependendo do tipo de aplicação, isso pode ocorrer na forma de um conjunto de microsserviços, como trabalhos em lotes ou em outras formas. Então, suas aplicações podem utilizar um fluxo de trabalho do Kubernetes que engloba um enorme ecossistema de ferramentas e em que os contêineres podem ser armazenados como imagens em um registro de contêineres, implantados em um cluster do Kubernetes e executados em um disponível. É possível criar e testar contêineres individuais em seu computador local com o Docker ou outro runtime de contêiner antes de implantá-los em seu cluster do Kubernetes.

  • Escalável: se a demanda por suas aplicações exceder a capacidade das instâncias em execução dessas aplicações, o Kubernetes poderá aumentar a escala verticalmente. Conforme necessário, o Kubernetes pode dizer se as aplicações precisam de mais CPU ou memória e responder expandindo automaticamente a capacidade disponível ou usando mais da capacidade existente. O aumento da escala pode ser feito no nível do pod, se houver computação suficiente disponível para executar mais instâncias da aplicação (escalação automática horizontal do pod), ou no nível do nó, se mais nós precisarem ser criados para lidar com o aumento da capacidade (Cluster Autoscaler ou Karpenter). Como a capacidade não é mais necessária, esses serviços podem excluir pods desnecessários e desligar nós desnecessários.

  • Disponível: se uma aplicação ou um ou nó não estiver íntegro ou disponível, o Kubernetes poderá mover as workloads em execução para outro nó disponível. Você pode forçar o problema simplesmente excluindo uma instância em execução de uma workload ou um nó que esteja executando suas workloads. O ponto principal aqui é que as workloads poderão ser levadas para outros locais se não for mais possível executá-las onde estão.

  • Declarativo: o Kubernetes usa a reconciliação ativa para verificar constantemente se o estado que você declarou para o cluster corresponde ao estado real. Ao aplicar objetos do Kubernetes a um cluster, normalmente por meio de arquivos de configuração formatados em YAML, é possível, por exemplo, solicitar a inicialização das workloads que você deseja executar no cluster. Posteriormente, é possível alterar as configurações para fazer algo como usar uma versão posterior de um contêiner ou alocar mais memória. O Kubernetes fará o que for necessário para estabelecer o estado desejado. Isso pode incluir ativar ou desativar nós, interromper e reiniciar workloads ou obter contêineres atualizados.

  • Combinável: como uma aplicação geralmente consiste em vários componentes, você quer poder gerenciar um conjunto desses componentes (geralmente representado por vários contêineres) juntos. Embora o Docker Compose ofereça uma maneira de fazer isso diretamente com o Docker, o comando Kompose do Kubernetes pode ajudar você a fazer isso com o Kubernetes. Consulte Traduzir um arquivo do Docker Compose em recursos do Kubernetes para ver um exemplo de como fazer isso.

  • Extensível: ao contrário de software proprietário, o projeto de código aberto do Kubernetes foi desenvolvido para ser aberto para você, estendendo o Kubernetes da maneira que você quiser para atender às suas necessidades. As APIs e os arquivos de configuração são abertos para modificações diretas. Incentivamos todos a criar seus próprios controladores para ampliar a infraestrutura e os recursos do usuário final do Kubernetes. Os webhooks permitem que você configure regras de cluster para aplicar políticas e se adaptar às mudanças nas condições. Para obter mais ideias sobre como estender clusters do Kubernetes, consulte Estender o Kubernetes.

  • Portátil: muitas organizações padronizaram suas operações no Kubernetes porque isso permite que elas gerenciem todas as necessidades das respectivas aplicações da mesma forma. Os desenvolvedores podem usar os mesmos pipelines para criar e armazenar aplicações conteinerizadas. Essas aplicações podem então ser implantadas em clusters do Kubernetes executados on-premises, em nuvens, em terminais de ponto de venda em restaurantes ou em dispositivos de IoT distribuídos pelos locais remotos da empresa. Sua natureza de código aberto permite que as pessoas desenvolvam essas distribuições especiais do Kubernetes, junto com as ferramentas necessárias para gerenciá-las.

Gerenciar o Kubernetes

O código-fonte do Kubernetes está disponível gratuitamente, portanto, com seu próprio equipamento, você pode instalar e gerenciar o Kubernetes por conta própria. No entanto, o autogerenciamento do Kubernetes requer profundo conhecimento operacional e exige tempo e esforços para ser mantido. Por esses motivos, a maioria das pessoas que implantam workloads de produção escolhe um provedor de nuvem (como o Amazon EKS) ou um provedor on-premises (como o Amazon EKS Anywhere) com sua própria distribuição do Kubernetes testada e o suporte de especialistas em Kubernetes. Isso permite a você descarregar grande parte do trabalho pesado indiferenciado necessário para manter seus clusters, incluindo:

  • Hardware: se você não tiver hardware disponível para executar o Kubernetes de acordo com suas necessidades, um provedor de nuvem como o Amazon EKS da AWS pode ajudar a economizar nas despesas iniciais. Com o Amazon EKS, isso significa que é possível consumir os melhores recursos de nuvem oferecidos pela AWS, incluindo instâncias de computador (Amazon Elastic Compute Cloud), seu próprio ambiente privado (Amazon VPC), gerenciamento central de identidade e permissões (IAM) e armazenamento (Amazon EBS). A AWS gerencia os computadores, as redes, os data centers e todos os outros componentes físicos necessários para executar o Kubernetes. Da mesma forma, você não precisa planejar seu data center para lidar com a capacidade máxima nos dias de maior demanda. Para o Amazon EKS Anywhere ou outros clusters do Kubernetes on-premises, você é responsável por gerenciar a infraestrutura usada em suas implantações do Kubernetes, mas ainda pode contar com a AWS para manter o Kubernetes atualizado.

  • Ambiente de gerenciamento: o Amazon EKS gerencia a segurança e a disponibilidade do ambiente de gerenciamento do Kubernetes hospedado pela AWS, a qual é responsável por agendar contêineres, gerenciar a disponibilidade de aplicações e outras tarefas importantes para que você possa se concentrar em suas workloads de aplicações. Se seu cluster falhar, é esperado que a AWS tenha os meios necessários para restaurá-lo para um estado de execução. Para o Amazon EKS Anywhere, você mesmo gerenciaria o ambiente de gerenciamento.

  • Atualizações testadas: ao atualizar seus clusters, você pode confiar no Amazon EKS ou no Amazon EKS Anywhere para fornecer versões testadas de suas distribuições do Kubernetes.

  • Complementos: existem centenas de projetos criados para ampliar e trabalhar com o Kubernetes e que podem ser adicionados à infraestrutura do cluster ou usados para auxiliar na execução de workloads. Para que você não precise criar e gerenciar esses complementos por conta própria, o AWS fornece complementos do Amazon EKS que você pode usar com seus clusters. O Amazon EKS Anywhere fornece pacotes selecionados que incluem compilações de muitos projetos populares de código aberto. Assim, você não precisa criar o software sem ajuda ou gerenciar patches críticos de segurança, correções de bugs ou atualizações. Da mesma forma, se os padrões atenderem às suas necessidades, é normal que esses complementos exijam muito pouca configuração. Consulte Estender clusters para obter detalhes sobre como estender seu cluster com complementos.

O Kubernetes em ação

O diagrama a seguir mostra as principais atividades que você realizaria como administrador ou desenvolvedor de aplicações do Kubernetes para criar e usar um cluster do Kubernetes. No processo, ele ilustra como os componentes do Kubernetes interagem entre si usando a Nuvem AWS como exemplo do provedor de nuvem subjacente.

Um cluster do Kubernetes em ação.

Um administrador do Kubernetes cria o cluster do Kubernetes usando uma ferramenta específica para o tipo de provedor no qual o cluster será criado. Este exemplo usa a Nuvem AWS como provedor, que oferece o serviço de Kubernetes gerenciado chamado Amazon EKS. O serviço gerenciado aloca automaticamente os recursos necessários para criar o cluster, incluindo a criação de duas novas nuvens privadas virtuais (Amazon VPCs) para o cluster, a configuração da rede, o mapeamento de permissões do Kubernetes para gerenciar ativos na nuvem, a verificação de que os serviços do ambiente de gerenciamento têm locais para executar e a alocação de zero ou mais instâncias do Amazon EC2 como nós do Kubernetes para executar workloads. A AWS gerencia uma Amazon VPC em si para o ambiente de gerenciamento, enquanto a outra Amazon VPC contém os nós de clientes que executam workloads.

Muitas das tarefas futuras do administrador do Kubernetes serão realizadas com ferramentas do Kubernetes, como o kubectl. Essa ferramenta faz solicitações de serviços diretamente no ambiente de gerenciamento do cluster. As maneiras pelas quais as consultas e alterações são feitas no cluster são então muito semelhantes às formas como você as faria em qualquer cluster do Kubernetes.

Um desenvolvedor de aplicações que deseja implantar workloads nesse cluster pode realizar várias tarefas. O desenvolvedor precisa criar a aplicação em uma ou mais imagens de contêiner e, em seguida, enviar essas imagens para um registro de contêineres acessível pelo cluster do Kubernetes. A AWS oferece o Amazon Elastic Container Registry (Amazon ECR) para esse fim.

Para executar a aplicação, o desenvolvedor pode criar arquivos de configuração no formato YAML que informam ao cluster como executar a aplicação, incluindo quais contêineres extrair do registro e como agrupá-los em pods. O ambiente de gerenciamento (agendador) agenda os contêineres em um ou mais nós e o runtime do contêiner em cada nó realmente extrai e executa os contêineres necessários. O desenvolvedor também pode configurar um application load balancer para equilibrar o tráfego para os contêineres disponíveis em execução em cada nó e expor a aplicação para que ela se torne disponível em uma rede pública para o mundo externo. Com tudo isso feito, alguém que queira usar a aplicação poderá se conectar ao endpoint da aplicação para acessá-la.

A seção a seguir aborda os detalhes de cada um desses recursos, da perspectiva de clusters e workloads do Kubernetes.

Clusters

Se seu trabalho é iniciar e gerenciar clusters do Kubernetes, tenha em mente como os clusters do Kubernetes são criados, aprimorados, gerenciados e excluídos. Você também deverá saber quais são os componentes que compõem um cluster e o que precisa ser feito para mantê-los.

As ferramentas para gerenciar clusters lidam com a sobreposição entre os serviços de Kubernetes e o provedor de hardware subjacente. Por esse motivo, a automação dessas tarefas tende a ser feita pelo provedor de Kubernetes (como o Amazon EKS ou Amazon EKS Anywhere) usando ferramentas específicas para o provedor. Por exemplo, para iniciar um cluster do Amazon EKS, é possível usar eksctl create cluster, enquanto que para o Amazon EKS Anywhere é possível usar eksctl anywhere create cluster. Observe que, embora esses comandos criem um cluster do Kubernetes, eles são específicos do provedor e não fazem parte do projeto de Kubernetes em si.

Ferramentas de criação e gerenciamento de clusters

O projeto de Kubernetes oferece ferramentas para criar um cluster do Kubernetes manualmente. Portanto, se você quiser instalar o Kubernetes em uma única máquina ou executar o ambiente de gerenciamento em uma máquina e adicionar nós manualmente, poderá usar ferramentas de CLI, como kind, minikube ou kubeadm, listadas em Ferramentas de instalação do Kubernetes. Para simplificar e automatizar todo o ciclo de vida da criação e do gerenciamento de clusters, é muito mais fácil usar ferramentas com suporte de um provedor de Kubernetes estabelecido, como o Amazon EKS ou o Amazon EKS Anywhere.

Na Nuvem AWS, é possível criar clusters do Amazon EKS usando ferramentas de CLI, como eksctl, ou ferramentas mais declarativas, como o Terraform (consulte Amazon EKS Blueprints for Terraform). Também é possível criar um cluster no Console de Gerenciamento da AWS. Consulte Recursos do Amazon EKS para ver uma lista do que o Amazon EKS oferece. As responsabilidades de Kubernetes que o Amazon EKS assume por você incluem:

  • Ambiente de gerenciamento gerenciado: o AWS garante que o cluster do Amazon EKS esteja disponível e seja escalável, pois ele gerencia o ambiente de gerenciamento para você e o disponibiliza em todas as zonas de disponibilidade da AWS.

  • Gerenciamento de nós: em vez de adicionar nós manualmente, você pode fazer com que o Amazon EKS crie nós automaticamente conforme necessário, seja usando grupos de nós gerenciados ou o Karpenter. Os grupos de nós gerenciados têm integrações com o escalonamento automático de clusters do Kubernetes. Usando ferramentas de gerenciamento de nós, você pode se beneficiar da economia de custos graças a recursos como instâncias spot, consolidação e disponibilidade de nós e utilização de recursos de programação para definir como as workloads são implantadas e os nós são selecionados.

  • Rede de clusters: usando modelos do CloudFormation, o eksctl configura a rede entre os componentes do ambiente de gerenciamento e do plano de dados (nó) no cluster do Kubernetes. Ele também configura endpoints por meio dos quais as comunicações internas e externas podem ocorrer. Consulte Desmistificar redes de cluster para nós de processamento do Amazon EKS para obter detalhes. A comunicação entre pods no Amazon EKS é feita via Identidades de pods do Amazon EKS, que fornecem um meio de permitir que os pods usem métodos de gerenciamento de credenciais e permissões na Nuvem AWS.

  • Complementos: o Amazon EKS evita que você precise criar e adicionar componentes de software que são comumente usados para oferecer suporte a clusters do Kubernetes. Por exemplo, quando você cria um cluster do Amazon EKS via Console de Gerenciamento da AWS, ele adiciona automaticamente o kube-proxy do Amazon EKS, o plug-in do Amazon VPC CNI para Kubernetes e os complementos do CoreDNS. Consulte Complementos do Amazon EKS para saber mais sobre esses complementos, incluindo uma lista de quais estão disponíveis.

Para executar seus clusters em seus próprios computadores e redes on-premises, a Amazon oferece o Amazon EKS Anywhere. Em vez de a Nuvem AWS atuar como o provedor, existe a opção de executar o Amazon EKS Anywhere nas plataformas VMware vSphere, bare metal (provedor Tinkerbell), Snow, CloudStack ou Nutanix usando seu próprio equipamento.

O Amazon EKS Anywhere é baseado no mesmo software Amazon EKS Distro usado pelo Amazon EKS. No entanto, o Amazon EKS Anywhere depende de diferentes implementações da interface da API do Cluster do Kubernetes (CAPI) para gerenciar todo o ciclo de vida das máquinas em um cluster do Amazon EKS Anywhere (como CAPV para vSphere e CAPC para CloudStack). Como todo o cluster está sendo executado em seu equipamento, você assume a responsabilidade adicional por gerenciar o ambiente de gerenciamento e fazer backup de seus dados (consulte etcd posteriormente neste documento).

Componentes do cluster

Os componentes do cluster do Kubernetes são divididos em duas áreas principais: ambiente de gerenciamento e nós de processamento. Os componentes do ambiente de gerenciamento gerenciam o cluster e fornecem acesso às suas APIs. Os nós de processamento (às vezes chamados apenas de nós) fornecem os locais onde as workloads reais são executadas. Os componentes do nó consistem em serviços que são executados em cada nó para se comunicar com o ambiente de gerenciamento e executar contêineres. O conjunto de nós de processamento do cluster é chamado de plano de dados.

Ambiente de gerenciamento

O ambiente de gerenciamento consiste em um conjunto de serviços que gerenciam o cluster. Todos esses serviços podem ser executados em um único computador ou estar espalhados por vários computadores. Internamente, elas são chamadas de instâncias do ambiente de gerenciamento (CPIs). A forma como as CPIs são executadas depende do tamanho do cluster e dos requisitos de alta disponibilidade. Conforme a demanda aumenta no cluster, um serviço de ambiente de gerenciamento pode ser escalado para fornecer mais instâncias desse serviço, com as solicitações sendo balanceadas entre as instâncias.

As tarefas realizadas pelos componentes do ambiente de gerenciamento do Kubernetes incluem:

  • Comunicação com os componentes do cluster (servidor de API): o servidor de API (kube-apiserver) expõe a API do Kubernetes para que as solicitações ao cluster possam ser feitas interna e externamente ao cluster. Em outras palavras, as solicitações para adicionar ou alterar os objetos de um cluster (pods, serviços, nós etc.) podem vir de comandos externos, como solicitações de kubectl para executar um pod. Da mesma forma, as solicitações podem ser feitas do servidor da API para componentes dentro do cluster, como uma consulta ao serviço kubelet para saber o status de um pod.

  • Armazenar dados sobre o cluster (armazenamento de valore de chave de etcd): o serviço etcdexerce a função crítica de acompanhar o estado atual do cluster. Se o serviço etcd se tornasse inacessível, você não conseguiria atualizar ou consultar o status do cluster, embora as workloads continuassem sendo executadas por algum tempo. Por esse motivo, os clusters críticos geralmente têm várias instâncias do serviço etcd com balanceamento de carga em execução ao mesmo tempo e fazem backups periódicos do armazenamento dos valores de chave do etcd para o caso de perda ou corrompimento de dados. Lembre-se de que, no Amazon EKS, tudo isso é gerenciado automaticamente para você por padrão. O Amazon EKS Anywhere fornece instruções sobre backup e restauração de etcd. Consulte o Modelo de dados do etcd para saber como o etcd gerencia dados.

  • Agendar pods em nós (agendador): as solicitações para iniciar ou interromper um pod no Kubernetes são direcionadas para o Agendador do Kubernetes (kube-scheduler). Como um cluster pode ter vários nós capazes de executar o pod, cabe ao agendador escolher em qual nó (ou nós, no caso de réplicas) o pod deve ser executado. Se não houver capacidade disponível suficiente para executar o pod solicitado em um nó existente, a solicitação falhará, a menos que você tenha feito outras provisões. Essas provisões podem incluir a habilitação de serviços, como grupos de nós gerenciados ou o Karpenter, que podem iniciar automaticamente novos nós para lidar com as workloads.

  • Manter os componentes no estado desejado (Controller Manager): o Kubernetes Controller Manager é executado como um processo daemon (kube-controller-manager) para observar o estado do cluster e fazer alterações no cluster para restabelecer os estados esperados. Em particular, existem vários controladores que vigiam objetos Kubernetes diferentes, incluindo um statefulset-controller, endpoint-controller, cronjob-controller, node-controller e outros.

  • Gerenciar recursos de nuvem (Cloud Controller Manager): as interações entre Kubernetes e o provedor de nuvem que realiza as solicitações dos recursos subjacentes do data center são gerenciadas pelo Cloud Controller Manager (cloud-controller-manager). Os controladores gerenciados pelo Cloud Controller Manager podem incluir um controlador de rota (para configurar rotas de rede na nuvem), controlador de serviço (para usar serviços de balanceamento de carga na nuvem) e controlador de ciclo de vida de nós (para manter os nós sincronizados com o Kubernetes durante os ciclos de vida).

Nós de processamento (plano de dados)

Para um cluster do Kubernetes de nó único, as workloads são executadas na mesma máquina que o ambiente de gerenciamento. No entanto, uma configuração mais normal é ter um ou mais sistemas de computador separados (nós) dedicados à execução de workloads do Kubernetes.

Quando você cria um cluster do Kubernetes pela primeira vez, algumas ferramentas de criação de clusters permitem configurar um determinado número de nós a serem adicionados ao cluster (seja identificando sistemas de computador existentes ou fazendo com que o provedor crie novos sistemas). Antes que qualquer workload seja adicionada a esses sistemas, serviços são adicionados a cada nó para implementar esses recursos:

  • Gerenciar cada nó (kubelet): o servidor da API se comunica com o serviço kubelet em execução em cada nó para garantir que o nó esteja registrado corretamente e que os pods solicitados pelo agendador estejam em execução. O kubelet pode ler os manifestos do Pod e configurar volumes de armazenamento ou outros recursos necessários aos Pods no sistema local. Ele também pode verificar a integridade dos contêineres executados localmente.

  • Executar contêineres em um nó (runtime de contêiner): o runtime de contêiner em cada nó gerencia os contêineres solicitados para cada pod atribuído ao nó. Isso significa que ele pode extrair imagens do contêiner do registro apropriado, executar o contêiner, interrompê-lo e responder às consultas sobre o contêiner. O runtime de contêiner padrão é containerd. A partir do Kubernetes versão 1.24, a integração especial do Docker (dockershim) que poderia ser usada como runtime de contêiner foi removida do Kubernetes. Embora ainda seja possível usar o Docker para testar e executar contêineres em seu sistema local, para usar o Docker com o Kubernetes, agora é necessário Instalar o mecanismo do Docker em cada nó para usá-lo com o Kubernetes.

  • Gerenciar a rede entre contêineres (kube-proxy): para que seja possível oferecer suporte à comunicação entre pods usando serviços, o Kubernetes precisava de uma forma de configurar redes de pods para rastrear endereços IP e portas associadas a esses pods. O serviço kube-proxy é executado em cada um dos nós para permitir que a comunicação entre os pods ocorra.

Cluster estendido

Há alguns serviços que podem ser adicionados ao Kubernetes para oferecer suporte ao cluster, mas eles não são executados no ambiente de gerenciamento. Esses serviços geralmente são executados diretamente em nós no namespace kube-system ou em seu próprio namespace (como geralmente é feito com provedores de serviços terceirizados). Um exemplo comum é o serviço CoreDNS, que fornece serviços de DNS ao cluster. Consulte Descobrindo serviços integrados para obter informações sobre como ver quais serviços de cluster estão sendo executados no kube-system em seu cluster.

Há diferentes tipos de complementos que podem ser adicionados aos seus clusters. Para manter seus clusters íntegros, é possível adicionar recursos de observabilidade que permitem realizar tarefas como registro em log, auditorias e métricas. Com essas informações, você pode solucionar problemas que ocorrem, geralmente por meio das mesmas interfaces de observabilidade. Exemplos desses tipos de serviço incluem o Amazon GuardDuty, CloudWatch, AWS Distro para OpenTelemetry, plug-in do Amazon VPC CNI para Kubernetes e Grafana Kubernetes Monitoring. Para armazenamento, os complementos do Amazon EKS incluem o Amazon Elastic Block Store CSI Driver (para adicionar dispositivos de armazenamento de blocos), o Amazon Elastic File System CSI Driver (para adicionar armazenamento do sistema de arquivos) e vários complementos de armazenamento de terceiros (como o driver Amazon FSx para NetApp ONTAP CSI).

Para obter uma lista mais completa dos complementos do Amazon EKS disponíveis, consulte Complementos do Amazon EKS.

Workloads

O Kubernetes define uma workload como "uma aplicação em execução no Kubernetes". Essa aplicação pode consistir em um conjunto de microsserviços executados como contêineres em pods ou pode ser executada como um trabalho em lote ou outro tipo de aplicações. O trabalho do Kubernetes é garantir que as solicitações feitas para que esses objetos sejam configurados ou implantados sejam executadas. Como alguém que implanta aplicações, você deve aprender sobre como os contêineres são criados, como os pods são definidos e quais métodos você pode usar para implantá-los.

Contêineres

O elemento mais básico de uma workload de aplicação que você implanta e gerencia no Kubernetes é um pod. Um pod representa uma forma de sustentar os componentes de uma aplicação, bem como de definir especificações que descrevem os atributos do pod. Compare isso com algo como um pacote RPM ou Deb, que agrupa software para um sistema Linux, mas não é executado como uma entidade.

Como o pod é a menor unidade implantável, ele normalmente contém um único contêiner. No entanto, vários contêineres podem existir em um pod nos casos em que os contêineres estão fortemente acoplados. Por exemplo, um contêiner de servidor Web pode ser empacotado em um pod com um tipo de contêiner auxiliar que pode fornecer registro em log, monitoramento ou outro serviço intimamente vinculado ao contêiner do servidor Web. Nesse caso, estar no mesmo pod garante que, para cada instância em execução do pod, os dois contêineres sempre sejam executados no mesmo nó. Da mesma forma, todos os contêineres em um pod compartilham o mesmo ambiente, com os contêineres em um pod funcionando como se estivessem no mesmo host isolado. O efeito disso é que os contêineres compartilham um único endereço IP que fornece acesso ao pod e podem se comunicar entre si como se estivessem sendo executados em seu próprio host local.

As especificações do pod (PodSpec) definem o estado desejado do pod. É possível implantar um pod individual ou vários pods usando recursos de workload para gerenciar modelos de pod. Os recursos de workload incluem Implantações (para gerenciar várias réplicas de pod), StatefulSets (para implantar pods que precisam ser exclusivos, como pods de banco de dados) e DaemonSets (em que um pod precisa ser executado continuamente em cada nó). Falaremos mais sobre isso mais tarde.

Enquanto um pod é a menor unidade que você pode implantar, um contêiner é a menor unidade que você cria e gerencia.

Criar contêineres

O pod é, na verdade, apenas uma estrutura em torno de um ou mais contêineres, onde cada contêiner contém o sistema de arquivos, executáveis, arquivos de configuração, bibliotecas e outros componentes para realmente executar a aplicação. Como uma empresa chamada Docker Inc. popularizou os contêineres pela primeira vez, algumas pessoas se referem aos contêineres como contêineres Docker. No entanto, desde então, a Open Container Initiative definiu tempos de execução, imagens e métodos de distribuição de contêineres para o setor. Adicione a isso o fato de que os contêineres foram criados com base em muitos recursos existentes do Linux, outros geralmente se referem aos contêineres como contêineres OCI, contêineres Linux ou apenas contêineres.

Quando você cria um contêiner, normalmente começa com um arquivo Dockerfile (literalmente chamado assim). Dentro desse Dockerfile, é possível identificar:

  • Uma imagem base: uma imagem base de contêiner é um contêiner que normalmente é construído usando uma versão mínima do sistema de arquivos de um sistema operacional (como Red Hat Enterprise Linux ou Ubuntu) ou de um sistema mínimo que é aprimorado para fornecer software para executar tipos específicos de aplicações (como aplicações nodejs ou python).

  • Software de aplicação: é possível adicionar o software de aplicação ao seu contêiner da mesma forma que adicionaria a um sistema Linux. Por exemplo, em seu Dockerfile, você pode executar npm e yarn para instalar um aplicativo Java ou yum e dnf para instalar pacotes RPM. Em outras palavras, com um comando RUN em um Dockerfile, é possível executar qualquer comando que esteja disponível no sistema de arquivos da sua imagem base para instalar ou configurar o software dentro da imagem de contêiner resultante.

  • Instruções: a Referência do Dockerfile descreve as instruções que podem ser adicionadas a um Dockerfile ao configurá-lo. Isso inclui instruções usadas para criar o que está no próprio contêiner (ADD ou COPY arquivos do sistema local), identificar comandos para executar quando o contêiner for executado (CMD ou ENTRYPOINT) e conectar o contêiner ao sistema em que ele é executado (identificando o USER de execução, um VOLUME local para montagem ou as portas para EXPOSE).

Embora o comando e o serviço docker tenham sido tradicionalmente usados para criar containers (docker build), outras ferramentas disponíveis para criar imagens de contêineres incluem podman e nerdctl. Consulte Como criar imagens de contêineres melhores ou Criar com o Docker para saber mais sobre a criação de contêineres.

Armazenamento de contêineres

Após criar sua imagem de contêiner, você poderá armazená-la em um registro de distribuição de contêineres na estação de trabalho ou em um registro de contêiner público. A execução de um registro de contêiner privado em sua estação de trabalho permite armazenar imagens de contêiner localmente, tornando-as prontamente disponíveis para você.

Para armazenar imagens de contêiner de forma mais pública, é possível enviá-las para um registro de contêiner público. Os registros de contêineres públicos fornecem um local central para armazenar e distribuir imagens de contêineres. Exemplos de registros de contêineres públicos incluem o Amazon Elastic Container Registry, o registro do Red Hat Quay e o registro do Docker Hub.

Ao executar workloads em contêineres no Amazon Elastic Kubernetes Service (Amazon EKS), recomendamos obter cópias de imagens oficiais do Docker armazenadas no Amazon Elastic Container Registry. AWS O Amazon ECR armazena essas imagens desde 2021. É possível pesquisar imagens de contêineres populares na Galeria Pública do Amazon ECR e, especificamente para as imagens do Docker Hub, é possível pesquisar na Galeria do Docker do Amazon ECR.

Depure contêineres em execução

Como os contêineres são criados em um formato padrão, um contêiner pode ser executado em qualquer máquina capaz de executar um runtime de contêiner (como o Docker) e cujo conteúdo corresponda à arquitetura da máquina local (como x86_64 ou arm). Para testar um contêiner ou simplesmente executá-lo em seu desktop local, você pode usar nossos comandos docker run ou podman run para iniciar um contêiner no host local. Para o Kubernetes, no entanto, cada nó de trabalho tem um runtime de contêiner implantado e cabe ao Kubernetes solicitar que um nó execute um contêiner.

Depois que um contêiner é designado para ser executado em um nó, o nó verifica se a versão solicitada da imagem do contêiner já existe nesse nó. Caso contrário, o Kubernetes solicita ao runtime do contêiner que extraia esse contêiner do registro de contêiner apropriado e, em seguida, execute esse contêiner localmente. Lembre-se de que uma imagem de contêiner se refere ao pacote de software que é movido entre seu laptop, o registro de contêiner e os nós do Kubernetes. Um contêiner se refere a uma instância em execução dessa imagem.

Pods

Quando seus contêineres estiverem prontos, trabalhar com os pods inclui configurar, implantar e tornar os pods acessíveis.

Configuração de pods

Ao definir um pod, você atribui um conjunto de atributos a ele. Esses atributos devem incluir pelo menos o nome do pod e a imagem de contêiner a ser executada. No entanto, há muitas outras coisas que podem ser configuradas com as definições do pod (consulte a página PodSpec para obter detalhes sobre o que pode ser incluído em um pod). Isso inclui:

  • Armazenamento: quando um contêiner em execução for interrompido e excluído, o armazenamento de dados desse contêiner desaparecerá, a menos que você configure um armazenamento mais permanente. O Kubernetes oferece suporte a muitos tipos diferentes de armazenamento e os abstrai sob a égide de Volumes. Os tipos de armazenamento incluem CephFS, NFS, iSCSI e outros. Você pode até mesmo usar um dispositivo de blocos local conectado ao computador local. Com um desses tipos de armazenamento disponíveis no cluster, é possível montar o volume de armazenamento em um ponto de montagem selecionado no sistema de arquivos do contêiner. Um volume persistente é aquele que continua existindo depois que o pod é excluído, enquanto um volume efêmero é removido quando o pod é excluído. Se o administrador do cluster criou StorageClasses diferentes para seu cluster, talvez você tenha a opção de escolher os atributos do armazenamento que você usa, por exemplo, se o volume é excluído ou recuperado após o uso, se ele se expandirá se for necessário mais espaço e até mesmo se ele atende a determinados requisitos de performance.

  • Segredos: ao tornar os segredos disponíveis para contêineres nas especificações do Pod, você pode fornecer as permissões de que esses contêineres precisam para acessar sistemas de arquivos, bancos de dados ou outros ativos protegidos. Chaves, senhas e tokens estão entre os itens que podem ser armazenados como segredos. O uso de segredos faz com que você não precise armazenar essas informações em imagens de contêineres, mas apenas disponibilizá-los para contêineres em execução. ConfigMaps são semelhantes a segredos. Um ConfigMap tende a conter informações menos críticas, como pares de chave-valor para configurar um serviço.

  • Recursos de contêiner: os objetos para configuração adicional de contêineres podem assumir a forma de configuração de recursos. Para cada contêiner, é possível solicitar a quantidade de memória e CPU que ele pode usar, bem como impor limites para a quantidade total desses recursos que o contêiner pode usar. Consulte Gerenciamento de recursos para pods e contêineres para obter exemplos.

  • Interrupções: os pods podem ser interrompidos involuntariamente (um nó torna-se inativo) ou voluntariamente (uma atualização é necessária). Ao configurar um orçamento de interrupção do pod, é possível exercer algum controle sobre a disponibilidade da sua aplicação quando interrupções ocorrem. Consulte Especificação de um orçamento de interrupção para sua aplicação para obter exemplos.

  • Namespaces: o Kubernetes fornece maneiras diferentes de isolar componentes e workloads do Kubernetes uns dos outros. Executar todos os pods de uma aplicação específica no mesmo Namespace é uma forma comum de proteger e gerenciar esses pods juntos. Você pode criar seus próprios namespaces para usar ou optar por não indicar um namespace (o que faz com que o Kubernetes use o namespace default). Os componentes do ambiente de gerenciamento do Kubernetes normalmente são executados no namespace kube-system.

A configuração descrita acima geralmente é reunida em um arquivo YAML para ser aplicada ao cluster do Kubernetes. Para clusters do Kubernetes pessoais, basta armazenar esses arquivos YAML em seu sistema local. No entanto, com clusters e workloads mais críticos, o GitOps é uma forma bastante popular de automatizar o armazenamento e as atualizações dos recursos de workload e infraestrutura do Kubernetes.

Os objetos usados para reunir e implantar as informações do pod são definidos por um dos seguintes métodos de implantação.

Implantar pods

O método que você escolheria para implantar pods depende do tipo de aplicação que você planeja executar com esses pods. Algumas das opções disponíveis são:

  • Aplicações sem estado: uma aplicação sem estado não salva os dados da sessão do cliente, portanto, outra sessão não precisa fazer referência ao que aconteceu em uma sessão anterior. Isso torna mais fácil simplesmente substituir os pods por novos caso eles percam a integridade ou movê-los sem salvar o estado. Se você estiver executando uma aplicação sem estado (como um servidor Web), poderá usar uma implantação para implantar pods e ReplicaSets. Um ReplicaSet define quantas instâncias de um pod você deseja executar simultaneamente. Embora seja possível executar um ReplicaSet diretamente, é comum executar réplicas diretamente em uma implantação para definir quantas réplicas de um pod devem ser executadas por vez.

  • Aplicações com estado: uma aplicação com estado é aquela em que a identidade do pod e a ordem na qual os pods são lançados são importantes. Essas aplicações precisam de armazenamento persistente que seja estável e que precise ser implantado e escalado de forma consistente. Para implantar uma aplicação com estado em Kubernetes, é possível usar StatefulSets. Um exemplo de aplicação que normalmente é executada como StatefulSet é um banco de dados. Em um StatefulSet, é possível definir réplicas, o pod e seus contêineres, volumes de armazenamento a serem montados e locais no contêiner em que os dados são armazenados. Consulte Executar uma aplicação com estado replicada para obter um exemplo de banco de dados sendo implantado como um ReplicaSet.

  • Aplicações por nó: há momentos em que você deseja executar uma aplicação em cada nó do seu cluster do Kubernetes. Por exemplo, seu data center pode exigir que cada computador execute uma aplicação de monitoramento ou um serviço de acesso remoto específico. Para o Kubernetes, é possível usar um DaemonSet para garantir que a aplicação selecionada seja executada em todos os nós do seu cluster.

  • Aplicações executadas até a conclusão: há algumas aplicações que você deseja executar para concluir uma tarefa específica. Isso pode incluir uma que gere relatórios de status mensais ou limpe dados antigos. Um objeto Job pode ser usado para configurar uma aplicação para inicializar e executar e, em seguida, sair quando a tarefa for concluída. Um objeto CronJob permite configurar uma aplicação para ser executado em uma hora, minuto, dia do mês, mês ou dia da semana específicos usando uma estrutura definida pelo formato crontab do Linux.

Como tornar as aplicações acessíveis via rede

Com as aplicações frequentemente implantadas como um conjunto de microsserviços que eram movidos para lugares diferentes, o Kubernetes precisava de uma forma de fazer com que esses microsserviços se encontrassem. Além disso, para que outras pessoas pudessem acessar uma aplicação fora do cluster do Kubernetes, o Kubernetes necessitava uma forma de expor essa aplicação em endereços e portas externos. Esses recursos relacionados à rede são implementados com objetos Service e Ingress, respectivamente:

  • Serviços: como um pod pode ser movido para diferentes nós e endereços, um outro pod que precisasse se comunicar com o primeiro pod poderia enfrentar dificuldades para descobrir onde ele está. Para resolver esse problema, o Kubernetes permite representar uma aplicação como um Service. Com um serviço, é possível identificar um pod ou conjunto de pods com um nome específico e, em seguida, indicar qual porta expõe o serviço dessa aplicação do pod e quais portas outra aplicação poderia usar para entrar em contato com esse serviço. Outro pod em um cluster pode simplesmente solicitar um Service pelo nome, e o Kubernetes direcionará essa solicitação para a porta adequada para uma instância do pod executando esse serviço.

  • Entrada: Ingress é o que pode disponibilizar aplicações representadas por serviços do Kubernetesdisponíveis para clientes que estão fora do cluster. Os recursos básicos de Ingress incluem um balanceador de carga (gerenciado pelo Ingress), o controlador do Ingress e regras para rotear solicitações do controlador para o Service. Existem vários controladores de Ingress que você pode escolher com o Kubernetes.

Próximas etapas

Compreender os conceitos básicos do Kubernetes e como eles se relacionam com o Amazon EKS ajudará você a navegar pela documentação do Amazon EKS e a documentação do Kubernetes para encontrar as informações necessárias para gerenciar clusters do Amazon EKS e implantar workloads nesses clusters. Para começar a usar o Amazon EKS, escolha uma das seguintes opções: