Чем отличаются Deployment и ReplicaSet в Kubernetes?

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

Ответ

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

Ключевые отличия:

Аспект ReplicaSet Deployment
Основная цель Поддержание стабильного набора идентичных подов. Управление жизненным циклом приложения: развертывание, обновление, откат.
Обновление Не поддерживает стратегии обновления. Чтобы обновить образ, нужно создать новый ReplicaSet и удалить старый вручную. Поддерживает стратегии обновления (RollingUpdate — по умолчанию, Recreate). Автоматически создает новый ReplicaSet при изменении Pod template.
Откат (Rollback) Нет встроенного механизма. Есть команда kubectl rollout undo, которая откатывается к предыдущему ReplicaSet. Хранит историю ревизий.
Использование Редко используется напрямую. Обычно является строительным блоком для Deployment. Основной ресурс для развертывания stateless-приложений.

На практике: Вы почти всегда создаете Deployment. Он под капотом создаст ReplicaSet, который, в свою очередь, создаст нужные Pod'ы.

Пример Deployment, который создаст и будет управлять ReplicaSet:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: frontend
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1  # Максимум 1 под может быть недоступен во время обновления
      maxSurge: 1        # Максимум на 1 под может быть больше желаемого количества
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - name: app
        image: myregistry/frontend:v1.2.3
        ports:
        - containerPort: 8080
---
# Команда для обновления образа (Deployment создаст новый ReplicaSet)
kubectl set image deployment/frontend-app app=myregistry/frontend:v1.2.4