Что такое Pod в Kubernetes?

«Что такое Pod в Kubernetes?» — вопрос из категории Kubernetes, который задают на 36% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Pod — это наименьшая и простейшая единица развертывания в Kubernetes. Это абстракция над одним или несколькими контейнерами, которые всегда размещаются вместе на одном узле и разделяют общие ресурсы.

Ключевые характеристики Pod, которые я учитываю в работе:

  1. Общее сетевое пространство: Все контейнеры внутри Pod имеют один IP-адрес и могут общаться друг с другом через localhost. Они также совместно используют пространство портов, поэтому контейнеры не могут использовать один и тот же порт.
  2. Общее хранилище: Pod может определять набор томов (volumes), которые доступны для всех контейнеров внутри него. Это позволяет контейнерам обмениваться данными.
  3. Единый жизненный цикл: Pod создается, запускается и удаляется как единое целое. Контейнеры внутри Pod запускаются параллельно, а не последовательно.

Типичные сценарии использования Pod'ов:

  • Один контейнер: Наиболее распространенный шаблон, где Pod является оберткой вокруг одного контейнера приложения.
  • Вспомогательные контейнеры (sidecar): Например, основной контейнер веб-сервера и sidecar-контейнер, который синхронизирует файлы из внешнего хранилища.

Пример манифеста Pod с двумя контейнерами (основным и sidecar):

apiVersion: v1
kind: Pod
metadata:
  name: web-app-with-log-shipper
spec:
  volumes:
  - name: shared-logs
    emptyDir: {}
  containers:
  - name: web-app
    image: myapp:latest
    volumeMounts:
    - name: shared-logs
      mountPath: /var/log/myapp
  - name: log-shipper
    image: fluentd:latest
    volumeMounts:
    - name: shared-logs
      mountPath: /var/log/myapp

Важно: В реальной практике Pod'ы редко создаются напрямую. Вместо этого я использую контроллеры более высокого уровня, такие как Deployment или StatefulSet, которые управляют созданием, репликацией и состоянием Pod'ов, обеспечивая отказоустойчивость и масштабируемость приложения.