Встречается на 26% собеседований по DevOps

Что такое репликасет, деплоймент

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

Как работает ReplicaSet

ReplicaSet — это контроллер, который следит за тем, чтобы в любой момент времени в кластере было запущено ровно столько подов, сколько указано в поле spec.replicas. Если под удаляется, падает или создается лишний, ReplicaSet немедленно реагирует: создает новые поды или удаляет лишние, возвращая количество к нужному значению. Для выбора подов, которыми он управляет, ReplicaSet использует селектор меток (spec.selector.matchLabels).

Пример манифеста ReplicaSet:

yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: myapp-replicaset
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp-container
        image: myapp:1.0

Здесь ReplicaSet поддерживает три пода с образом myapp:1.0. Если один из подов будет удален, контроллер создаст новый, чтобы снова стало три.

Как работает Deployment

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

Ключевые возможности Deployment:

  • Rolling Update — стратегия обновления, при которой старые поды заменяются новыми постепенно, что минимизирует время простоя.
  • Откат — если обновление прошло неудачно, Deployment может вернуться к предыдущей версии ReplicaSet.
  • Масштабирование — можно изменять количество реплик, и Deployment обновит ReplicaSet соответствующим образом.

Пример манифеста Deployment:

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp-container
        image: myapp:2.0

В этом примере Deployment постепенно обновит поды с myapp:1.0 на myapp:2.0, при этом одновременно будет недоступен максимум один под (maxUnavailable: 1) и может быть создан один дополнительный под сверх нормы (maxSurge: 1).

Отличия и когда что использовать

КритерийReplicaSetDeployment
Уровень абстракцииНизкийВысокий
Управление версиямиНетДа (история ReplicaSet)
Стратегии обновленияНетRollingUpdate, Recreate
ОткатНетДа
МасштабированиеДаДа
Использование в реальных проектахРедко напрямуюПочти всегда

ReplicaSet редко используется напрямую, так как Deployment предоставляет все его функции и добавляет удобные механизмы обновления. Если вам нужно просто поддерживать фиксированное количество подов без обновлений, можно использовать ReplicaSet, но для большинства приложений рекомендуется Deployment.

Подводные камни

  • Селектор меток — у ReplicaSet и Deployment селектор должен совпадать с метками в шаблоне пода, иначе контроллер не сможет управлять подами.
  • Прямое изменение ReplicaSet — если вы измените образ в ReplicaSet, он не создаст новый ReplicaSet, а просто обновит поды (что может привести к непредсказуемому поведению). Deployment же создает новый ReplicaSet при каждом изменении.
  • Стратегия Recreate — если в Deployment указать strategy.type: Recreate, все старые поды будут удалены до создания новых, что вызовет простой. Для критичных сервисов лучше использовать RollingUpdate.

Коротко

  • ReplicaSet — контроллер, поддерживающий заданное количество копий пода.
  • Deployment — высокоуровневый контроллер, который управляет ReplicaSet и добавляет обновления, откаты и масштабирование.
  • Для продакшена используйте Deployment, а не ReplicaSet напрямую.
  • Deployment использует стратегию RollingUpdate по умолчанию, что минимизирует время простоя.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы