← Назад к вопросам

Какие знаешь контроллеры в Kubernetes?

2.0 Middle🔥 252 комментариев
#Kubernetes

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Контроллеры в Kubernetes: механизм достижения желаемого состояния

В Kubernetes контроллеры — это ключевые компоненты control plane, отвечающие за поддержание желаемого состояния (Desired State) кластера. Они работают в бесконечном цикле, наблюдая за текущим состоянием объектов и внося корректировки, чтобы оно совпадало с описанным в спецификациях. Контроллеры реализуют паттерн "Observe -> Diff -> Act". Я расскажу о встроенных (core) контроллерах, их типах и принципах работы.

Встроенные (Core) контроллеры

Эти контроллеры являются частью kube-controller-manager, запускающего их в виде отдельных процессов (goroutines). Вот основные типы:

  1. Deployment Controller
    Управляет жизненным циклом **ReplicaSets** и предоставляет декларативные обновления для Pod'ов, включая rolling updates и rollbacks. Является основным контроллером для stateless-приложений.

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21
```

2. ReplicaSet Controller (низкоуровневый)

    Отвечает за поддержание стабильного числа идентичных Pod'ов (реплик). Хотя напрямую его используют редко (чаще через Deployment), он фундаментален.

```yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: guestbook
      tier: frontend
  template:
    # ... pod template ...
```

3. StatefulSet Controller

    Управляет stateful-приложениями, гарантируя устойчивые идентификаторы Pod'ов (`web-0`, `web-1`), устойчивые хранилища (PersistentVolumes) и упорядоченный деплой/скейлинг. Критичен для баз данных (например, Cassandra, Kafka).

  1. DaemonSet Controller
    Гарантирует, что Pod будет работать на всех (или некоторых) Node в кластере. Используется для системных демонов: сборщиков логов (Fluentd), мониторинга (Node Exporter), сетевых плагинов (Calico).

```bash
# Пример DaemonSet для Node Exporter
kubectl get daemonset -n monitoring
```

5. Job Controller

    Создает один или несколько Pod'ов для выполнения задачи до успешного завершения. После завершения Pod'ы не перезапускаются.

  1. CronJob Controller
    Управляет периодическим выполнением Jobs по расписанию (cron-формат). Например, для ночных бэкапов или периодических отчетов.

  1. Service Controller & EndpointSlice Controller
    **Service Controller** следит за изменениями Service объектов и отвечает за обеспечение доступа к группе Pod'ов. **EndpointSlice Controller** (пришедший на смену Endpoints) динамически обновляет списки IP-адресов Pod'ов, соответствующих селекторам Service.

  1. Namespace Controller
    Управляет жизненным циклом пространств имен, включая очистку ресурсов при удалении Namespace.

  1. PersistentVolume Controller
    Связывает PersistentVolumeClaims с подходящими PersistentVolumes и управляет их жизненным циклом (провиженинг, удаление).

  1. Node Controller
    Отвечает за мониторинг состояния узлов (Node): отмечает их `Ready`/`NotReady`, обновляет статус, управляет graceful удалением Pod'ов с недоступных нод. Интегрируется с облачными провайдерами через Cloud Controller Manager.

Принцип работы и расширяемость

Все контроллеры взаимодействуют с API-сервером Kubernetes через Watch/Informer механизм, получая события об изменениях ресурсов, и используют work queues для обработки. Они не взаимодействуют напрямую с kubelet или Pod'ами, а только с API.

Kubernetes также позволяет создавать Custom Controllers и Operators, расширяя его логику под нужды конкретного приложения. Operator — это по сути Custom Controller + Custom Resource Definition (CRD). Например, etcd-operator автоматизирует управление кластером etcd: развертывание, бэкапы, восстановление.

// Упрощенный псевдокод логики контроллера (на Go)
for {
    desiredState := getDesiredState()
    currentState := getCurrentState()
    if desiredState != currentState {
        reconcile(currentState, desiredState) // Фаза "Reconcile"
    }
    time.Sleep(resyncPeriod)
}

Почему это важно для DevOps

Понимание контроллеров критически важно для эффективного администрирования кластера и разработки его расширений. Оно позволяет:

  • Предсказывать поведение системы: Зная, что ReplicaSet будет всегда стремиться к spec.replicas, можно точно планировать capacity.
  • Отлаживать проблемы: Если Pod'ы не создаются — проверяем условия ReplicaSet/Deployment; если нет связи между Service и Pod — смотрим EndpointSlices.
  • Разрабатывать собственные операторы для автоматизации сложных stateful-приложений, что является высшей формой "Kubernetes-нативного" подхода в DevOps.

Таким образом, контроллеры — это "мозг" Kubernetes, переводящий декларативные конфигурации в реальные рабочие нагрузки, обеспечивая отказоустойчивость и автоматизацию.