Сколько мастер-узлов (control plane nodes) должно быть в Kubernetes-кластере и почему?

«Сколько мастер-узлов (control plane nodes) должно быть в Kubernetes-кластере и почему?» — вопрос из категории Kubernetes, который задают на 24% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для обеспечения отказоустойчивости и высокой доступности control plane в Kubernetes рекомендуется развертывать нечетное количество мастер-узлов, обычно 3 для средних кластеров или 5 для крупных, высоконагруженных сред.

Причины и механизм:

  1. Консенсус в etcd: Состояние кластера хранится в распределенном key-value хранилище etcd, которое для согласованности данных использует алгоритм консенсуса Raft. Raft требует, чтобы для любых операций записи был достигнут кворум – большинство членов кластера (N/2 + 1).

  2. Анализ вариантов:

    • 1 мастер: Single point of failure. При падении узла control plane полностью недоступен.
    • 2 мастера: Проблема split-brain. При потере связи между узлами ни один из них не сможет достичь кворума (нужно 2 из 2), что приведет к невозможности записи. Кластер заморозится.
    • 3 мастера: Это минимальное рекомендуемое количество. Кворум составляет 2 (3/2 + 1 = 2). Кластер может пережить отказ одного мастера, сохраняя возможность записи и чтения.
    • 5 мастеров: Кворум составляет 3. Кластер может пережить отказ двух узлов одновременно, что повышает отказоустойчивость, но увеличивает сложность и стоимость.

Практический пример развертывания: При инициализации кластера с помощью kubeadm сначала настраивается первый control-plane узел, а затем к нему присоединяются остальные, образуя отказоустойчивый кластер.

# Инициализация первого control-plane узла с указанием endpoint для балансировщика нагрузки
kubeadm init --control-plane-endpoint "LOAD_BALANCER_DNS:6443" --upload-certs

# Присоединение второго и третьего control-plane узлов
kubeadm join LOAD_BALANCER_DNS:6443 --token <token> 
    --discovery-token-ca-cert-hash <hash> 
    --control-plane 
    --certificate-key <key-from-init>

Трафик к API-серверу мастер-узлов обычно балансируется через внешний Load Balancer (например, облачный NLB или HAProxy).