Kubernetes: O que é um Pod

Por Gaspar Barancelli Junior em 04 de abril de 2024

Pods

Os pods são as menores unidades de computação implantáveis que você pode criar e gerenciar no Kubernetes.

Um pod é um grupo de um ou mais containers, com recursos de armazenamento, rede compartilhada e uma especificação de como executar os contêineres. O conteúdo de um pod é sempre colocado e programado conjuntamente e executado em um contexto compartilhado. Um pod modela um "host lógico" específico do aplicativo. Ele contém um ou mais containers de aplicativo que são acoplados de forma relativamente forte. Em contexto fora da nuvem, os aplicativos executados na mesma máquina física ou virtual são análogos aos aplicativos da nuvem executados no mesmo host lógico.

O que é um Pod

O Kubernetes oferece suporte aos seguintes runtimes para containers.

Mas como Docker é o runtime mais conhecido, vamos descrever os Pods usando terminologias do Docker.

O contexto compartilhado de um Pod é um conjunto de namespaces, cgroups e potencialmente outras facetas de isolamento do Linux, as mesmas coisas que isolam um contêiner Docker. Dentro do contexto de um pod, os aplicativos individuais podem ter outros subisolamentos aplicados.

Em termos de conceitos do Docker, um Pod é semelhante a um grupo de contêineres do Docker com namespaces compartilhados e volumes de sistema de arquivos compartilhados.

Usando Pods

Normalmente, você não precisa criar pods diretamente, nem mesmo pods singleton. Em vez disso, crie-os usando recursos como Deployment ou Job. Se seus pods precisam rastrear o estado, considere utilizar o recurso StatefulSet.

Os pods em um cluster Kubernetes são usados de duas maneiras principais:

  • Pods que executam um único contêiner: O modelo "um contêiner por pod" é o caso de uso mais comum do Kubernetes; nesse caso, você pode pensar em um pod como um invólucro em torno de um único contêiner; O Kubernetes gerencia pods em vez de gerenciar os contêineres diretamente.

  • Pods que executam vários contêineres que precisam trabalhar juntos: Um pod pode encapsular um aplicativo composto de vários contêineres co-localizados que estão fortemente acoplados e precisam compartilhar recursos. Esses contêineres co-localizados formam uma única unidade coesa de serviço - por exemplo, um contêiner servindo dados armazenados em um volume compartilhado para o público, enquanto um contêiner secundário separado atualiza ou altera esses arquivos. O pod agrupa esses contêineres, recursos de armazenamento e uma identidade de rede efêmera em uma única unidade.

Observação: Agrupar vários contêineres co-localizados e co-gerenciados em um único pod é um caso de uso relativamente avançado. Você deve usar esse padrão apenas em casos específicos em que seus contêineres estão fortemente acoplados.

Trabalho com pods

Você raramente criará pods individuais diretamente no Kubernetes ou mesmo pods singleton. Isso ocorre porque os pods são projetados como entidades relativamente efêmeras e descartáveis. Quando um pod é criado (diretamente por você ou indiretamente por um controlador), o novo pod está programado para ser executado em um dos Nós em seu cluster. O pod permanece nesse nó até que a execução do pod termine, o objeto do pod seja excluído, o pod seja removido por falta de recursos ou o nó falhe.

Pods e controladores

Você pode usar workloads para criar e gerenciar vários pods para você. Um controlador para o recurso lida com a replicação, implementação e correção automática em caso de falha do pod. Por exemplo, se um nó falhar, um controlador perceberá que os pods nesse nó pararam de funcionar e criará um pod substituto. O planejador coloca o pod substituto em um nó íntegro.

Modelos de pod

Controladores de workloads criam pods a partir de um template de pod e gerenciam esses pods em seu nome.

PodTemplates são especificações para a criação de pods e estão incluídos em recursos de Deployments, Jobs e DaemonSets.

Cada controlador de workloads usa o PodTemplate dentro do objeto do workloads para criar pods reais. O PodTemplate faz parte do estado desejado de qualquer workloads usado para executar seu aplicativo.

O exemplo abaixo é um manifesto de um simples Deployment. O container nesses pods sobem o Nginx como servidor http e faz o mapeamento da porta 80.

apiVersion: apps/v1 # para versões do Kubernetes anteriores 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    # A configuração do Pod inicia aqui
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
    # Fim da configuração do Pod

Modificar o modelo de pod ou mudar para um novo modelo de pod não afeta os pods já existentes. Os pods não recebem atualizações de modelos diretamente. Em vez disso, um novo pod é criado para corresponder ao modelo de pod revisado.

Por exemplo, o controlador de implantação garante que os pods em execução correspondam ao modelo de pod atual para cada objeto de implantação. Se o modelo for atualizado, a implantação deve remover os pods existentes e criar novos pods com base no modelo atualizado. Cada recurso de carga de trabalho implementa suas próprias regras para lidar com as alterações no modelo do pod.

Compartilhamento de recursos e comunicação

Os pods permitem o compartilhamento e a comunicação de dados entre seus contêineres constituintes.

Armazenamento em pods

Um pod pode especificar um conjunto de armazenamento compartilhado volumes. Todos os contêineres no pod podem acessar os volumes compartilhados, permitindo que esses contêineres compartilhem dados. Os volumes também permitem que os dados persistentes em um pod sobrevivam no caso de um dos contêineres precisar ser reiniciado.

Rede de pod

Cada pod recebe um endereço IP exclusivo para cada família de endereços. Cada contêiner em um pod compartilha o namespace de rede, incluindo o endereço IP e as portas de rede. Dentro de um pod (e somente então), os contêineres que pertencem ao pod podem se comunicar uns com os outros usando localhost. Quando os contêineres em um pod se comunicam com entidades fora do pod , eles precisam coordenar como usam os recursos de rede compartilhados (como portas). Em um pod, os contêineres compartilham um endereço IP e um espaço de porta e podem se encontrar por meio de localhost. Os contêineres em um Pod também podem se comunicar uns com os outros usando comunicações padrão entre processos, como semáforos SystemV ou memória compartilhada POSIX. Os contêineres em diferentes pods têm endereços IP distintos e não podem se comunicar por IPC sem configuração especial . Os contêineres que desejam interagir com um contêiner em execução em um pod diferente podem usar rede IP para se comunicar.

Esse documento foi uma tradução da própria documentação do Kubernetes, contendo apenas algumas modificações e considerações do autor.

// Compartilhe esse Post