Настройка кластСра Nomad с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Consul ΠΈ интСграция с Gitlab

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π’ послСднСС врСмя ΡΡ‚Ρ€Π΅ΠΌΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ растСт ΠΏΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ Kubernetes β€” всС большС ΠΈ большС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π²Π½Π΅Π΄Ρ€ΡΡŽΡ‚ Π΅Π³ΠΎ Ρƒ сСбя. Π― ΠΆΠ΅ Ρ…ΠΎΡ‚Π΅Π» ΠΊΠΎΡΠ½ΡƒΡ‚ΡŒΡΡ Ρ‚Π°ΠΊΠΎΠ³ΠΎ оркСстратора, ΠΊΠ°ΠΊ Nomad: ΠΎΠ½ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌ, Π³Π΄Π΅ ΡƒΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎΡ‚ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ HashiCorp, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Vault ΠΈ Consul, Π° сами ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ слоТными Π² ΠΏΠ»Π°Π½Π΅ инфраструктуры. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π΅ Π±ΡƒΠ΄Π΅Ρ‚ инструкция ΠΏΠΎ установкС Nomad, объСдинСния Π΄Π²ΡƒΡ… Π½ΠΎΠ΄ Π² кластСр, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ Nomad с Gitlab.

Настройка кластСра Nomad с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Consul ΠΈ интСграция с Gitlab

ВСстовый стСнд

НСмного ΠΎ тСстовом стСндС: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… сСрвСра с характСристиками 2 CPU, 4 RAM, 50 Gb SSD, ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Π½Ρ‹Ρ… Π² ΠΎΠ±Ρ‰ΡƒΡŽ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΡΠ΅Ρ‚ΡŒ. Π˜Ρ… названия ΠΈ IP адрСса:

  1. nomad-livelinux-01: 172.30.0.5
  2. nomad-livelinux-02: 172.30.0.10
  3. consul-livelinux-01: 172.30.0.15

Установка Nomad, Consul. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Nomad кластСра

ΠŸΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΠΌ ΠΊ Π±Π°Π·ΠΎΠ²ΠΎΠΉ установкС. НСсмотря Π½Π° простоту установки, я ΠΎΠΏΠΈΡˆΡƒ Π΅Π΅ для цСлостности ΡΡ‚Π°Ρ‚ΡŒΠΈ: ΠΏΠΎ сути ΠΎΠ½Π° Π±Ρ‹Π»Π° создана ΠΈΠ· Ρ‡Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊΠΎΠ² ΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΎΠΊ для быстрого доступа Π² случаС нСобходимости.

ΠŸΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ обсудим Ρ‚Π΅ΠΎΡ€Π΅Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π° Π΄Π°Π½Π½ΠΎΠΌ этапС Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΉ структуры.

Π£ нас сущСствуСт Π΄Π²Π΅ Π½ΠΎΠ΄Ρ‹ Π½ΠΎΠΌΠ°Π΄Π° ΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΈΡ… Π² кластСр, Ρ‚Π°ΠΊΠΆΠ΅ Π½Π° Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅ врСмя Π½Π°ΠΌ потрСбуСтся автоматичСский скСйлинг кластСра β€” для этого Π½Π°ΠΌ понадобится Consul. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этого инструмСнта кластСризация ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… Π½ΠΎΠ΄ становится ΠΎΡ‡Π΅Π½ΡŒ простой Π·Π°Π΄Π°Ρ‡Π΅ΠΉ: созданная Π½ΠΎΠ΄Π° Nomad ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊ Consul Π°Π³Π΅Π½Ρ‚Ρƒ, послС Ρ‡Π΅Π³ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ Nomad кластСру. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΌΡ‹ установим Consul сСрвСр, настроим Π±Π°Π·ΠΎΠ²ΡƒΡŽ http Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡŽ для Π²Π΅Π±-ΠΏΠ°Π½Π΅Π»ΠΈ (ΠΎΠ½Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±Π΅Π· Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ доступна ΠΏΠΎ Π²Π½Π΅ΡˆΠ½Π΅ΠΌΡƒ адрСсу), Π° Ρ‚Π°ΠΊΠΆΠ΅ сами Consul Π°Π³Π΅Π½Ρ‚Ρ‹ Π½Π° Nomad сСрвСрах, послС Ρ‡Π΅Π³ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ приступим ΠΊ Nomad.

