Що таке ReplicaSet?
На практиці ReplicaSet рідко створюється напряму — його створює Deployment. Deployment керує ReplicaSet, а ReplicaSet керує Pod'ами.
Junior рівень
Просте пояснення
ReplicaSet (RS) — це контролер Kubernetes, який гарантує, що задана кількість копій (реплік) Pod’ів завжди працює. Якщо Pod впав — ReplicaSet запустить новий.
На практиці ReplicaSet рідко створюється напряму — його створює Deployment. Deployment керує ReplicaSet, а ReplicaSet керує Pod’ами.
Проста аналогія
ReplicaSet — як менеджер в магазині, який стежить, щоб на касі завжди працювала потрібна кількість касирів. Якщо один пішов на перерву — менеджер кличе іншого.
Як працює ReplicaSet?
- Ви кажете: “Мені потрібно 3 копії додатку”
- ReplicaSet перевіряє: “Скільки зараз працює?”
- Якщо менше 3 — запускає нові Pod’и
- Якщо більше 3 — видаляє зайві
- Повторює постійно (Reconciliation Loop)
Приклад
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myapp-rs
spec:
replicas: 3 # Хочу 3 копії
selector:
matchLabels:
app: myapp # Шукає Pod'и з цією міткою
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:1.0
ReplicaSet vs Deployment
ReplicaSet vs Deployment: ReplicaSet гарантує N копій Pod. Deployment додає rolling updates, rollback, історію ревізій. В 99% випадків використовуйте Deployment.
В реальності ви майже ніколи не створюєте ReplicaSet вручну. Замість цього використовуєте Deployment — він керує ReplicaSet’ами за вас.
Deployment додає:
- Rolling updates (оновлення без простою)
- Rollback (відкат до попередньої версії)
- Історію версій
Що запам’ятати Junior-розробнику
- ReplicaSet підтримує потрібне число Pod’ів
- Якщо Pod впав — ReplicaSet створить новий
- В продакшені використовуйте Deployment, не ReplicaSet
- Deployment керує ReplicaSet’ами
- Селектори міток пов’язують ReplicaSet з Pod’ами
Middle рівень
Reconciliation Loop (Цикл звірки)
ReplicaSet працює за принципом нескінченного циклу:
1. Прочитати desired replicas з spec.replicas
2. Порахувати поточні Pod'и за selector
3. Якщо менше desired → створити Pod'и
4. Якщо більше desired → видалити Pod'и
5. Почекати і повторити
Цей цикл забезпечує самовідновлення: скільки б Pod’ів не впало, ReplicaSet завжди прагне до desired state.
Зв’язок з Deployment
Deployment
↓ керує
ReplicaSet v1 (image: myapp:1.0, replicas: 0) ← стара версія
ReplicaSet v2 (image: myapp:2.0, replicas: 3) ← поточна версія
↓ керує
Pod × 3
При оновленні Deployment:
- Створює новий ReplicaSet з новим образом
- Поступово переносить Pod’и зі старого RS в новий
- Старий RS зберігається для rollback
Селектори
ReplicaSet використовує set-based selectors:
selector:
matchLabels:
app: myapp
env: production
# Або складніші:
selector:
matchExpressions:
- key: app
operator: In
values: [myapp, myapp-v2]
- key: env
operator: NotIn
values: [development]
ownerReference
Кожен Pod має посилання на свій ReplicaSet:
metadata:
ownerReferences:
- apiVersion: apps/v1
kind: ReplicaSet
name: myapp-rs-abc123
uid: ...
Це дозволяє K8s автоматично видаляти Pod’и при видаленні ReplicaSet.
Чому не ReplicationController?
ReplicationController — застарілий (legacy) об’єкт. ReplicaSet відрізняється підтримкою set-based selectors з операторами In, NotIn, Exists.
Що запам’ятати Middle-розробнику
- ReplicaSet = механізм підтримання числа реплік
- Reconciliation Loop постійно звіряє desired vs actual
- Deployment керує ReplicaSet’ами для rolling updates
- Set-based selectors потужніші за прості matchLabels
- ownerReference забезпечує каскадне видалення
Senior рівень
ReplicaSet як примітив забезпечення відмовостійкості
ReplicaSet — це низькорівневий контролер, який реалізує фундаментальний патерн Kubernetes: declarative state reconciliation.
Архітектура ReplicaSet Controller
kube-controller-manager
└── replicaset-controller
├── Watch ReplicaSet changes
├── Watch Pod changes
├── Sync: compare desired vs actual
├── Scale up: create Pods
└── Scale down: delete Pods
Controller підписаний на події:
- Створення/зміна ReplicaSet
- Видалення Pod’ів (щоб замінити їх)
- Зміна Pod’ів, що підходять під selector
Pod Disruption і ReplicaSet
При kubectl drain або node eviction:
- Pod’и позначаються для видалення
- ReplicaSet бачить зменшення числа Pod’ів
- Створює нові Pod’и на інших Node
- drain завершується, старі Pod’и видалені
Overlapping Selectors: небезпека
# ReplicaSet A
selector:
matchLabels:
app: myapp
tier: frontend
# ReplicaSet B
selector:
matchLabels:
app: myapp
Якщо Pod має мітки app: myapp, tier: frontend, обидва RS можуть намагатися ним керувати. Це призводить до невизначеної поведінки.
Захист: Kubernetes не забороняє overlapping selectors — відповідальність на інженері.
Adoption існуючих Pod’ів
ReplicaSet може “захопити” вже існуючі Pod’и:
# Pod створений вручну
kubectl run myapp --image=myapp:1.0 --labels=app=myapp
# Створюємо RS з тим же selector
# RS "бачить" існуючий Pod і adopts його
Це використовується при міграції з manual Pod на Deployment.
Масштабування ReplicaSet
# Imperative
kubectl scale rs myapp-rs --replicas=5
# Через kubectl edit
kubectl edit rs myapp-rs
# Через patch
kubectl patch rs myapp-rs -p '{"spec":{"replicas":5}}'
Коли створювати ReplicaSet напряму?
Практично ніколи. Єдині сценарії:
- Навчання/розуміння K8s internals
- Кастомні контролери (на базі ReplicaSet логіки)
- Специфічні use cases, де Deployment не підходить
Troubleshooting
Pod’и не створюються:
kubectl describe rs myapp-rs
# Events: Normal SuccessfulCreate pod/myapp-xyz created
# Warning FailedCreate error creating pods
Занадто багато Pod’ів:
- Перевірте overlapping selectors
- Перевірте, чи не створює Pod’и інший контролер
Pod’и не видаляються:
- Перевірте PodDisruptionBudget
- Перевірте finalizers на Pod’ах
Резюме для Senior
- ReplicaSet гарантує N копій додатку.
- Це низькорівневий механізм, яким керує Deployment.
- Reconciliation Loop — фундаментальний патерн K8s.
- RS не вміє оновлювати образи — це логіка Deployment.
- Overlapping selectors → невизначена поведінка.
- ownerReference забезпечує каскадне видалення.
- Використовуйте мітки з обережністю, щоб RS випадково не видалив чужі Pod’и.
🎯 Шпаргалка для інтерв’ю
Обов’язково знати:
- ReplicaSet гарантує задане число реплік Pod’ів (reconciliation loop)
- В 99% випадків використовуйте Deployment, не ReplicaSet напряму
- Deployment керує ReplicaSet’ами для rolling updates і rollback
- Reconciliation Loop: desired vs actual → створити/видалити Pod’и → повторити
- ownerReference забезпечує каскадне видалення Pod’ів при видаленні RS
- Overlapping selectors → невизначена поведінка (два RS конкурують)
- ReplicationController — застарілий (legacy); ReplicaSet підтримує set-based selectors
Часті уточнюючі питання:
- «Навіщо ReplicaSet якщо є Deployment?» — Deployment — високорівнева абстракція; RS — механізм під капотом
- «Що буде якщо видалити ReplicaSet?» — Усі Pod’и видаляються (ownerReference каскад)
- «ReplicaSet вміє оновлювати образи?» — Ні, це логіка Deployment
- «Чи може RS захопити існуючі Pod’и?» — Так, якщо Pod підходить під selector (adoption)
Червоні прапорці (НЕ говорити):
- «Створюю ReplicaSet напряму в продакшені» (використовуйте Deployment)
- «ReplicaSet робить rolling updates» (це Deployment)
- «Overlapping selectors — не проблема» (призводить до race conditions)
- «ReplicationController — сучасний стандарт» (застарів, використовуйте ReplicaSet)
Пов’язані теми:
- [[Що таке Kubernetes і навіщо він потрібен]] — контролери K8s
- [[Як організувати rolling update в Kubernetes]] — Deployment + RS
- [[Як відбувається масштабування в Kubernetes]] — масштабування реплік