Ответ
ReplicaSet (и контроллеры более высокого уровня, такие как Deployment) находят Pod'ы для управления с помощью селектора меток (label selector), определенного в его спецификации. Контроллер постоянно опрашивает API сервера Kubernetes, ища Pod'ы в том же namespace, чьи метки соответствуют его селектору.
Механизм работы:
- В спецификации ReplicaSet задается поле
spec.selectorс правиламиmatchLabelsилиmatchExpressions. - В шаблоне Pod'а (
spec.template) задаются идентичные метки. - Контроллер подсчитывает количество Pod'ов, соответствующих селектору.
- Если Pod'ов меньше, чем
spec.replicas, контроллер создает новые Pod'ы из шаблона. - Если Pod'ов больше (например, созданных вручную с такими же метками), контроллер удаляет лишние.
Пример манифеста ReplicaSet:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend-rs
namespace: production
spec:
replicas: 3
selector: # Селектор для поиска Pod'ов
matchLabels:
app: frontend
tier: web
template: # Шаблон для создания новых Pod'ов
metadata:
labels: # Эти метки ДОЛЖНЫ совпадать с селектором выше
app: frontend
tier: web
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
Ключевой момент: Связь между контроллером и Pod'ами чисто декларативная и основана на метках. Контроллер не «владеет» Pod'ами в традиционном смысле, а лишь поддерживает заданное количество экземпляров, соответствующих его селектору.