Гид по технологиям

ReplicaSet в Kubernetes: как создаётся и как работает

• 4 min read • Kubernetes • Обновлено 19 Nov 2025
ReplicaSet в Kubernetes — создание и поведение
ReplicaSet в Kubernetes — создание и поведение

Что такое ReplicaSet

ReplicaSet — контроллер Kubernetes. Он следит за тем, чтобы в любой момент было запущено нужное количество копий Pod. ReplicaSet использует селекторы по меткам, чтобы определять, какие Pod считать своими репликами.

Ключевая идея: если в кластере окажется меньше Pod, чем указано в spec.replicas, ReplicaSet создаст недостающие. Если Pod больше — он удалит лишние, чтобы число совпадало с конфигурацией.

Важно: в большинстве сценариев управления обновлениями и версионированием рекомендуется использовать Deployment вместо прямого управления ReplicaSet.

Шаблон ReplicaSet

Ниже — пример корректного описания ReplicaSet. Обратите внимание на регистр полей YAML: metadata и spec пишутся со строчной буквы.

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: some-name
  labels:
    app: some-App
    tier: some-Tier
spec:
  replicas: 3
  selector:
    matchLabels:
      tier: some-Tier
    matchExpressions:
      - {key: tier, operator: In, values: [some-Tier]}
  template:
    metadata:
      labels:
        app: some-App
        tier: someTier
    spec:
      containers:
      - name: nginx
        image: nginx

Что мы сделаем в этом руководстве

  • Создадим ReplicaSet
  • Посмотрим, как ReplicaSet сопоставляет Pod по меткам
  • Проверим поведение при ручном создании Pod с совпадающими и неперекрывающимися метками

Схема работы ReplicaSet и Pod

Создание ReplicaSet: практический пример

Создайте файл my-replica-set.yml и вставьте туда следующее описание:

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-proxy
  labels:
    app: nginx-proxy
    tier: frontend
spec:
  # modify replicas according to your case
  replicas: 3
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      labels:
        tier: frontend
    spec:
      containers:
      - name: nginx
        image: nginx

Файл описания my-replica-set.yml в редакторе

Команды для проверки и создания:

kubectl get replicaset
kubectl create -f my-replica-set.yml
kubectl get replicaset
kubectl get pods

Список созданных Pods после создания ReplicaSet

В результате вы получите три Pod, управляемых ReplicaSet.

Что произойдёт, если создать Pod с теми же метками вручную

Создайте файл my-test-pod.yml:

apiVersion: v1
kind: Pod
metadata:
  name: pod1
  labels:
    tier: frontend
spec:
  containers:
  - name: nginx
    image: nginx

Создание тестового Pod с меткой tier: frontend

Если вы попытаетесь создать такой Pod, то заметите, что он окажется в состоянии Terminating или будет удалён контроллером. Причина в том, что ReplicaSet поддерживает строгое число реплик: при ручном создании ещё одной подлинной реплики общее число превысит spec.replicas, и контроллер удалит лишнюю копию, чтобы вернуть точное значение.

kubectl get pods
kubectl create -f my-test-pod.yml
kubectl get pods

Ручной pod удаляется контроллером ReplicaSet

Подробности о ReplicaSet:

kubectl get replicaset
kubectl describe replicaset nginx-proxy

Вывод kubectl describe replicaset показывает, что лишний pod удалён

Создание Pod без меток

Если создать Pod без меток, ReplicaSet его не тронет. Пример my-test-pod-no-label.yml:

apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
  - name: nginx
    image: nginx

Создание pod без меток в редакторе

Команды и результат:

kubectl get pods
kubectl create -f my-test-pod-no-label.yml
kubectl get pods

Pod без меток успешно создан и не удалён ReplicaSet

Объяснение: селектор ReplicaSet ищет Pod по меткам. Если у Pod нет меток, совпадения не происходит, и ReplicaSet не считает этот Pod своей репликой.

Удаление Pod, управляемого ReplicaSet

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

kubectl get pods
kubectl delete pod nginx-proxy-6gc46
kubectl get pods

При удалении pod ReplicaSet создаёт новый, чтобы восстановить число реплик

Удаление ReplicaSet и ручных Pod

Чтобы удалить ReplicaSet и все Pod, которые он создаёт, выполните:

kubectl get replicaset
kubectl delete replicaset nginx-proxy
kubectl get replicaset
kubectl get pods

Результат удаления ReplicaSet; ручные pod остаются

Ручные Pod, не принадлежащие ReplicaSet, нужно удалять отдельно:

kubectl get pods
kubectl delete pod pod1
kubectl get pods

Удаление ручного pod1

Когда ReplicaSet не подходит

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

Альтернативные подходы

  • Deployment: создаёт ReplicaSet и управляет им; предоставляет стратегии обновления и отката. Рекомендуется для большинства рабочих нагрузок.
  • StatefulSet: для приложений с сохранением состояния и стабильными идентификаторами Pod.
  • DaemonSet: чтобы запускать Pod на каждом узле.

Правила и эвристики

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

Чек-листы по ролям

Оператор:

  • Проверить apiVersion и корректность полей metadata/spec
  • Убедиться, что selector совпадает с метками в template
  • Проверить созданные Pod через kubectl get pods

Разработчик:

  • Убедиться, что приложение корректно стартует с указанным образом
  • Не назначать лишние метки, которые могут совпасть с продовыми селекторами

Критерии приёмки

  • ReplicaSet создан без ошибок
  • Число Pod соответствует spec.replicas
  • При удалении Pod ReplicaSet создаёт новый
  • Ручные Pod с совпадающими метками удаляются, Pod без меток остаются

Краткая методология миграции с ReplicationController на ReplicaSet/Deployment

  1. Создайте манифест Deployment, соответствующий текущему RC.
  2. Примените Deployment с правильным селектором и шаблоном Pod.
  3. Подтвердите, что новые Pod работают корректно.
  4. Удалите старый ReplicationController, если он больше не нужен.

Глоссарий

  • Pod — минимальная развертываемая единица в Kubernetes, контейнеры в одном Pod делят сеть и тома.
  • ReplicaSet — контроллер, обеспечивающий заданное число копий Pod.
  • Selector — правило на основе меток для поиска соответствующих Pod.

Резюме

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


Если нужна быстрая шпаргалка команд, вот они:

  • kubectl create -f
  • kubectl get replicaset
  • kubectl describe replicaset
  • kubectl get pods
  • kubectl delete replicaset
  • kubectl delete pod
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро