В чем разница между Pod и Deployment в Kubernetes?

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

Ответ

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

Pod

  • Что это: Наименьшая и простейшая deployable единица в Kubernetes. Это обертка для одного или нескольких тесно связанных контейнеров, которые разделяют сетевое пространство (один IP) и хранилище (volumes).
  • Характеристики:
    • Эфемерный (Ephemeral): Не предназначен для долгой жизни. При сбое или перезапуске ноды Pod умирает.
    • Нет самовосстановления: Если контейнер внутри Pod падает, Kubelet попытается его перезапустить, но если упадет вся нода — Pod потерян навсегда.
    • Нет масштабирования: Вручную созданный Pod существует в единственном экземпляре.
  • Пример (pod.yaml):
    apiVersion: v1
    kind: Pod
    metadata:
    name: my-static-pod
    spec:
    containers:
    - name: nginx
    image: nginx:alpine

Deployment

  • Что это: Объект API, который описывает желаемое состояние для группы идентичных Pod'ов. Deployment создает и управляет другим объектом — ReplicaSet, который, в свою очередь, гарантирует наличие заданного количества реплик Pod'ов.
  • Ключевые возможности (чего нет у "голого" Pod):
    1. Репликация и самовосстановление: Поддерживает заданное количество идентичных Pod'ов (replicas: 3). Если Pod падает или удаляется, Deployment через ReplicaSet немедленно создает новый.
    2. Бесперебойные обновления (Rolling Update): Позволяет обновить версию образа контейнера с минимальным временем простоя, постепенно заменяя старые Pod'ы новыми.
    3. Откат (Rollback): Возможность мгновенно вернуться к предыдущей стабильной версии Deployment'а.
    4. Декларативное управление: Вы описываете, что хотите получить (3 реплики Nginx версии 1.25), а Kubernetes сам приводит кластер в это состояние.
  • Пример (deployment.yaml):
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    spec:
    replicas: 3
    selector:
    matchLabels:
      app: nginx
    template: # Шаблон для создания Pod'ов
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25-alpine
        ports:
        - containerPort: 80

Практическое правило: В production-кластерах Pod'ы почти никогда не создаются напрямую. Вместо этого используются контроллеры высшего уровня: Deployment для stateless-приложений, StatefulSet для stateful, DaemonSet для агентов на каждой ноде и Job/CronJob для задач.