Установка инструмСнтов ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ HashiCorp ΠΎΡ‡Π΅Π½ΡŒ проста: ΠΏΠΎ сути, ΠΌΡ‹ просто ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π² bin Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ, настраиваСм ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» инструмСнта ΠΈ создаСм Π΅Π³ΠΎ сСрвис Ρ„Π°ΠΉΠ».

Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Consul ΠΈ распаковываСм Π΅Π³ΠΎ Π² домашнюю Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ:

root@consul-livelinux-01:~# wget https://releases.hashicorp.com/consul/1.5.0/consul_1.5.0_linux_amd64.zip
root@consul-livelinux-01:~# unzip consul_1.5.0_linux_amd64.zip
root@consul-livelinux-01:~# mv consul /usr/local/bin/

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» consul для дальнСйшСй настройки.

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Consul Π½Π°ΠΌ трСбуСтся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ keygen:

root@consul-livelinux-01:~# consul keygen

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ настройкС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Consul, создаСм Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ /etc/consul.d/ со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ структурой:

/etc/consul.d/
β”œβ”€β”€ bootstrap
β”‚   └── config.json

Π’ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ bootstrap Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» config.json β€” Π² Π½Π΅ΠΌ ΠΌΡ‹ Π·Π°Π΄Π°Π΄ΠΈΠΌ настройки Consul. Π•Π³ΠΎ содСрТимоС:

{
"bootstrap": true,
"server": true,
"datacenter": "dc1",
"data_dir": "/var/consul",
"encrypt": "your-key",
"log_level": "INFO",
"enable_syslog": true,
"start_join": ["172.30.0.15"]
}

Π Π°Π·Π±Π΅Ρ€Π΅ΠΌ ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ основныС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΈ ΠΈΡ… значСния:

  • bootstrap: true. Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ автоматичСскоС Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… Π½ΠΎΠ΄ Π² случаС ΠΈΡ… ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. ΠžΡ‚ΠΌΠ΅Ρ‡Ρƒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ здСсь Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ число ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹Ρ… Π½ΠΎΠ΄.
  • server: true. Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Ρ€Π΅ΠΆΠΈΠΌ сСрвСра. Consul Π½Π° этой Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ СдинствСнным сСрвСром ΠΈ мастСром, Π’Πœ Nomad’a Π±ΡƒΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ.
  • datacenter: dc1. Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π΄Π°Ρ‚Π°Ρ†Π΅Π½Ρ‚Ρ€Π° для создания кластСра. Он Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½ ΠΈ Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°Ρ…, ΠΈ Π½Π° сСрвСрах.
  • encrypt: your-key. ΠšΠ»ΡŽΡ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ Π½Π° всСх ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°Ρ… ΠΈ сСрвСрах. ГСнСрируСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ consul keygen.
  • start_join. Π’ этом спискС ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ список IP адрСсов, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ оставляСм Ρ‚ΠΎΠ»ΡŒΠΊΠΎ собствСнный адрСс.

На Π΄Π°Π½Π½ΠΎΠΌ этапС ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ consul с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки:

root@consul-livelinux-01:~# /usr/local/bin/consul agent -config-dir /etc/consul.d/bootstrap -ui

Π­Ρ‚ΠΎ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎΠΉ способ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ сСйчас, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π½Π° постоянной основС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот способ Π½Π΅ получится ΠΏΠΎ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ сСрвис Ρ„Π°ΠΉΠ» для управлСния Consul Ρ‡Π΅Ρ€Π΅Π· systemd:

