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
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 nó 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 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
Na Nuvem AWS, é possível criar clusters do Amazon EKS usando ferramentas de CLI, como eksctl
-
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 EKSpara 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
O Amazon EKS Anywhere é baseado no mesmo software Amazon EKS Distro
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
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çokubelet
para saber o status de um pod. -
Armazenar dados sobre o cluster (armazenamento de valore de chave de
etcd
): o serviçoetcd
exerce a função crítica de acompanhar o estado atual do cluster. Se o serviçoetcd
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çoetcd
com balanceamento de carga em execução ao mesmo tempo e fazem backups periódicos do armazenamento dos valores de chave doetcd
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 oetcd
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
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 kubeletem 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 Dockerem 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
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
Para obter uma lista mais completa dos complementos do Amazon EKS disponíveis, consulte Complementos do Amazon EKS.
Workloads
O Kubernetes define uma workload
Contêineres
O elemento mais básico de uma workload de aplicação que você implanta e gerencia no Kubernetes é um pod
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
As especificações do pod (PodSpec
DaemonSets
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
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
eyarn
para instalar um aplicativo Java ouyum
ednf
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
ouCOPY
arquivos do sistema local), identificar comandos para executar quando o contêiner for executado (CMD
ouENTRYPOINT
) e conectar o contêiner ao sistema em que ele é executado (identificando oUSER
de execução, umVOLUME
local para montagem ou as portas paraEXPOSE
).
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
nerdctl
Armazenamento de contêineres
Após criar sua imagem de contêiner, você poderá armazená-la em um registro de distribuição
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
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
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
-
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 namespacekube-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
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