Подключение к кластеру
К хостам кластера Managed Service for Elasticsearch с ролью Data node можно подключиться:
- Через интернет, если вы настроили публичный доступ для нужного хоста.
- С виртуальных машин Yandex.Cloud, расположенных в той же виртуальной сети.
Вне зависимости от способа подключения, Managed Service for Elasticsearch поддерживает только соединения с SSL-сертификатом к хостам кластера.
Настройка SSL-сертификата
Подготовить SSL-сертификат можно так:
mkdir ~/.elasticsearch && \
wget "https://storage.yandexcloud.net/cloud-certs/CA.pem" -O ~/.elasticsearch/root.crt && \
chmod 0600 ~/.elasticsearch/root.crt
Автоматический выбор хоста для подключения
При подключении к кластеру Elasticsearch вы можете:
-
Явно задать имена хостов с ролью Data node в строках подключения.
Этот способ подходит для любого способа подключения. Например, его можно использовать для подключения через интернет в случае, когда только нескольким хостам назначен публичный IP-адрес.
-
Использовать специальный FQDN вида
c-<идентификатор кластера Elasticsearch>.rw.mdb.yandexcloud.net
(например,https://c-e4ut2....rw.mdb.yandexcloud.net
).Этот способ подходит только в том случае, если все хосты с ролью Data node имеют публичный IP-адрес или же подключение осуществляется только с виртуальных машин Yandex.Cloud. Это связано с тем, что хост для подключения, на который указывает этот FQDN, выбирается случайным образом среди все хостов с ролью Data node.
Примеры строк подключения
Примеры проверялись в следующем окружении:
- Виртуальная машина в Облаке c Ubuntu 20.04 LTS.
- Bash:
5.0.16
. - Python:
3.8.2
; pip3:20.0.2
. - Go:
1.13.8
.
Перед подключением подготовьте сертификат. В этих примерах предполагается, что сертификат root.crt
расположен в директории /home/<домашняя директория>/.elasticsearch/
.
Для подключения нужно использовать имя пользователя и пароль, которые были заданы при создании кластера.
Пример команды с заполненным FQDN хоста вы можете посмотреть в консоли управления, нажав на кнопку Подключиться на странице кластера.
Если хосту с ролью Data node назначен публичный IP-адрес:
- Перед подключением установите SSL-сертификат в хранилище доверенных корневых сертификатов браузера (инструкция для Mozilla Firefox).
- В браузере перейдите по одному из адресов:
https://c-<идентификатор кластера Elasticsearch>.rw.mdb.yandexcloud.net
, если публичный IP-адрес назначен всем хостам с этой ролью. Идентификатор кластера можно получить со списком кластеров в каталоге.https://<имя любого хоста с ролью Data node и публичным IP>.mdb.cloud.yandex.net
- Введите имя пользователя и пароль.
Если ни одному хосту с ролью Data node не назначен публичный IP-адрес:
-
Создайте виртуальную машину на основе Linux в той же виртуальной сети, что и кластер.
-
Подключитесь к виртуальной машине по SSH.
-
Установите зависимости:
sudo apt update && sudo apt install -y nginx ssl-cert
-
Скопируйте загруженный SSL-сертификат в директорию
/etc/nginx/
:sudo cp ~/.elasticsearch/root.crt /etc/nginx/root.crt
-
Измените файл конфигурации по умолчанию для NGINX, например, так:
/etc/nginx/sites-available/default
upstream es-datanodes { server <FQDN хоста 1 с ролью Data Node>:443; ... server <FQDN хоста N с ролью Data Node>:443; } server { listen 443 ssl; ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem; ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key; server_name _; location / { proxy_pass https://es-datanodes; proxy_ssl_trusted_certificate /etc/nginx/root.crt; proxy_ssl_session_reuse on; } }
Также можно использовать директиву
proxy_pass
со специальным FQDN:proxy_pass https://c-<идентификатор кластера Elasticsearch>.rw.mdb.yandexcloud.net;
Важно
В этом примере конфигурационного файла используется самоподписанный сертификат
snakeoil
из пакетаssl-cert
. Использовать этот сертификат в реальном кластере небезопасно. Вместо самоподписанного сертификата укажите путь к вашим публичным и приватным ключам SSL-сертификата в директивахssl_certificate
иssl_certificate_key
. -
Перезапустите NGINX:
sudo systemctl restart nginx
-
Добавьте сертификат, указанный в директиве
ssl_certificate
, в хранилище доверенных корневых сертификатов браузера (инструкция для Mozilla Firefox). -
Перейдите в браузере по адресу
https://<публичный IP-адрес ВМ>
. -
Введите имя пользователя и пароль.
Пример команды для подключения с использованием SSL-соединения :
curl \
--user <имя пользователя>:<пароль> \
--cacert ~/.elasticsearch/root.crt \
-X GET 'https://c-<идентификатор кластера Elasticsearch>.rw.mdb.yandexcloud.net:9200/'
Перед подключением установите зависимости:
sudo apt update && sudo apt install -y python3 python3-pip && \
pip3 install elasticsearch
Пример кода для подключения с использованием SSL-соединения:
connect.py
from elasticsearch import Elasticsearch
ES_CA = '~/.elasticsearch/root.crt'
ES_USER = '<имя пользователя>'
ES_PASS = '<пароль>'
ES_HOSTS = [
"<FQDN хоста 1 Elasticsearch с ролью Data Node>",
...,
"<FQDN хоста N Elasticsearch с ролью Data Node>"
]
conn = Elasticsearch(
ES_HOSTS,
http_auth=(ES_USER, ES_PASS),
use_ssl=True,
verify_certs=True,
ca_certs=ES_CA)
print(conn.info())
conn.close()
Подключение:
python3 connect.py
Перед подключением установите зависимости:
sudo apt update && sudo apt install -y golang git && \
go get github.com/elastic/go-elasticsearch
Пример кода для подключения с использованием SSL-соединения:
connect.go
package main
import (
"crypto/tls"
"crypto/x509"
"github.com/elastic/go-elasticsearch"
"io/ioutil"
"log"
"net/http"
)
var ES_CA = "/home/<домашняя директория>/.elasticsearch/root.crt"
var ES_USER = "<имя пользователя>"
var ES_PASS = "<пароль>"
var ES_HOSTS = []string{
"https://<FQDN хоста 1 Elasticsearch с ролью Data Node>:9200",
...,
"https://<FQDN хоста N Elasticsearch с ролью Data Node>:9200"}
func main() {
caCert, err := ioutil.ReadFile(ES_CA)
if err != nil {
log.Fatal(err)
}
caCertPool := x509.NewCertPool()
caCertPool.AppendCertsFromPEM(caCert)
cfg := elasticsearch.Config{
Addresses: ES_HOSTS,
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
RootCAs: caCertPool,
},
},
Username: ES_USER,
Password: ES_PASS,
}
conn, err := elasticsearch.NewClient(cfg)
if err != nil {
log.Printf("Error creating the client: %s", err)
} else {
log.Println(conn.Info())
}
}
В отличие от других способов подключения, в этом коде необходимо указывать полный путь к сертификату CA.pem
для Elasticsearch в переменной ES_CA
.
Подключение:
go run connect.go
При успешном подключении будет выведена общая информация о кластере Elasticsearch.