- Definição: Uma aplicação é a implementação da lógica de negócios. Embora não seja um conceito oficial do K8S, os programas que rodam dentro dos containers são normalmente considerados aplicações.
- Relação Hierárquica: Aplicação ∈ Container. O Pod é o veículo para executar a aplicação, e geralmente há uma correspondência um-para-um entre aplicação e container, mas múltiplos containers podem formar uma aplicação complexa.
Container
- Definição: O container é a menor unidade para executar aplicações. Ele empacota o aplicativo e todas as suas dependências, garantindo execução consistente em qualquer ambiente.
- Relação Hierárquica: Container ∈ Pod. Um Pod pode conter um ou mais containers, que compartilham recursos como rede e armazenamento.
Pod
- Definição: Um conjunto de um ou mais containers que compartilham um ambiante de rede (endereço IP, portas) e recursos de armazenamento. É a menor unidade de agendamento e implantação no K8S, atuando como uma abstração dos containers.
- Funcionalidade: Facilita a comunicação e colaboração entre containers.
- Relação Hierárquica: Normalmente, um Pod contém apenas um container (relação um-para-um). No entanto, para aplicações complexas que requerem colaboração entre múltiplos containers, um pode incluir vários.
- Ciclo de Vida: Os Pods não são entidades estáveis; são facilmente criados ou destruídos. Em caso de falha, o K8S automaticamente substitui por um novo Pod (não repara o antigo, e o IP também é realocado).
Service (Serviço)
- Definição: Um Service é uma abstração de serviço que encapsula um grupo de Pods, fornecendo um ponto de acesso unificado.
- Funcionalidade:
- Resolve a instabilidade dos IPs dos Pods: oferece uma forma estável de acesso (como um endereço IP fixo ou nome DNS).
- Permite que aplicações usem nomes DNS em vez de IPs diretos, proporcionando descoberta de serviços e balanceamento de carga.
- Relação Hierárquica: Um Service gerencia múltiplos Pods, e um Node pode hospedar múltiplos Services.
- Classificação:
- Serviços Externos: Acessíveis por clientes externos ou dentro do cluster, com uma interface estável (IP e porta do Service não mudam com os Pods).
- Serviços Internos: Restritos ao cluster, não expostos externamente.
- Tipos Principais:
- ClusterIP: Tipo padrão, expõe o serviço apenas internamente no cluster.
- NodePort: Tipo comum, expõe o serviço em uma porta específica em cada Node, permitindo acesso externo.
- LoadBalancer: Cria um balanceador de carga externo em ambientes de nuvem suportados e roteia tráfego para o serviço.
- ExternalName: Mapeia o serviço para um nome DNS externo.
- Headless: Tipo sem cabeça, usado principalmente para resolução DNS e descoberta de serviços.
- Exemplo:
-
Objetivo: Expor uma aplicação (MeuApp) via um serviço NodePort para acesso externo, permitindo que usuários acessem através do IP do nó e porta (30080).
-
Fluxo de Trabalho:
- O serviço meu-app-service é exposto na porta 30080 para acesso externo.
- O Kube Proxy escuta requisições na porta 30080 e as encaminha para a porta 80 do meu-app-service.
- O Service seleciona Pods com o label app=MeuApp e aplica balanceamento de carga para escolher um Pod.
- A requisição é encaminhada para a porta do Pod de backend (porta-alvo: 8080).
- O Pod processa a requisição e retorna a resposta ao Service.
- O Service retorna a resposta ao Kube Proxy.
- O Kube Proxy devolve a resposta ao usuário.
-
Implementação de Código: ``` apiVersion: v1 # Versão da API para interação com o API Server kind: Service # Tipo de recurso como Service metadata: # Metadados do serviço nome: meu-app-service # Nome do serviço para referência interna e externa spec: # Especificações de configuração do recurso tipo: NodePort # Tipo do serviço exposto externamente seletor: # Seletor para escolher Pods com base em labels app: MeuApp # Seleciona Pods com label app=MeuApp portas: - protocolo: TCP # Protocolo usado pelo serviço porta: 80 # Porta do serviço exposta internamente no cluster porta-alvo: 8080 # Porta do Pod de backend porta-no: 30080 # Porta exposta externamente, deve estar entre 30000-32767
-
Node (Nó)
- Definição: Uma máquina física ou virtual em um cluster Kubernetes, que serve como unidade de trabalho para executar Pods.
- Componentes Principais:
- kubelet: Comunica-se com o plano de controle e gerencia o ciclo de vida dos containers e Pods no nó.
- Runtime do container (ex.: Docker, containerd): Responsável pela execução e gerenciamento real dos containers.
- kube-proxy: Mantém regras de rede no nó, implementando proxy de rede e balanceamento de carga para Services.
- Relação Hierárquica: Pod ∈ Service ∈ Node. Os recursos do nó (CPU, memória) são alocados para os Pods que rodam nele.
Cluster
- Definição: Um conjunto de múltiplos Nodes, formando a infraestrutura base para o Kubernetes gerenciar e agendar aplicações containerizadas.
- Relação Hierárquica: Node ∈ Cluster. O plano de controle do Kubernetes agencia tarefas em diferentes nós.
Ingress
-
Definição: Um objeto de API que atua como ponto de entrada para acesso externo a serviços dentro do cluster, geranciando rotas HTTP e HTTPS.
-
Funcionalidade: Oferece diversos métodos de roteamento:
- Roteamento Baseado em Caminho: Encaminha tráfego com base no caminho da URL.
- Roteamento Baseado em Domínio: Roteia com base no cabeçalho do host (domínio).
- Balanceamento de Carga: Distribui requisições entre diferentes Services e seus Pods.
- Suporte a TLS: Configura terminação SSL/TLS para acesso HTTPS seguro.
-
Componentes:
- Recurso Ingress: Objeto de configuração que define regras de roteamento (domínio, caminho, serviço de backend).
- Regras de Ingress: Conjunto de regras para rotear requisições externas, baseadas em host ou caminho URL.
- Controlador Ingress: Implementa a funcionalidade do Ingress, monitorando recursos e aplicando regras (ex.: Nginx Ingress Controller, Traefik).
-
Exemplo de Configuração:
- Objetivo: Redirecionar tráfego de meu-app.example.com para meu-service na porta 80.
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: nome: exemplo-ingress spec: regras: - host: meu-app.example.com http: caminhos: - caminho: / tipo-caminho: Prefixo backend: servico: nome: meu-servico porta: numero: 80
ConfigMap
- Funcionalidade: Armazena configurações públicas para desacoplar dados de configuração dos Pods.
- Observação: As informações no ConfigMap são armazenadas em texto claro; evite usá-lo para dados sensíveis.
Secret
- Definição: Usado para encapsular informações sensíveis, codificando-as em Base64 (embora não seja totalmente seguro, pois Base64 é facilmente decodificável).
Volume
- Definição: Uma interface abstrata de armazenamento que fornece capacidade de armazenamento persistente para containers, garantindo que os dados sobrevivam a reinicializações ou migrações de Pods.
- Funcionalidade: Permite montar recursos que precisam de armazenamento persistente em discos locais do cluster ou em armazenamento remoto externo (ex.: OSS).
Deployement (Implantação)
- Definição: Um objeto de gerenciamento declarativo para aplicações sem estado, controlando réplicas de Pods, estratégias de atualização e métodos de implantação.
- Funcionalidade:
- Auto-escalonamento: Ajusta automaticamente o número de réplicas de Pods com base na configuração, garantindo alta disponibilidade.
- Atualização Gradual: Atualiza a aplicação de forma incremental para evitar interrupções no serviço.
- Controle de Réplicas: Mantém o número desejado de réplicas de Pods, criando novas automaticamente em caso de falha. Por exemplo, com 3 réplicas configuradas, o sistema sempre garante 3 Pods saudáveis.
StatefulSet
- Definição: Componente para gerenciar serviços com estado, como bancos de dados, caches e filas de mensagens, onde a ordem e a persistência são críticas.
- Funcionalidade:
- Auto-escalonamento: Expande e contrai em ordem fixa para garantir consistência de dados e disponibilidade.
- Controle de Réplicas: Mantém um identificador fixo para cada Pod, preservando sua identidade de rede e armazenamento mesmo após reagendamento.
- Armazenamento de Estado: Cada réplica possui um identificador de rede estável (via Headless Service) e armazenamento persistente (via PVC).
- Implantação Ordenada: Cria Pods em ordem numérica (0,1,2...), garantindo que um esteja totalmente pronto antes de iniciar o próximo.
Namespace
- Definição: Um mecanismo lógico de isolamento de recursos para criar múltiplos ambientes virtuais dentro de um mesmo cluster físico.
- Funcionalidade: Divide os recursos do cluster em clusters virtuais distintos, cada um com cotas de recursos e políticas de acesso independentes.