◆ ForgeVis
Skip to content

Добавление нод ​

Нода входит в платформу в два шага: паролем она доказывает платформе, кто она такая, а платформа выдаёт ей сертификат, которым она доказывает то же самое остальным нодам.

Разделение намеренное. Управление нодой — это разговор с оператором, и там пароль уместен. Консенсус — это разговор ноды с нодой, и пароль оператора там не значит ничего.

Подготовка ноды ​

Платформа представляется машинным пользователем, заданным в конфигурации самой ноды:

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 её сертификата.

Сборка кластера ​

  1. Добавьте серверы в парк вместе с учётными данными. Пока они не входят в кластер, они числятся отдельными.
  2. Создайте кластер из одного из них. Он становится первым voter'ом, и платформа выпускает ему сертификат перед инициализацией.
  3. Добавьте остальные. Каждая получает сертификат, входит как learner, догоняет журнал и после этого может быть повышена до voter'а.

Voter'ы выбирают лидера и образуют кворум, learner'ы реплицируют без права голоса. Повышение, понижение и вывод ноды в drain перед обслуживанием — всё это операции над парком.

Запись идёт на лидера

Изменения принимает только лидер. Нода, получившая изменение и не являющаяся лидером, отвечает перенаправлением, а не ходит за ответом сама, — поэтому нодам не нужны учётные данные друг друга, а ваши остаются на вашем запросе.

Вывод ноды ​

Вывод последней ноды — это не изменение состава, а роспуск кластера. Raft не может убрать единственного voter'а, и обновлять больше нечего: вся операция сводится к команде этой ноде выйти.

Нода, выведенная из кластера, стирает своё локальное кластерное состояние и может быть сразу добавлена в другой кластер — без перезапуска и без выезда к серверу.

Proprietary software.