Добавление новых нод в кластер с настроенным security

Добрый день!

Есть кластер из 8 нод (5 дата-нод, 3 мастер-ноды). Появилась необходимость добавить еще 5 дата-нод.

Security настраивал по инструкции, сертификаты генерил так:

elasticsearch-certutil cert ca --pem --in instances.yml --out certs.zip --days 9999

instances.yml выглядит примерно так:

instances:
  - name: 'es-master1'
    dns: [ 'es-master1.ru' ]
  - name: 'es-master2'
    dns: [ 'es-master2.ru' ]
  - name: 'es-master3'
    dns: [ 'es-master3a.ru' ]

Как добавить ноды в кластер, подскажите пожалуйста? Нужен ли рестарт всего кластера после добавления новых нод? Всем нодам (и дата, и мастерам) нужно прописывать новые ноды в конфигах, или достаточно только одинакового имени кластера у всех?

Какая версия?

Версия 7.7.1

Как добавить ноды в кластер, подскажите пожалуйста?

Посмотрите документацию

Нужен ли рестарт всего кластера после добавления новых нод?

Если вы используете старый CA, то не надо. В противном случае, посмотрите эту дискуссию.

ca.crt есть - получается нужно добавить только на каждую ноду в конфиг elasticsearch.yml в discovery.seed_hosts новые ноды и все - ноды появятся в кластере без рестарта?

Да. Более того discovery.seed_hosts нужен будет только, если надо узлы перестартовать. Пока узлы подсоединены к кластеру, они о новых узлах от мастер-узла узнают.

Все же так и не получается выпустить сертификаты для новых нод.

Как я делаю:

  1. Установить Elasticsearch на ноды
  2. Сгенерим сертификаты:

сделаем новый new_instances.yml с добавляемыми хостами:

instances:
  - name: 'ws-search-elk4a.blabla.ru'
    dns: [ 'ws-search-elk4a.blabla.ru' ]
  - name: 'ws-search-elk5a.blabla.ru'
    dns: [ 'ws-search-elk5a.blabla.ru' ]

и затем:

sudo /usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca /etc/elasticsearch/certs/ca/ca.crt --in /home/s.frolov/new_instances.yml --out /home/s.frolov/new_cert.zip

у меня просит пароль и выдает ошибку:

Enter password for CA (/etc/elasticsearch/certs/ca/ca.crt) :
Exception in thread "main" java.io.IOException: toDerInputStream rejects tag type 45
	at java.base/sun.security.util.DerValue.toDerInputStream(DerValue.java:860)
	at java.base/sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:1982)
	at java.base/sun.security.util.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:220)
	at java.base/java.security.KeyStore.load(KeyStore.java:1472)
	at org.elasticsearch.xpack.core.ssl.CertParsingUtils.readKeyStore(CertParsingUtils.java:75)
	at org.elasticsearch.xpack.core.ssl.CertParsingUtils.readKeyPairsFromKeystore(CertParsingUtils.java:141)
	at org.elasticsearch.xpack.core.ssl.CertParsingUtils.readPkcs12KeyPairs(CertParsingUtils.java:134)
	at org.elasticsearch.xpack.security.cli.CertificateTool$CertificateCommand.lambda$loadPkcs12CA$1(CertificateTool.java:342)
	at org.elasticsearch.xpack.security.cli.CertificateTool.withPassword(CertificateTool.java:933)
	at org.elasticsearch.xpack.security.cli.CertificateTool.access$100(CertificateTool.java:85)
	at org.elasticsearch.xpack.security.cli.CertificateTool$CertificateCommand.loadPkcs12CA(CertificateTool.java:341)
	at org.elasticsearch.xpack.security.cli.CertificateTool$CertificateCommand.getCAInfo(CertificateTool.java:329)
	at org.elasticsearch.xpack.security.cli.CertificateTool$GenerateCertificateCommand.execute(CertificateTool.java:685)
	at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86)
	at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:127)
	at org.elasticsearch.cli.MultiCommand.execute(MultiCommand.java:91)
	at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:127)
	at org.elasticsearch.cli.Command.main(Command.java:90)
	at org.elasticsearch.xpack.security.cli.CertificateTool.main(CertificateTool.java:137)

пароля у меня точно нет.

Подскажите, как это сделать? Мне не нужно генерить новый ca.crt, а воспользоваться старым. Его я генерировал без пароля, пример находится в первом посте.

Игорь, делаю как тут описано:

/usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca /etc/elasticsearch/certs/ca/ca.crt --dns "ws-search-elk4a.blabla.ru"

но у меня опять же просит пароль:

Enter password for CA (/etc/elasticsearch/certs/ca/ca.crt) :

Серты я генерил без пароля. Мне нужно добавить ноду в уже имеющийся кластер, со старым CA

вот похожая проблема на форуме, без ответа:

--pem генерирует ключи в формате PEM. --ca ожидает ключ в формате PKCS#12. Для использования в формате PEM, надо задать --ca-crt вместо --ca, но он потребует от вас тк же задать--ca-key, которого у вас может не быть, если вы не генерировали сертификат с параметром --keep-ca-key.

Игорь, спасибо за ответ!

Да, видимо моя проблема в том, что у меня нет ca.key.

Я генерил ключи так:

elasticsearch-certutil cert ca --pem --in instances.yml --out certs.zip --days 9999

и в архиве был только ca.crt.

Получается что теперь я на старый CA не смогу добавить новые ноды? Но как бы мне сделать добавление нод максимально "бесшовным" в моей ситуации? Выпустить новые серты для всех 5 нод, а потом добавить два ca.crt в elasticsearch.yml в

xpack.security.http.ssl.certificate_authorities и в xpack.security.transport.ssl.certificate_authorities - а потом перезапускать ноды по одной, и удалять старый ca.crt?

Мне бы сделать это без полного перезапуска кластера, по одной ноде.

Для этого нужен private key, которого у вас нет.

Зачем для всех 5? Можно только для новых и постараться при этом сохранить private key, чтобы больше такая ситуация не повторилась.

Зачем надо удалять старый сертификат? Можно просто дать всем и старый и новый. И в последующем использовать только новый для новых узлов, пока старые узлы не отомрут.