root@consul-livelinux-01:~# nano /etc/systemd/system/consul.service

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ Ρ„Π°ΠΉΠ»Π° consul.service:

[Unit]
Description=Consul Startup process
After=network.target
 
[Service]
Type=simple
ExecStart=/bin/bash -c '/usr/local/bin/consul agent -config-dir /etc/consul.d/bootstrap -ui' 
TimeoutStartSec=0
 
[Install]
WantedBy=default.target

ЗапускаСм Consul Ρ‡Π΅Ρ€Π΅Π· systemctl:

root@consul-livelinux-01:~# systemctl start consul

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ: Ρƒ нас сСрвис Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΡƒΡ‰Π΅Π½, Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ consul members ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ наш сСрвСр:

root@consul-livelinux:/etc/consul.d# consul members
consul-livelinux    172.30.0.15:8301  alive   server  1.5.0  2         dc1  <all>

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ этап: установка Nginx ΠΈ настройка проксирования, http Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ. УстанавливаСм nginx Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΈ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ /etc/nginx/sites-enabled создаСм ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» consul.conf со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ содСрТимым:

upstream consul-auth {
    server localhost:8500;
}

server {

    server_name consul.doman.name;
    
    location / {
      proxy_pass http://consul-auth;
      proxy_set_header Host $host;
      auth_basic_user_file /etc/nginx/.htpasswd;
      auth_basic "Password-protected Area";
    }
}

НС Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ .htpasswd Ρ„Π°ΠΉΠ» ΠΈ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ для Π½Π΅Π³ΠΎ Π»ΠΎΠ³ΠΈΠ½ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ. Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΡƒΠ½ΠΊΡ‚ трСбуСтся для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π΅Π±-панСль Π½Π΅ Π±Ρ‹Π»Π° доступна всСм, ΠΊΡ‚ΠΎ Π·Π½Π°Π΅Ρ‚ наш Π΄ΠΎΠΌΠ΅Π½. Однако, ΠΏΡ€ΠΈ настройкС Gitlab Π½Π°ΠΌ придСтся ΠΎΡ‚ этого ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ β€” Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΌΡ‹ Π½Π΅ смоТСм Π·Π°Π΄Π΅ΠΏΠ»ΠΎΠΈΡ‚ΡŒ Π² Nomad нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π’ ΠΌΠΎΠ΅ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΈ Gitlab, ΠΈ Nomad находятся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² сСрой сСти, поэтому Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ здСсь Π½Π΅Ρ‚.

На ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π²ΡƒΡ… сСрвСрах устанавливаСм Consul Π°Π³Π΅Π½Ρ‚Ρ‹ ΠΏΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ инструкции. ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΡΠ΅ΠΌ дСйствия с Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ:

root@nomad-livelinux-01:~# wget https://releases.hashicorp.com/consul/1.5.0/consul_1.5.0_linux_amd64.zip
root@nomad-livelinux-01:~# unzip consul_1.5.0_linux_amd64.zip
root@nomad-livelinux-01:~# mv consul /usr/local/bin/

По Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ сСрвСром создаСм Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ для ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² /etc/consul.d со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ структурой:

/etc/consul.d/
β”œβ”€β”€ client
β”‚   └── config.json

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ Ρ„Π°ΠΉΠ»Π° config.json:

