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

Ответ

Для обеспечения отказоустойчивости и высокой доступности 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).

Ответ 18+ 🔞

Давай разберём эту тему, чтобы у тебя в голове всё встало на свои места, а не болталось как хуй с горы. Речь про то, как сделать так, чтобы твой кубернетис не накрылся медным тазом от первой же поломки.

Вот смотри. Главная мысль, которую нужно вбить себе в башку: ставь нечётное количество мастеров. Обычно это три штуки для нормальных проектов или пять, если у тебя там овердохуища трафика и ты готов за это платить. А теперь, ёпта, почему именно так?

Всё дело в этой сущности под названием etcd. Это такая база, куда кластер пишет всё своё состояние — что, где и как крутится. А работает она на алгоритме Raft, которому для любой записи нужно, чтобы большинство нод сказали «да, окей». Это и есть кворум.

Теперь представь на пальцах:

  • Один мастер — это пиздец и точка. Упал — и всё, кластеру конец. Доверия к такой схеме — ноль ебать.
  • Два мастера — вот тут начинается цирк. Допустим, они потеряли связь друг с другом. Каждый из них будет думать: «А второй-то, наверное, сдох. Значит, я тут теперь главный!». Но чтобы что-то решить, им нужен кворум — то есть оба должны быть «за». А так как они не общаются, ни один не может ничего записать. Кластер встаёт колом. Хуйня полная.
  • Три мастера — вот это уже дело. Кворум тут — два нода (3/2 + 1 = 2). Это значит, что один узел может спокойно откинуться — от перегрева, от безысходности, потому что криво настроил — а остальные двое продолжат рулить и принимать решения. Отказоустойчивость появилась, можно выдохнуть.
  • Пять мастеров — это для параноиков или для тех, у кого реально всё очень серьёзно. Тут кворум — три. Можно потерять сразу два узла, и кластер всё ещё будет жив. Но и мороки с ними в пять раз больше, это ж не хухры-мухры.

Ну а на практике это выглядит так: сначала ты поднимаешь первого мастера, а потом к нему, как мартышлюшки на лиану, цепляешь остальных. И обязательно ставишь перед ними балансировщик (типа HAProxy или облачного NLB), чтобы трафик к API не тыкался в одну ноду, а распределялся нормально.

Вот пример, как это обычно делают через kubeadm:

# Поднимаем первого босса, главного мастера
kubeadm init --control-plane-endpoint "LOAD_BALANCER_DNS:6443" --upload-certs

# А теперь подтягиваем остальных пацанов в кворум
kubeadm join LOAD_BALANCER_DNS:6443 --token <token> 
    --discovery-token-ca-cert-hash <hash> 
    --control-plane 
    --certificate-key <key-from-init>

Вот и вся магия. Главное — запомни: чётное количество мастеров это путь в никуда, почти как пытаться собрать мебель из IKEA без инструкции — вроде детали есть, а хуй соберёшь. Ставь три и спи спокойно.