Что входит в минимальный набор кластера Kubernetes?

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

Ответ

Минимальный рабочий кластер Kubernetes состоит из двух типов нод и набора системных компонентов. Я разворачивал такие кластеры с помощью kubeadm и через managed-сервисы (GKE/EKS).

1. Control Plane (Master Node): Управляющая плоскость. На продакшене ее компоненты часто разнесены по нескольким нодам для отказоустойчивости.

  • kube-apiserver: Фронтенд кластера. Все запросы (kubectl, dashboard, ноды) идут через него. Мы настраивали балансировку и TLS для него.
  • etcd: Высокодоступное key-value хранилище, где хранится ВЕСЬ состояние кластера (поды, конфиги, секреты). Критически важный компонент, требует надежного бэкапа.
  • kube-scheduler: Отвечает за выбор ноды, на которой будет запущен под. Принимает решение на основе ресурсов, политик, affinity/anti-affinity правил.
  • kube-controller-manager: Запускает контроллеры, которые следят за желаемым состоянием (например, если под упал, ReplicaController создаст новый).

2. Worker Nodes: Ноды, на которых работают пользовательские приложения.

  • kubelet: Агент на ноде. Он общается с API-сервером и управляет жизненным циклом подов (запуск/остановка через container runtime).
  • kube-proxy: Отвечает за сетевые правила. Реализует абстракцию Service (ClusterIP, NodePort), управляя iptables или ipvs правилами для маршрутизации трафика к подам.
  • Container Runtime: Софт, который запускает контейнеры (containerd, CRI-O). Docker сейчас deprecated в пользу containerd.

3. Сетевые компоненты (CNI - Container Network Interface):

  • Сетевой плагин: Обязательный компонент. Обеспечивает сетевое взаимодействие между подами на разных нодах. Я чаще всего использовал Calico (с политиками сетевой безопасности NetworkPolicy) или Cilium. Без него поды не смогут "видеть" друг друга.
  • CoreDNS: Системный сервис для разрешения имен внутри кластера (например, my-service.my-namespace.svc.cluster.local).

Минимальная команда для инициализации (kubeadm):

# Инициализация control-plane ноды
kubeadm init --pod-network-cidr=192.168.0.0/16

# Установка сетевого плагина (пример для Calico)
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

Без установленного CNI плагина системные поды coredns останутся в статусе Pending.