Pod (в Kubernetes)

⌘K

Pod (в Kubernetes)

Pod — это минимальная и атомарная единица развертывания в Kubernetes. Он представляет собой логическое окружение для одного или нескольких контейнеров, которые запускаются совместно, делят между собой сетевой стек, IP-адрес и тома (хранилище). Все контейнеры внутри пода видят друг друга как localhost и могут совместно использовать данные через общие тома.

Pod создаётся и управляется как единое целое: если один из контейнеров выходит из строя, Kubernetes может перезапустить весь под. Именно поэтому в один под помещают тесно связанные процессы, например — основной сервис и вспомогательный sidecar-контейнер (логирование, прокси, мониторинг и т.п.).

Каждому поду назначается уникальный IP-адрес внутри кластера, и он становится доступен другим подам по внутренней сети. Команды kubectl describe pod, kubectl logs, kubectl exec позволяют получить детальную информацию о состоянии пода, посмотреть логи или войти внутрь контейнера.

В отличие от контейнера, который — это просто исполняемая среда, pod — это обёртка, которая определяет, как контейнер будет работать в рамках кластера: где хранить данные, как взаимодействовать с другими сервисами, какие порты открыты, и какие ресурсы нужны.

Поды — это основной строительный блок в Kubernetes. Они обеспечивают гибкое масштабирование, быструю замену, и устойчивость к сбоям. K8s может создавать или удалять поды в зависимости от нагрузки, автоматизируя жизненный цикл приложения.

Pod vs Container:
Container — это единица запуска (например, процесс в Docker),
Pod — это единица управления и развертывания в Kubernetes, которая может включать несколько контейнеров.

Понимание архитектуры подов — ключевой шаг к работе с Kubernetes, особенно при построении микросервисов, CI/CD пайплайнов и масштабируемых облачных решений.


Пример YAML-файла для Pod

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
  labels:
    app: demo
spec:
  containers:
    - name: nginx-container
      image: nginx:1.25
      ports:
        - containerPort: 80
      resources:
        limits:
          memory: "128Mi"
          cpu: "500m"

Что делает этот Pod:

  • Разворачивает контейнер с образом nginx:1.25.
  • Открывает порт 80 внутри контейнера.
  • Ограничивает использование ресурсов: до 128 МБ оперативной памяти и 0.5 CPU.
  • Присваивает имя example-pod и метку app: demo.

Пример Pod с двумя контейнерами

apiVersion: v1
kind: Pod
metadata:
  name: multi-container-pod
  labels:
    app: demo-multi
spec:
  containers:
    - name: app-container
      image: nginx:1.25
      ports:
        - containerPort: 80
      volumeMounts:
        - name: shared-logs
          mountPath: /var/log/nginx

    - name: log-sidecar
      image: busybox
      command: ["sh", "-c", "tail -f /var/log/nginx/access.log"]
      volumeMounts:
        - name: shared-logs
          mountPath: /var/log/nginx

  volumes:
    - name: shared-logs
      emptyDir: {}

Что здесь происходит:

  • Первый контейнер (app-container) запускает NGINX — это основной сервис.
  • Второй контейнер (log-sidecar) запускает busybox, который просто читает логи NGINX в режиме tail -f.
  • Оба контейнера используют общий том shared-logs, созданный через emptyDir. Это временное хранилище, доступное им одновременно.
  • Контейнеры работают как единый процесс: Kubernetes управляет ими как одним целым.