Какие основные компоненты есть в Kubernetes?

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

Ответ

Архитектура Kubernetes делится на две основные части: Control Plane (мастер-ноды) и Worker Nodes (рабочие ноды).

Control Plane (Управляющая плоскость):

  • kube-apiserver — фронтенд кластера. Все запросы на управление (от kubectl, dashboard, других компонентов) проходят через него.
  • etcd — распределённое key-value хранилище, где хранится вся конфигурация и состояние кластера. Это единственный stateful компонент Control Plane.
  • kube-scheduler — отслеживает созданные Pod'ы, у которых не назначена нода, и выбирает для них подходящую ноду на основе политик (ресурсы, affinity/anti-affinity правила).
  • kube-controller-manager — запускает контроллеры, которые следят за состоянием кластера. Например, Node Controller реагирует на падение нод, а Replication Controller поддерживает нужное количество реплик Pod'ов.

Worker Nodes (Рабочие ноды):

  • kubelet — агент, который работает на каждой ноде. Он получает спецификации Pod'ов от API-сервера и обеспечивает, чтобы описанные в них контейнеры были запущены и здоровы.
  • kube-proxy — поддерживает сетевые правила на ноде, обеспечивая сетевое взаимодействие между Pod'ами и доступ к ним извне (через Service).
  • Container Runtime (например, containerd или CRI-O) — ПО, которое непосредственно запускает контейнеры.

Ключевые абстракции для работы с приложениями:

  • Pod — наименьшая и простейшая единица в Kubernetes, «обёртка» для одного или нескольких контейнеров.
  • Service — абстракция, которая определяет логический набор Pod'ов и политику доступа к ним (часто через стабильный DNS-имя и IP).
  • Ingress — управляет внешним HTTP/HTTPS доступом к Service'ам внутри кластера, обеспечивая маршрутизацию, SSL-терминацию.

Пример простого Pod:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx-container
    image: nginx:1.21
    ports:
    - containerPort: 80