Appearance
Добавление нод
Нода входит в платформу в два шага: паролем она доказывает платформе, кто она такая, а платформа выдаёт ей сертификат, которым она доказывает то же самое остальным нодам.
Разделение намеренное. Управление нодой — это разговор с оператором, и там пароль уместен. Консенсус — это разговор ноды с нодой, и пароль оператора там не значит ничего.
Подготовка ноды
Платформа представляется машинным пользователем, заданным в конфигурации самой ноды:
yaml
security:
auth_method: internal
users:
- user: platform
pass: "sha256:<base64 от SHA-256-дайджеста>"
ips: []
permissions:
- action: api
- action: metrics
- action: readЗа этим находится всё, кроме health-проб. Те же учётные данные укажите в Control Plane при добавлении сервера — либо оставьте поля пустыми, чтобы использовались платформенные значения по умолчанию.
TIP
Неверный пароль показывается как неверный пароль, а не как недоступная нода. Если нода в офлайне, из интерфейса видно, что именно из двух произошло.
Сертификаты
Ноды аутентифицируют друг друга сертификатами, и отключить это нельзя: любой, кто дотянулся до порта консенсуса незащищённого кластера, может голосовать, дописывать журнал и устанавливать снапшоты.
Поэтому нода без сертификата вообще не открывает порт консенсуса и прямо об этом сообщает:
WARN No cluster certificate yet — the Raft port stays closed until one is
issued. Add this node in the Control Plane, or point cluster.tls at
certificate files you manage yourself.Это нормальное состояние свежей ноды, а не неисправность.
Как он выдаётся
Без перезапуска. Три свойства этой схемы несущие.
- Приватный ключ не покидает ноду. Наружу уходит только запрос на подпись, обратно приходит сертификат, публичный по своей природе. Ключ создаётся один раз и сохраняется, поэтому обновление сертификата не меняет идентичность ноды.
- Платформа дописывает адрес, которым пользуется. Нода знает адрес, который слушает, но не знает адрес, по которому её достают: за NAT или через опубликованный порт контейнера это разные адреса. Сертификата без этого имени не хватит ровно тому вызывающему, которому оно нужно.
- У каждого кластера свой удостоверяющий центр. Общий корень позволил бы ноде одного кластера говорить консенсус со вторым. Приватный ключ остаётся в базе платформы зашифрованным и никуда не отправляется.
Срок действия
Сертификат ноды выдаётся на 825 дней, удостоверяющий центр кластера — на десять лет. Дата истечения сохраняется при выдаче и видна в парке.
Продление не автоматическое
Сертификат выпускается один раз — при создании кластера или при вводе ноды в него. Само по себе ничего не перевыпускается. Нода с истёкшим сертификатом перестаёт проходить взаимную аутентификацию и выпадает из кворума, а в журнале появляются ошибки рукопожатия.
Чтобы перевыпустить сегодня, ноду нужно вывести из кластера и ввести заново: выдача привязана именно к этим двум операциям. Приватный ключ при выходе сохраняется, и вернувшаяся нода получает новый сертификат на прежний ключ. Пока нода выведена, она не в кластере — планируйте это как обслуживание, а не как мгновенную операцию.
Следите за датой истечения заранее. Двумя годами позже причина отказа выглядит как внезапная потеря кворума без единого изменения в конфигурации.
Собственный PKI
Укажите ноде файлы, которыми управляете сами, — платформа в это не вмешивается:
yaml
cluster:
tls:
ca_cert: /etc/forgevis/tls/ca.pem
cert: /etc/forgevis/tls/node-1.pem
key: /etc/forgevis/tls/node-1.keyВсе три вместе — частичная настройка отвергается при старте. Сертификату нужны и serverAuth, и clientAuth: нода одновременно сервер для того, кто звонит ей, и клиент для того, кому звонит она. Host из rpc_addr целевой ноды должен присутствовать в SAN её сертификата.
Сборка кластера
- Добавьте серверы в парк вместе с учётными данными. Пока они не входят в кластер, они числятся отдельными.
- Создайте кластер из одного из них. Он становится первым voter'ом, и платформа выпускает ему сертификат перед инициализацией.
- Добавьте остальные. Каждая получает сертификат, входит как learner, догоняет журнал и после этого может быть повышена до voter'а.
Voter'ы выбирают лидера и образуют кворум, learner'ы реплицируют без права голоса. Повышение, понижение и вывод ноды в drain перед обслуживанием — всё это операции над парком.
Запись идёт на лидера
Изменения принимает только лидер. Нода, получившая изменение и не являющаяся лидером, отвечает перенаправлением, а не ходит за ответом сама, — поэтому нодам не нужны учётные данные друг друга, а ваши остаются на вашем запросе.
Вывод ноды
Вывод последней ноды — это не изменение состава, а роспуск кластера. Raft не может убрать единственного voter'а, и обновлять больше нечего: вся операция сводится к команде этой ноде выйти.
Нода, выведенная из кластера, стирает своё локальное кластерное состояние и может быть сразу добавлена в другой кластер — без перезапуска и без выезда к серверу.