Что такое репликасет, деплоймент
ReplicaSet и Deployment — это два ключевых контроллера Kubernetes, которые управляют жизненным циклом подов, но на разных уровнях абстракции. ReplicaSet гарантирует, что в кластере всегда работает заданное количество копий пода, а Deployment — более высокоуровневый контроллер, который поверх ReplicaSet добавляет возможности декларативных обновлений, откатов и масштабирования. На практике Deployment используется для большинства приложений, так как он автоматически управляет ReplicaSet и предоставляет расширенные функции развертывания.
Как работает ReplicaSet
ReplicaSet — это контроллер, который следит за тем, чтобы в любой момент времени в кластере было запущено ровно столько подов, сколько указано в поле spec.replicas. Если под удаляется, падает или создается лишний, ReplicaSet немедленно реагирует: создает новые поды или удаляет лишние, возвращая количество к нужному значению. Для выбора подов, которыми он управляет, ReplicaSet использует селектор меток (spec.selector.matchLabels).
Пример манифеста ReplicaSet:
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:
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).
Отличия и когда что использовать
| Критерий | ReplicaSet | Deployment |
|---|---|---|
| Уровень абстракции | Низкий | Высокий |
| Управление версиями | Нет | Да (история 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 по умолчанию, что минимизирует время простоя.
Похожие вопросы
- Насколько сложные приходилось писать пайплайны на gitlab CI с использованием инклудов якорей33%
- Что такое kubernetes33%
- Какой у вас опыт работы с TeamCity26%
- Какой опыт самостоятельного написания докер файла26%
- Что такое pod26%
- Что такое и нужен ли swap26%
- Что такое helm, helm charts26%
- В чем разница Deployment и DaemonSet26%