Введение
В этом руководстве мы настроим кластер HashiCorp Nomad с Consul для обслуживания и обнаружения узлов.
При наличии 3 серверных узлов и произвольного количества клиентских узлов эта конфигурация может служить основой для растущих проектов.
Мы также создадим снимок облака Hetzner для клиентов, что позволит добавлять больше клиентов без ручной настройки.
Кластер работает в частной сети между серверами и поддерживает все функции Nomad и Consul «из коробки», такие как обнаружение служб и управление томами.
В этом руководстве частично соблюдаются рекомендуемые шаги из официального руководства по развертыванию Consul и Nomad.
Предпосылки
- Учетная запись Hetzner Cloud
- Базовые знания Linux и команд оболочки
- Возможность подключения к серверу по ssh
- Иметь сервер Hetzner
Это руководство было протестировано на серверах Ubuntu 24.04 Hetzner Cloud с Nomad версии 1.9.3 и Consul 1.20.1.
Термины и символы
Команды
local$ <command> این دستور باید روی ماشین محلی اجرا شود.
server$ <command> این دستور باید بهعنوان root روی سرور اجرا شود.
Шаг 1 — Создание базового изображения
На этом этапе будет использоваться следующий ресурс:
- 1 облачный сервер Hetzner типа CX22
Начнём с настройки сервера Consul/Nomad на новом сервере CX22. Созданный снимок послужит базовым образом для всех серверов и клиентов кластера на следующих этапах.
В этом руководстве показана настройка для трёх серверов. Это обеспечивает высокую доступность кластера, но не слишком затратно. Настройка одного сервера не рекомендуется, но возможна. В руководстве будут даны комментарии по изменениям, которые необходимо внести для одного или нескольких из трёх серверов в соответствующих шагах.
Перейдите в веб-интерфейс Hetzner Cloud и создайте новый сервер CX22 с Ubuntu 24.04.
Шаг 1.1 – Установка Consul
Установить Консул
Более подробную информацию о доступных версиях можно найти на официальном сайте.
server$ wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
server$ echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/hashicorp.list
server$ apt update && apt install consulТеперь мы можем добавить функцию автозаполнения в Consul (опционально)
server$ consul -autocomplete-installПодготовка сертификатов TLS для Консула
server$ consul tls ca create
server$ consul tls cert create -server -dc dc1
server$ consul tls cert create -server -dc dc1
server$ consul tls cert create -server -dc dc1
server$ consul tls cert create -client -dc dc1Если вы хотите запустить меньше или больше 3 серверов в кластере Consul, повторите команду консул tls cert create -server -dc dc1 Адаптируйтесь.
Для кластерного сервера требуется только один сертификат, для 5 серверов — 5 сертификатов.
Эти команды создадут 3 сертификата сервера и один сертификат клиента.
Папка /корень/ Теперь он должен содержать как минимум следующие файлы:
server$ ls
consul-agent-ca.pem
consul-agent-ca-key.pem
dc1-server-consul-0.pem
dc1-server-consul-0-key.pem
dc1-server-consul-1.pem
dc1-server-consul-1-key.pem
dc1-server-consul-2.pem
dc1-server-consul-2-key.pem
dc1-client-consul-0.pem
dc1-client-consul-0-key.pemШаг 1.2 — Установка исполняемого файла Nomad
Установить Nomad
Более подробную информацию о доступных версиях можно найти на официальном сайте.
server$ wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
server$ echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/hashicorp.list
server$ apt update && apt install nomadДобавить автозаполнение для Nomad (необязательно):
server$ nomad -autocomplete-installСледующий файл конфигурации: /etc/nomad.d/nomad.hcl Добавлять:
datacenter = "dc1"
data_dir = "/opt/nomad"Шаг 1.3 — Подготовка служб systemd
Consul и Nomad должны запускаться автоматически после перезагрузки. Для этого создайте для каждого из них службу systemd.
Сначала настройте все разрешения:
server$ chown consul:consul dc1-server-consul*
server$ chown consul:consul dc1-client-consul*
server$ chown -R consul:consul /opt/consul
server$ chown -R nomad:nomad /opt/nomad
server$ mkdir -p /opt/alloc_mounts && chown -R nomad:nomad /opt/alloc_mountsСледующий файл конфигурации: /etc/systemd/system/consul.service Добавлять:
[Unit]
Description="HashiCorp Consul - A service mesh solution"
Documentation=https://www.consul.io/
Requires=network-online.target
After=network-online.target
ConditionFileNotEmpty=/etc/consul.d/consul.hcl
[Service]
EnvironmentFile=-/etc/consul.d/consul.env
User=consul
Group=consul
ExecStart=/usr/bin/consul agent -config-dir=/etc/consul.d/
ExecReload=/bin/kill --signal HUP $MAINPID
KillMode=process
KillSignal=SIGTERM
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.targetи следующий файл конфигурации для /etc/systemd/system/nomad.service Добавлять:
[Unit]
Description=Nomad
Documentation=https://www.nomadproject.io/docs/
Wants=network-online.target
After=network-online.target
[Service]
User=nomad
Group=nomad
ExecReload=/bin/kill -HUP $MAINPID
ExecStart=/usr/bin/nomad agent -config /etc/nomad.d
KillMode=process
KillSignal=SIGINT
LimitNOFILE=65536
LimitNPROC=infinity
Restart=on-failure
RestartSec=2
OOMScoreAdjust=-1000
TasksMax=infinity
[Install]
WantedBy=multi-user.targetПока не включайте эти службы, так как настройка еще не завершена.
Шаг 1.5 — Создание базового снимка
Наконец, остановите сервер в консоли Hetzner Cloud и создайте снимок состояния. Этот снимок будет использован в качестве основы для настройки сервера и клиентов кластера.
После успешного создания снимка удалите экземпляр CX22 из этого шага.
Шаг 2 — Настройка кластерных серверов
На этом этапе вы создадите 3 кластерных сервера из базового образа, созданного на этапе 1.
Эти серверы составляют основу вашего кластера и динамически выбирают лидера кластера.
- 1. Облачная сеть Hetzner
- 3 облачных сервера Hetzner типа CX22
В консоли Hetzner Cloud Console создайте 3 сервера CX22 из снимка, созданного на шаге 1, и общую облачную сеть.
В этом руководстве используется сеть 10.0.0.0/8, но подойдут и сети меньшего размера.
В последующих шагах руководства будут упомянуты серверы с внутренними адресами 10.0.0.2, 10.0.0.3 и 10.0.0.4.
Если у ваших серверов разные внутренние адреса, замените их на следующих шагах.
Шаг 2.1 — Создание симметричного ключа шифрования
Сначала создайте симметричный ключ шифрования, который будет общим для всех серверов. Сохраните этот ключ в надёжном месте — он понадобится нам на следующих этапах.
server$ consul keygenШаг 2.2 – Настройка Consul
Создайте файл конфигурации Consul для каждого сервера. Этот файл будет содержать внутренние IP-адреса остальных серверов.
Для каждого сервера на пути /etc/consul.d/consul.hcl Создайте следующий файл:
datacenter = "dc1" data_dir = "/opt/consul" encrypt = "" ca_file = "/root/consul-agent-ca.pem" cert_file = "/root/dc1-server-consul-0.pem" key_file = "/root/dc1-server-consul-0-key.pem" verify_incoming = true verify_outgoing = true verify_server_hostname = true performance { raft_multiplier = 1 } retry_join = ["10.0.0.2", "10.0.0.3", "10.0.0.4"] bind_addr = "0.0.0.0" client_addr = "0.0.0.0" server = true bootstrap_expect = 3 ui = true
Заменять <CONSUL_KEY> с ключом, сгенерированным из команды консул кейген.
Для других серверов, файл_сертификата и ключевой_файл Измените его так, чтобы он соответствовал сертификату для этого сервера.
Шаг 2.3 – Настройка Nomad
Создайте файл конфигурации Nomad для каждого сервера. Этот файл находится по адресу /etc/nomad.d/nomad.hcl Это будет:
datacenter = "dc1"
data_dir = "/opt/consul"
encrypt = "your-symmetric-encryption-key"
tls {
defaults {
ca_file = "/etc/consul.d/consul-agent-ca.pem"
cert_file = "/etc/consul.d/dc1-server-consul-0.pem"
key_file = "/etc/consul.d/dc1-server-consul-0-key.pem"
verify_incoming = true
verify_outgoing = true
},
internal_rpc {
verify_server_hostname = true
}
}
retry_join = ["10.0.0.2"]
bind_addr = "{{ GetPrivateInterfaces | include \"network\" \"10.0.0.0/8\" | attr \"address\" }}"
acl = {
enabled = true
default_policy = "allow"
enable_token_persistence = true
}
performance {
raft_multiplier = 1
}Заменить адреса 10.0.0.x С внутренним адресом каждого сервера.
Шаг 2.4 – Активация и запуск служб
После создания файлов конфигурации включите и запустите Consul и Nomad как службы systemd:
server$ systemctl enable consul server$ systemctl start consul server$ systemctl enable nomad server$ systemctl start nomadПроверьте состояние каждой службы с помощью следующих команд:
server$ systemctl status consul
server$ systemctl status nomadШаг 2.5 – Проверка кластера консулов
Чтобы проверить состояние кластера Consul, выполните следующую команду:
server$ consul membersВы должны увидеть список всех серверов и клиентов в кластере. Если возникнут какие-либо проблемы, ещё раз проверьте файлы конфигурации и прочтите логи:
server$ journalctl -u consulШаг 2.6 – Проверка кластера Nomad
Проверьте состояние кластера Nomad с помощью следующей команды:
server$ nomad server membersВы должны увидеть список серверов Nomad в кластере. Если возникнут проблемы, проверьте файлы конфигурации и прочтите логи:
server$ journalctl -u nomadШаг 2.7 – Проверка веб-интерфейса
Веб-интерфейсы Consul и Nomad теперь должны быть доступны:
- Консул:
http:// :8500 - Кочевник:
http:// :4646
Заменять <SERVER_IP> с публичным или частным IP-адресом сервера.
Шаг 3 — Добавление клиентов
Теперь вы можете добавить клиентов Nomad. Этот шаг аналогичен настройке сервера, но с ролью клиента.
Шаг 3.1 – Установка и настройка клиентов
Процесс установки клиентов Nomad аналогичен процессу установки серверов. Сначала установите Consul и Nomad на клиентские машины.
Эти шаги включают загрузку пакетов и их установку.
Шаг 3.2 — Настройка Consul для клиентов
Файл конфигурации Consul в пути /etc/consul.d/consul.hcl Создать. Для клиентов настройка проще:
client {
enabled = true
network_interface = "{{ GetPrivateInterfaces | include \"network\" \"10.0.0.0/8\" | attr \"name\" }}"
}
acl {
enabled = true
}Обратите внимание, что IP-адреса в retry_join Это внутренние адреса серверов Consul.
Файлы сертификата и ключа (сертификат и ключ) должны соответствовать особенностям клиента.
Шаг 3.3 — Настройка Nomad для клиентов
Поместите файл конфигурации Nomad в путь /etc/nomad.d/nomad.hcl Создать. Для клиентов эта конфигурация включает следующие настройки:
datacenter = "dc1" data_dir = "/opt/nomad" bind_addr = "0.0.0.0" advertise { http = "10.0.1.2:4646" rpc = "10.0.1.2:4647" serf = "10.0.1.2:4648" } client { enabled = true network_interface = "eth0" servers = ["10.0.0.2:4647", "10.0.0.3:4647", "10.0.0.4:4647"] } tls { http = true rpc = true ca_file = "/root/consul-agent-ca.pem" cert_file = "/root/dc1-client-consul-0.pem" key_file = "/root/dc1-client-consul-0-key.pem" verify_server_hostname = true }Адрес рекламировать Он должен указывать на внутренний адрес этого клиента. Также, адреса серверы Они такие же, как серверы Nomad.
Шаг 3.4 – Активация и запуск служб
Как и в случае с серверами, включите и настройте службы Consul и Nomad для клиентов:
client$ systemctl enable consul
client$ systemctl start consul
client$ systemctl enable nomad
client$ systemctl start nomadПроверьте статус услуг:
client$ systemctl status consul
client$ systemctl status nomadШаг 3.5 – Проверка подключения клиента
Убедитесь, что клиенты подключены к кластеру Consul. На сервере выполните следующую команду:
server$ consul membersКлиенты должны быть видны в списке. Также для Nomad:
server$ nomad node statusКлиенты должны быть в состоянии “готов”. Если возникла проблема, проверьте файлы конфигурации и прочтите логи:
client$ journalctl -u consul
client$ journalctl -u nomadШаг 4 — Запуск задач в Nomad
Убедившись в правильности настройки, вы можете определять и запускать свои задания на Nomad.
Создайте файл конфигурации задачи, например:
job "example" { datacenters = ["dc1"] group "example-group" { task "example-task" { driver = "docker" config { image = "nginx:latest" } resources { cpu = 500 memory = 256 } } } }Назовите вышеуказанный файл пример.кочевник Сохраните и запустите с помощью следующей команды:
server$ nomad job run example.nomadПроверьте статус выполнения задачи:
server$ nomad job status exampleРезультат
Вы успешно настроили кластер Consul и Nomad. Теперь вы можете использовать эту инфраструктуру для управления своими задачами и сервисами.









