Может ли Deployment в Kubernetes существовать без ReplicaSet?

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

Ответ

Нет, Deployment не может существовать или функционировать без ReplicaSet. Deployment — это абстракция более высокого уровня, которая управляет ReplicaSet'ами для реализации декларативных обновлений, откатов и масштабирования приложений.

Как это работает:

  1. Когда вы создаёте Deployment, Kubernetes сразу создаёт под капотом первый ReplicaSet для управления Pod'ами согласно заданной спецификации (spec.template).
  2. При обновлении образа (например, kubectl set image deployment/nginx nginx=nginx:1.19) Deployment создаёт новый ReplicaSet с обновлённым Pod template и начинает постепенный rollout.
  3. Старый ReplicaSet сохраняется (по умолчанию) для возможности быстрого отката (kubectl rollout undo).

Практический пример:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - name: nginx
        image: nginx:1.18-alpine
        ports:
        - containerPort: 80

После применения этого манифеста можно увидеть связь:

# Показать Deployment
kubectl get deployment frontend
# Показать управляемые ReplicaSet'ы (имя содержит хэш template)
kubectl get replicaset -l app=frontend
# Показать Pod'ы, созданные ReplicaSet'ом
kubectl get pods -l app=frontend

Что произойдёт, если удалить ReplicaSet вручную? Deployment немедленно заметит расхождение между желаемым состоянием (3 реплики) и фактическим (0 реплик) и автоматически создаст новый ReplicaSet, который, в свою очередь, создаст новые Pod'ы. Это демонстрирует принцип работы control loop'а в Kubernetes.

Альтернативы для прямого управления Pod'ами: Если вам нужен синглтон-под или специфическое управление жизненным циклом без стратегий обновления, можно использовать:

  • StatefulSet — для stateful-приложений с устойчивыми идентификаторами и хранилищем.
  • DaemonSet — для запуска пода на каждой (или группе) нод.
  • Job/CronJob — для задач, которые должны завершиться.