Что происходит после ввода команды `kubectl create deployment` в Kubernetes?

«Что происходит после ввода команды `kubectl create deployment` в Kubernetes?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Команда kubectl create deployment инициирует создание объекта Deployment через Kubernetes API. Вот что происходит внутри кластера:

  1. kubectl отправляет YAML-манифест в kube-apiserver. Манифест выглядит примерно так:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:latest
  2. API-сервер валидирует запрос, аутентифицирует и авторизует пользователя (через RBAC), затем сохраняет объект Deployment в etcd — распределенном key-value хранилище состояния кластера.

  3. Deployment Controller (часть kube-controller-manager), который постоянно наблюдает за состоянием etcd, замечает новый объект. Его цель — поддерживать желаемое состояние (spec.replicas: 3). Он создает объект ReplicaSet.

  4. ReplicaSet Controller также наблюдает за кластером. Он видит, что у нового ReplicaSet'а желаемое количество Pod'ов (replicas: 3) не совпадает с текущим (0). Он создает 3 объекта Pod (но пока без назначенной ноды).

  5. Scheduler (kube-scheduler) наблюдает за Pod'ами в состоянии Pending. Он выполняет фильтрацию и оценку всех нод в кластере:

    • Проверяет достаточно ли ресурсов (CPU, memory).
    • Учитывает node affinity/anti-affinity, taints и tolerations.
    • Выбирает лучшую ноду и привязывает Pod к ней (обновляет поле nodeName в спецификации Pod'а).
  6. Kubelet на выбранной ноде наблюдает за Pod'ами, назначенными его ноде. Он:

    • Скачивает образ контейнера (nginx:latest) из container registry через Container Runtime Interface (CRI) (например, containerd).
    • Создает контейнер через CRI.
    • Запускает контейнеры, настраивает volumes, сети (через CNI плагин, например Calico).
  7. Kube-proxy на каждой ноде обновляет правила iptables или IPVS, чтобы трафик к Service мог попадать на новые Pod'ы.

Итог: Через несколько секунд после команды у вас работают 3 Pod'а с nginx, распределенные по нодам кластера, доступные через Service.