Как ReplicaSet (или Deployment) находит Pod’ы, которыми он должен управлять?

«Как ReplicaSet (или Deployment) находит Pod’ы, которыми он должен управлять?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

ReplicaSet (и контроллеры более высокого уровня, такие как Deployment) находят Pod'ы для управления с помощью селектора меток (label selector), определенного в его спецификации. Контроллер постоянно опрашивает API сервера Kubernetes, ища Pod'ы в том же namespace, чьи метки соответствуют его селектору.

Механизм работы:

  1. В спецификации ReplicaSet задается поле spec.selector с правилами matchLabels или matchExpressions.
  2. В шаблоне Pod'а (spec.template) задаются идентичные метки.
  3. Контроллер подсчитывает количество Pod'ов, соответствующих селектору.
  4. Если Pod'ов меньше, чем spec.replicas, контроллер создает новые Pod'ы из шаблона.
  5. Если 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'ами в традиционном смысле, а лишь поддерживает заданное количество экземпляров, соответствующих его селектору.