{
    "datacenter": "dc1",
    "data_dir": "/opt/consul",
    "log_level": "DEBUG",
    "node_name": "nomad-livelinux-01",
    "server": false,
    "encrypt": "your-private-key",
    "domain": "livelinux",
    "addresses": {
      "dns": "127.0.0.1",
      "https": "0.0.0.0",
      "grpc": "127.0.0.1",
      "http": "127.0.0.1"
    },
    "bind_addr": "172.30.0.5", # Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ адрСс Π²ΠΌ
    "start_join": ["172.30.0.15"], # ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ адрСс консул сСрвСра
    "ports": {
      "dns": 53
     }

БохраняСм измСнСния ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ настройкС сСрвис-Ρ„Π°ΠΉΠ»Π°, Π΅Π³ΠΎ содСрТимоС:

/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

[Service]
User=root
Group=root
ExecStart=/usr/local/bin/consul agent -config-dir=/etc/consul.d/client
ExecReload=/usr/local/bin/consul reload
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

ЗапускаСм consul Π½Π° сСрвСрС. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, послС запуска ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π² nsul members ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ настроСнный сСрвис. Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΡΡ ΠΊ кластСру ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ‚. ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ Ρ‚ΠΎΠΆΠ΅ самоС Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΌ сСрвСрС ΠΈ послС этого ΠΌΡ‹ смоТСм ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ установкС ΠΈ настройкС Nomad.

Π‘ΠΎΠ»Π΅Π΅ подробная установка Nomad описана Π² Π΅Π³ΠΎ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ. Π•ΡΡ‚ΡŒ Π΄Π²Π° Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… способа установки: Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈ компиляция ΠΈΠ· исходников. Π― Π²Ρ‹Π±Π΅Ρ€Ρƒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ способ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΎΡ‡Π΅Π½ΡŒ быстро развиваСтся, часто выходят Π½ΠΎΠ²Ρ‹Π΅ обновлСния. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΊ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΡΡ‚Π°Ρ‚ΡŒΠΈ Π²Ρ‹ΠΉΠ΄Π΅Ρ‚ новая вСрсия. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΡ€ΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Nomad Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ Π΅Π΅.

root@nomad-livelinux-01:~# wget https://releases.hashicorp.com/nomad/0.9.1/nomad_0.9.1_linux_amd64.zip
root@nomad-livelinux-01:~# unzip nomad_0.9.1_linux_amd64.zip
root@nomad-livelinux-01:~# mv nomad /usr/local/bin/
root@nomad-livelinux-01:~# nomad -autocomplete-install
root@nomad-livelinux-01:~# complete -C /usr/local/bin/nomad nomad
root@nomad-livelinux-01:~# mkdir /etc/nomad.d

ПослС распаковки ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Nomad’a вСсом Π² 65 Мб β€” Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² /usr/local/bin.

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ data Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ для Nomad’a ΠΈ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ Π΅Π³ΠΎ service Ρ„Π°ΠΉΠ» (Π΅Π³ΠΎ, скорСС всСго, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² Π½Π°Ρ‡Π°Π»Π΅):

root@nomad-livelinux-01:~# mkdir --parents /opt/nomad
root@nomad-livelinux-01:~# nano /etc/systemd/system/nomad.service

ВставляСм Ρ‚ΡƒΠ΄Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ строчки:

[Unit]
Description=Nomad
Documentation=https://nomadproject.io/docs/
Wants=network-online.target
After=network-online.target

[Service]
ExecReload=/bin/kill -HUP $MAINPID
ExecStart=/usr/local/bin/nomad agent -config /etc/nomad.d
KillMode=process
KillSignal=SIGINT
LimitNOFILE=infinity
LimitNPROC=infinity
Restart=on-failure
RestartSec=2
StartLimitBurst=3
StartLimitIntervalSec=10
TasksMax=infinity

[Install]
WantedBy=multi-user.target

Однако, Π½Π΅ спСшим Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ nomad β€” ΠΌΡ‹ Π΅Ρ‰Π΅ Π½Π΅ создали Π΅Π³ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»:

root@nomad-livelinux-01:~# mkdir --parents /etc/nomad.d
root@nomad-livelinux-01:~# chmod 700 /etc/nomad.d
root@nomad-livelinux-01:~# nano /etc/nomad.d/nomad.hcl
root@nomad-livelinux-01:~# nano /etc/nomad.d/server.hcl

Π˜Ρ‚ΠΎΠ³ΠΎΠ²Π°Ρ структура Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ:

/etc/nomad.d/
β”œβ”€β”€ nomad.hcl
└── server.hcl

Π€Π°ΠΉΠ» nomad.hcl Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ:

datacenter = "dc1"
data_dir = "/opt/nomad"

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ Ρ„Π°ΠΉΠ»Π° server.hcl:

server {
  enabled = true
  bootstrap_expect = 1
}

consul {
  address             = "127.0.0.1:8500"
  server_service_name = "nomad"
  client_service_name = "nomad-client"
  auto_advertise      = true
  server_auto_join    = true
  client_auto_join    = true
}

bind_addr = "127.0.0.1" 

advertise {
  http = "172.30.0.5"
}

client {
  enabled = true
}

НС Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ» Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΌ сСрвСрС β€” Ρ‚Π°ΠΌ потрСбуСтся ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ http.

ПослСдним Π½Π° Π΄Π°Π½Π½ΠΎΠΌ этапС остаСтся настройка Nginx для проксирования ΠΈ установки http Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ Ρ„Π°ΠΉΠ»Π° nomad.conf:

upstream nomad-auth {
        server 172.30.0.5:4646;
}

server {

        server_name nomad.domain.name;
        
        location / {
	        proxy_pass http://nomad-auth;
	        proxy_set_header Host $host;
	        auth_basic_user_file /etc/nginx/.htpasswd;
		   auth_basic "Password-protected Area";
        }
        
}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π²Π΅Π±-ΠΏΠ°Π½Π΅Π»ΠΈ ΠΏΠΎ внСшнСй сСти. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡΡ ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π½Π° страницу servers:

Настройка кластСра Nomad с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Consul ΠΈ интСграция с Gitlab
Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 1. Бписок сСрвСров Π² кластСрС Nomad

Оба сСрвСра ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π² ΠΏΠ°Π½Π΅Π»ΠΈ, Ρ‚ΠΎΠΆΠ΅ самоС ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Π² Π²Ρ‹Π²ΠΎΠ΄Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ nomad node status:

Настройка кластСра Nomad с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Consul ΠΈ интСграция с Gitlab
Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 2. Π’Ρ‹Π²ΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ nomad node status

Π§Ρ‚ΠΎ ΠΆΠ΅ со стороны Consul? Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим. ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² панСль управлСния Consul, Π½Π° страницу nodes:
Настройка кластСра Nomad с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Consul ΠΈ интСграция с Gitlab
Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 3. Бписок Π½ΠΎΠ΄ Π² кластСрС Consul

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉ Nomad, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ Π² связкС с Consul. Π’ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅ΠΌ этапС ΠΌΡ‹ приступим ΠΊ самому интСрСсному: настроим доставку Docker ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² ΠΈΠ· Gitlab Π² Nomad, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… Π΅Π³ΠΎ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… особСнностях.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Gitlab Runner

Для дСплоя Π΄ΠΎΠΊΠ΅Ρ€ ΠΎΠ±Ρ€Π°Π·ΠΎΠ² Π² Номад ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π½Π½Π΅Ρ€ с Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»ΠΎΠΌ Nomad’а Π²Π½ΡƒΡ‚Ρ€ΠΈ (Ρ‚ΡƒΡ‚, кстати, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Hashicorp β€” ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠ½ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΈΠ· сСбя СдинствСнный Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»). Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ Π΅Π³ΠΎ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ Ρ€Π°Π½Π½Π΅Ρ€Π°. Для Π½Π΅Π³ΠΎ создадим ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ Dockerfile со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ содСрТимым:


FROM alpine:3.9
RUN apk add --update --no-cache libc6-compat gettext
COPY nomad /usr/local/bin/nomad

Π’ этом ΠΆΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ создаСм .gitlab-ci.yml:

variables:
  DOCKER_IMAGE: nomad/nomad-deploy
  DOCKER_REGISTRY: registry.domain.name
 

stages:
  - build

build:
  stage: build
  image: ${DOCKER_REGISTRY}/nomad/alpine:3
  script:
    - tag=${DOCKER_REGISTRY}/${DOCKER_IMAGE}:latest
    - docker build --pull -t ${tag} -f Dockerfile .
    - docker push ${tag}

Π’ ΠΈΡ‚ΠΎΠ³Π΅ Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ доступный ΠΎΠ±Ρ€Π°Π· Ρ€Π°Π½Π½Π΅Ρ€Π° Номада Π² Gitlab Registry, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ нСпосрСдствСнно Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, создадим Pipeline ΠΈ настроим nomad job Nomad’a.

Настройка ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

НачнСм с Ρ„Π°ΠΉΠ»Π° job’s для Nomad. Мой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ достаточно ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π΅Π½: ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ таски. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ .gitlab-ci Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ:

variables:
  NOMAD_ADDR: http://nomad.address.service:4646
  DOCKER_REGISTRY: registry.domain.name
  DOCKER_IMAGE: example/project

stages:
  - build
  - deploy

build:
  stage: build
  image: ${DOCKER_REGISTRY}/nomad-runner/alpine:3
  script:
    - tag=${DOCKER_REGISTRY}/${DOCKER_IMAGE}:${CI_COMMIT_SHORT_SHA}
    - docker build --pull -t ${tag} -f Dockerfile .
    - docker push ${tag}


deploy:
  stage: deploy
  image: registry.example.com/nomad/nomad-runner:latest
  script:
    - envsubst '${CI_COMMIT_SHORT_SHA}' < project.nomad > job.nomad
    - cat job.nomad
    - nomad validate job.nomad
    - nomad plan job.nomad || if [ $? -eq 255 ]; then exit 255; else echo "success"; fi
    - nomad run job.nomad
  environment:
    name: production
  allow_failure: false
  when: manual

Π—Π΄Π΅ΡΡŒ Π΄Π΅ΠΏΠ»ΠΎΠΉ происходит Π² Ρ€ΡƒΡ‡Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, Π½ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ содСрТимого Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Pipeline ΠΆΠ΅ состоит ΠΈΠ· Π΄Π²ΡƒΡ… этапов: ΠΈΠ· сборки ΠΎΠ±Ρ€Π°Π·Π° ΠΈ Π΅Π³ΠΎ дСплоя Π² Π½ΠΎΠΌΠ°Π΄. На ΠΏΠ΅Ρ€Π²ΠΎΠΌ этапС ΠΌΡ‹ собираСм Π΄ΠΎΠΊΠ΅Ρ€ ΠΎΠ±Ρ€Π°Π· ΠΈ ΠΏΡƒΡˆΠΈΠΌ Π΅Π³ΠΎ Π² наш Registry, Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΆΠ΅ запускаСм Π½Π°ΡˆΡƒ job Π² Nomad.

job "monitoring-status" {
    datacenters = ["dc1"]
    migrate {
        max_parallel = 3
        health_check = "checks"
        min_healthy_time = "15s"
        healthy_deadline = "5m"
    }

    group "zhadan.ltd" {
        count = 1
        update {
            max_parallel      = 1
            min_healthy_time  = "30s"
            healthy_deadline  = "5m"
            progress_deadline = "10m"
            auto_revert       = true
        }
        task "service-monitoring" {
            driver = "docker"

            config {
                image = "registry.domain.name/example/project:${CI_COMMIT_SHORT_SHA}"
                force_pull = true
                auth {
                    username = "gitlab_user"
                    password = "gitlab_password"
                }
                port_map {
                    http = 8000
                }
            }
            resources {
                network {
                    port "http" {}
                }
            }
        }
    }
}

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ρƒ мСня Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ Registry ΠΈ для ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ ΠΏΡƒΠ»Π»Π° Π΄ΠΎΠΊΠ΅Ρ€-ΠΎΠ±Ρ€Π°Π·Π° ΠΌΠ½Π΅ трСбуСтся Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Π½Π΅ΠΌ. Π›ΡƒΡ‡ΡˆΠΈΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС являСтся Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π»ΠΎΠ³ΠΈΠ½Π° ΠΈ пароля Π² Vault с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠ΅ΠΉ Π΅Π³ΠΎ с Nomad. Nomad Π½Π°Ρ‚ΠΈΠ²Π½ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Vault. Но для Π½Π°Ρ‡Π°Π»Π° Π² самом Vault установим Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ policy для Nomad, ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ:

# Download the policy and token role
$ curl https://nomadproject.io/data/vault/nomad-server-policy.hcl -O -s -L
$ curl https://nomadproject.io/data/vault/nomad-cluster-role.json -O -s -L

# Write the policy to Vault
$ vault policy write nomad-server nomad-server-policy.hcl

# Create the token role with Vault
$ vault write /auth/token/roles/nomad-cluster @nomad-cluster-role.json

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, создав Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ policy ΠΌΡ‹ Π² Π±Π»ΠΎΠΊΠ΅ task Π² Ρ„Π°ΠΉΠ»Π΅ job.nomad Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ с Vault:

vault {
  enabled = true
  address = "https://vault.domain.name:8200"
  token = "token"
}

Π― ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΠΎ Ρ‚ΠΎΠΊΠ΅Π½Ρƒ ΠΈ ΠΏΡ€ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽ Π΅Π³ΠΎ нСпосрСдствСнно здСсь, Ρ‚Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ указания Ρ‚ΠΎΠΊΠ΅Π½Π° ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΈ запускС nomad agent:

$ VAULT_TOKEN=<token> nomad agent -config /path/to/config

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡ΠΈ с Vault. ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π°Π±ΠΎΡ‚Ρ‹ прост: ΠΌΡ‹ создаСм Ρ„Π°ΠΉΠ» Π² Nomad job, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² сСбС значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

template {
                data = <<EOH
{{with secret "secrets/pipeline-keys"}}
REGISTRY_LOGIN="{{ .Data.REGISTRY_LOGIN }}"
REGISTRY_PASSWORD="{{ .Data.REGISTRY_LOGIN }}{{ end }}"

EOH
    destination = "secrets/service-name.env"
    env = true
}

Π’ΠΎΡ‚ Ρ‚Π°ΠΊΠΈΠΌ нСслоТным ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ доставку ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² Π² кластСр Nomad ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π½ΠΈΠΌ Π² дальнСйшСм. Π― ΠΆΠ΅ скаТу, Ρ‡Ρ‚ΠΎ Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ стСпСни я ΡΠΈΠΌΠΏΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΡƒΡŽ Nomad β€” ΠΎΠ½ большС ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², Π³Π΄Π΅ Kubernetes ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ слоТности ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ свой ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π» Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π°. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅, Nomad ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΌ β€” ΠΎΠ½ просто устанавливаСтся ΠΈ конфигурируСтся. Однако, ΠΏΡ€ΠΈ тСстировании Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… я ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡΡŒ с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Π΅Π³ΠΎ Ρ€Π°Π½Π½ΠΈΡ… вСрсий β€” ΠΌΠ½ΠΎΠ³ΠΈΡ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ просто Π½Π΅Ρ‚ ΠΈΠ»ΠΈ ΠΎΠ½ΠΈ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, я ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ Nomad Π±ΡƒΠ΄Π΅Ρ‚ дальшС Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΈ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ обрастСт Π½ΡƒΠΆΠ½Ρ‹ΠΌΠΈ всСм функциями.

Автор: Илья АндрССв, ΠΏΠΎΠ΄ Ρ€Π΅Π΄Π°ΠΊΡ†ΠΈΠ΅ΠΉ АлСксСя Π–Π°Π΄Π°Π½ ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Β«Π›Π°ΠΉΠ² Линукс»


Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com