Задание 2: Развертывание защищенного кластера etcd для Pangolin
По итогам выполнения данной лабораторной работы вы научитесь устанавливать сервис etcd из RPM-пакета на узлах кластера и настраивать его параметры, а также конфигурацию сервиса systemd. Вы сможете подключать SSL-сертификаты для защиты сетевого трафика, выполнять первоначальный запуск с проверкой работоспособности кластера, а также настраивать встроенную аутентификацию и ролевую модель доступа.
Развертывание etcd на узлах кластера
При использовании менеджеров пакетов дистрибутивов Linux версии предоставляемых пакетов могут быть значительно устаревшими, поэтому для эксплуатации рекомендуется установка из прекомпилированных бинарных файлов. В рамках этой лабораторной работы используется проверенная версия 3.5.12 в формате RPM.
-
Распространите установочный RPM-пакет с узла
srv1на остальные узлы будущего кластера:[student@srv1 ~]$ ls -l etcd-3.5.12-3.red80.x86_64.rpm[student@srv1 ~]$ scp etcd-3.5.12-3.red80.x86_64.rpm srv2:~/[student@srv1 ~]$ scp etcd-3.5.12-3.red80.x86_64.rpm srv3:~/Ожидаемый результат: успешное копирование файла.
-
Установите пакет etcd на узле
srv1:[student@srv1 ~]$ sudo dnf install -y etcd-3.5.21.x86_64.rpmОжидаемый результат: успешная установка одного пакета без зависимостей.
Конфигурация etcd для кластера из трех узлов
Этап 1: Начальная настройка первого узла (srv1):
-
Ознакомьтесь со стандартным конфигурационным файлом
/etc/etcd/etcd.conf. Большинство параметров в нем закомментировано. -
Задайте базовую конфигурацию для запуска отдельного узла. Эта конфигурация позже будет изменена:
[student@srv1 ~]$ vi /etc/etcd/etcd.confETCD_NAME="srv1"ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"ETCD_ADVERTISE_CLIENT_URLS="http://srv1:2379"ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"ETCD_INITIAL_ADVERTISE_PEER_URLS="http://srv1:2380"ETCD_INITIAL_CLUSTER_TOKEN="single"ETCD_INITIAL_CLUSTER="srv1=http://srv1:2380"ETCD_INITIAL_CLUSTER_STATE="new"ETCD_DATA_DIR="/var/lib/etcd"ETCD_ELECTION_TIMEOUT="5000"ETCD_HEARTBEAT_INTERVAL="1000"ETCD_ENABLE_V2="true"Пояснение ключевых параметров:
ETCD_NAME: Уникальное имя члена кластера (обычно совпадает с именем хоста);ETCD_LISTEN_PEER_URLS: URL для связи между узлами etcd;ETCD_LISTEN_CLIENT_URLS: URL для клиентских подключений (черезetcdctlили Patroni);ETCD_INITIAL_CLUSTER: Список всех участников кластера в форматеимя=peer_URL;ETCD_INITIAL_CLUSTER_STATE:newдля создания нового кластера,existingдля присоединения к существующему.
-
Настройте сервис
systemdдля запуска от имени пользователяpostgresс повышенным приоритетом ввода-вывода:[student@srv1 ~]$ sudo sed -i.bak \-e 's/^.*User=.*$/User=postgres/' \-e 's/^.*ExecStart.*$/ExecStart=\/bin\/bash -c "GOMAXPROCS=$(nproc) ionice -c2 -n0 \/usr\/bin\/etcd"/' \/usr/lib/systemd/system/etcd.service -
Измените владельца рабочего каталога
etcd:[student@srv2 ~]$ sudo chown -R postgres:postgres /var/lib/etcd/ -
Перезагрузите конфигурацию systemd, активируйте и запустите сервис:
[student@srv1 ~]$ sudo systemctl daemon-reload[student@srv1 ~]$ sudo systemctl enable --now etcd[student@srv1 ~]$ sudo systemctl status etcdОжидаемый результат: сервис активен (
active (running)). -
Проверьте состояние единственного узла кластера:
[student@srv1 ~]$ etcdctl --endpoints=http://$(hostname -i):2379 -w table member listОжидаемый результат: Таблица с одной строкой, содержащей информацию об узле
srv1.
Этап 2: Добавление второго узла (srv2):
-
Установите etcd и настройте сервис
systemdна узлеsrv2(команды аналогичны шагам дляsrv1). Убедитесь, что каталог данных принадлежит пользователюpostgres. -
Вернитесь на узел
srv1и добавьтеsrv2в кластер:[student@srv1 ~]$ etcdctl --endpoints=http://$(hostname -i):2379 member add srv2 --peer-urls="http://srv2:2380"Внимание!Команда выведет переменные среды, которые необходимо использовать для конфигурации
srv2. -
На узле
srv2замените содержимое/etc/etcd/etcd.confна значения, полученные на предыдущем шаге. Ключевые параметры:ETCD_NAME="srv2"ETCD_INITIAL_CLUSTER="srv1=http://srv1:2380,srv2=http://srv2:2380"ETCD_INITIAL_CLUSTER_STATE="existing" # Узел присоединяется к существующему кластеруETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"ETCD_ADVERTISE_CLIENT_URLS="http://srv2:2379"ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380" -
Перезапустите etcd на
srv2и проверьте состояние кластера с любого узла:[student@srv1 ~]$ etcdctl --endpoints=http://<IP-Address1>:2379,http://<IP-Address2>:2379 -w table member list[student@srv1 ~]$ etcdctl --endpoints=http://<IP-Address1>:2379,http://<IP-Address2>:2379 -w table endpoint healthОжидаемый результат: В списке членов кластера два узла, оба имеют статус
healthy.
Этап 3: Добавление третьего узла (srv3):
Процедура аналогична добавлению srv2:
- Установите etcd и настройте сервис.
- С узла
srv1илиsrv2выполнитеetcdctl member add. - Настройте конфигурационный файл
srv3с полученными параметрами, указавETCD_INITIAL_CLUSTER_STATE="existing". - Запустите сервис и проверьте состояние трех-узлового кластера.
Для отказоустойчивости рекомендуется использовать кластеры с 3, 5 или 7 узлами. Кластер из трех узлов может выдержать отказ одного узла, сохраняя кворум.
Подключение SSL-сертификатов к etcd
Для защиты трафика в производственном кластере необходимо использовать TLS-шифрование. Мы настроим etcd на использование сертификатов, созданных в предыдущей лабораторной работе.
-
Остановите сервис etcd на всех узлах:
[student@srv1 ~]$ for comp in srv{1..3}; dossh $comp sudo systemctl stop etcddone -
На узле srv1 создайте новую конфигурацию
/etc/etcd/etcd.conf, включающую настройки TLS. Обратите внимание на смену протокола сhttpнаhttps:[student@srv1 ~]$ vi /etc/etcd/etcd.confETCD_NAME="srv1"ETCD_LISTEN_CLIENT_URLS="https://0.0.0.0:2379"ETCD_ADVERTISE_CLIENT_URLS="https://srv1:2379"ETCD_LISTEN_PEER_URLS="https://0.0.0.0:2380"ETCD_INITIAL_ADVERTISE_PEER_URLS="https://srv1:2380"ETCD_INITIAL_CLUSTER_TOKEN="single"ETCD_INITIAL_CLUSTER="srv1=https://srv1:2380,srv2=https://srv2:2380,srv3=https://srv3:2380"ETCD_INITIAL_CLUSTER_STATE="new"ETCD_DATA_DIR="/var/lib/etcd"ETCD_ELECTION_TIMEOUT="5000"ETCD_HEARTBEAT_INTERVAL="1000"ETCD_ENABLE_V2="true"ETCD_LOG_OUTPUTS="/pgerrorlogs/06/etcd/etcd.log"# SSL/TLSETCD_CIPHER_SUITES="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"ETCD_TRUSTED_CA_FILE="/pg_ssl/root.crt"ETCD_CERT_FILE="/pg_ssl/server.crt"ETCD_KEY_FILE="/pg_ssl/server.key"ETCD_PEER_TRUSTED_CA_FILE="/pg_ssl/root.crt"ETCD_PEER_CERT_FILE="/pg_ssl/server.crt"ETCD_PEER_KEY_FILE="/pg_ssl/server.key"ETCD_PEER_CLIENT_CERT_AUTH="true"EOF -
Скопируйте эту конфигурацию на узлы
srv2иsrv3, заменив значенияETCD_NAMEи соответствующихURLs:[student@srv1 ~]$ sed -e '/^ETCD_NAME/s/srv1/srv2/' \-e '/^ETCD_ADVERTISE_CLIENT_URLS/s/srv1/srv2/' \-e '/^ETCD_INITIAL_ADVERTISE_PEER_URLS/s/srv1/srv2/' \/etc/etcd/etcd.conf | ssh srv2 sudo tee /etc/etcd/etcd.confАналогично для
srv3. -
Подготовьте каталоги для данных и логов на всех узлах, назначив правильные права:
[student@srv1 ~]$ for comp in srv{1..3}; dossh $comp sudo rm -rf /var/lib/etcdssh $comp sudo mkdir -p /var/lib/etcd /pgerrorlogs/06/etcdssh $comp sudo chown -R postgres:postgres /var/lib/etcd /pgerrorlogs/06/etcdssh $comp sudo chmod 700 /var/lib/etcdssh $comp sudo chmod 770 /pgerrorlogs/06/etcddone -
Запустите etcd на всех трех узлах максимально одновременно. Используйте отдельные SSH-сессии или выполните команды в фоновом режиме с минимальной задержкой. На
srv1,srv2,srv3выполните:[student@srv1 ~]$ sudo systemctl enable --now etcdОжидаемый результат: Сервис успешно запускается на всех узлах.
Проверка работоспособности защищенного кластера etcd
Все проверки необходимо выполнять от имени пользователя postgres, так как он является владельцем сертификатов.
-
Проверьте состояние всех конечных точек (
endpoints) кластера:[student@srv1 ~]$ sudo su - postgres[postgres@srv1 ~]$ ETCDCTL_API=3 etcdctl \--endpoints=https://srv1:2379,https://srv2:2379,https://srv3:2379 \--cert=/pg_ssl/server.crt \--key=/pg_ssl/server.key \--cacert=/pg_ssl/root.crt \endpoint health -w table --clusterОжидаемый результат: Для всех трех
ENDPOINTв колонкеHEALTHдолжно быть значениеtrue. -
Получите подробный статус и список членов кластера:
[postgres@srv1 ~]$ ETCDCTL_API=3 etcdctl ... endpoint status -w table --cluster[postgres@srv1 ~]$ ETCDCTL_API=3 etcdctl ... member list -w tableОжидаемый результат: В статусе один узел имеет
IS LEADER: true, остальныеfalse. В списке членов отображаются все три узла с ихPEERиCLIENTадресами.
Настройка аутентификации и ролей в etcd
Для безопасной работы Patroni с etcd требуется настроить пользователей и роли.
-
Создайте пользователя
root(администратор) иpatronietcd(для службы Patroni):[postgres@srv1 ~]$ ETCDCTL_API=3 etcdctl \--endpoints=https://srv1:2379,https://srv2:2379,https://srv3:2379 \--cert=/pg_ssl/server.crt \--key=/pg_ssl/server.key \--cacert=/pg_ssl/root.crt \user add rootВведите и подтвердите пароль, например,
root123.[postgres@srv1 ~]$ ETCDCTL_API=3 etcdctl --endpoints=https://srv1:2379,https://srv2:2379,https://srv3:2379 \--cert=/pg_ssl/server.crt \--key=/pg_ssl/server.key \--cacert=/pg_ssl/root.crt \user add patronietcdВведите и подтвердите пароль, например,
patronietcd123. -
Создайте роль
patroniи предоставьте ей права на чтение и запись в ключевом пространстве/service/*, которое будет использовать Patroni:[postgres@srv1 ~]$ ETCDCTL_API=3 etcdctl --endpoints=https://srv1:2379,https://srv2:2379,https://srv3:2379 \--cert=/pg_ssl/server.crt \--key=/pg_ssl/server.key \--cacert=/pg_ssl/root.crt \role add patroni[postgres@srv1 ~]$ ETCDCTL_API=3 etcdctl --endpoints=https://srv1:2379,https://srv2:2379,https://srv3:2379 \--cert=/pg_ssl/server.crt \--key=/pg_ssl/server.key \--cacert=/pg_ssl/root.crt \role grant-permission patroni readwrite '/service/*' -
Свяжите роль
patroniс пользователемpatronietcd:[postgres@srv1 ~]$ ETCDCTL_API=3 etcdctl --endpoints=https://srv1:2379,https://srv2:2379,https://srv3:2379 \--cert=/pg_ssl/server.crt \--key=/pg_ssl/server.key \--cacert=/pg_ssl/root.crt \user grant-role patronietcd patroni -
Включите аутентификацию в кластере etcd:
[postgres@srv1 ~]$ ETCDCTL_API=3 etcdctl --endpoints=https://srv1:2379,https://srv2:2379,https://srv3:2379 \--cert=/pg_ssl/server.crt \--key=/pg_ssl/server.key \--cacert=/pg_ssl/root.crt \auth enableВнимание!После включения аутентификации все последующие запросы к etcd должны будут предоставлять корректные учетные данные (сертификат или логин/пароль). Для упрощения дальнейшей настройки Patroni в рамках этого курса аутентификацию можно временно отключить командой
auth disable, но в реальной эксплуатации она обязательна.
Подведем итоги
Вопрос 1
Вопрос 1: Взгляните на приведенные команды:
[student@srv1 ~]$ etcdctl --endpoints=http://$(hostname -i):2379 -w table member list
+------------------+---------+------+------------------+------------------+------------+
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |
+------------------+---------+------+------------------+------------------+------------+
| 98d57be5fdf696bb | started | srv1 | http://srv1:2380 | http://srv1:2379 | false |
+------------------+---------+------+------------------+------------------+------------+
Выберите верные утверждения о данной ситуации:
Вопрос 2
Какое значение параметра ETCD_INITIAL_CLUSTER_STATE необходимо указать при присоединении нового узла к уже существующему кластеру etcd?
Вопрос 3
После изменения файла /usr/lib/systemd/system/etcd.service (замена User и ExecStart) какая команда должна быть выполнена сразу?