ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
Π ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ Π²ΡΠ΅ΠΌΡ ΡΡΡΠ΅ΠΌΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ°ΡΡΠ΅Ρ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΡΡΡ Kubernetes β Π²ΡΠ΅ Π±ΠΎΠ»ΡΡΠ΅ ΠΈ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² Π²Π½Π΅Π΄ΡΡΡΡ Π΅Π³ΠΎ Ρ ΡΠ΅Π±Ρ. Π― ΠΆΠ΅ Ρ ΠΎΡΠ΅Π» ΠΊΠΎΡΠ½ΡΡΡΡΡ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΎΡΠ°, ΠΊΠ°ΠΊ Nomad: ΠΎΠ½ ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ°ΠΌ, Π³Π΄Π΅ ΡΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΎΡ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ HashiCorp, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Vault ΠΈ Consul, Π° ΡΠ°ΠΌΠΈ ΠΏΡΠΎΠ΅ΠΊΡΡ Π½Π΅ ΡΠ²Π»ΡΡΡΡΡ ΡΠ»ΠΎΠΆΠ½ΡΠΌΠΈ Π² ΠΏΠ»Π°Π½Π΅ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΡ. Π Π΄Π°Π½Π½ΠΎΠΌ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π΅ Π±ΡΠ΄Π΅Ρ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ ΠΏΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ Nomad, ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π΄Π²ΡΡ Π½ΠΎΠ΄ Π² ΠΊΠ»Π°ΡΡΠ΅Ρ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Nomad Ρ Gitlab.
Π’Π΅ΡΡΠΎΠ²ΡΠΉ ΡΡΠ΅Π½Π΄
ΠΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎ ΡΠ΅ΡΡΠΎΠ²ΠΎΠΌ ΡΡΠ΅Π½Π΄Π΅: ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΡΠΈ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ° Ρ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ°ΠΌΠΈ 2 CPU, 4 RAM, 50 Gb SSD, ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΡ Π² ΠΎΠ±ΡΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΡΠ΅ΡΡ. ΠΡ Π½Π°Π·Π²Π°Π½ΠΈΡ ΠΈ IP Π°Π΄ΡΠ΅ΡΠ°:
- nomad-livelinux-01: 172.30.0.5
- nomad-livelinux-02: 172.30.0.10
- 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:
ΠΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ 1. Π‘ΠΏΠΈΡΠΎΠΊ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ² Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅ Nomad
ΠΠ±Π° ΡΠ΅ΡΠ²Π΅ΡΠ° ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ Π² ΠΏΠ°Π½Π΅Π»ΠΈ, ΡΠΎΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ Π² Π²ΡΠ²ΠΎΠ΄Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ nomad node status:
ΠΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ 2. ΠΡΠ²ΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄Ρ nomad node status
Π§ΡΠΎ ΠΆΠ΅ ΡΠΎ ΡΡΠΎΡΠΎΠ½Ρ Consul? ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ. ΠΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΠΌ Π² ΠΏΠ°Π½Π΅Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Consul, Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ nodes:
ΠΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ 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