Consul рд╡рд╛рдкрд░реВрди Nomad рдХреНрд▓рд╕реНрдЯрд░ рд╕реЗрдЯ рдХрд░рдгреЗ рдЖрдгрд┐ Gitlab рд╕рд╣ рдПрдХрддреНрд░рд┐рдд рдХрд░рдгреЗ

рдкрд░рд┐рдЪрдп

рдЕрд▓реАрдХрдбреЗ, рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рдЪреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рд╡реЗрдЧрд╛рдиреЗ рд╡рд╛рдврдд рдЖрд╣реЗ - рдЕрдзрд┐рдХрд╛рдзрд┐рдХ рдкреНрд░рдХрд▓реНрдк рддреНрдпрд╛рдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдХрд░реАрдд рдЖрд╣реЗрдд. рдорд▓рд╛ рдиреЛрдореЕрдб рд╕рд╛рд░рдЦреНрдпрд╛ рдСрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрдЯрд░рд▓рд╛ рд╕реНрдкрд░реНрд╢ рдХрд░рд╛рдпрдЪрд╛ рд╣реЛрддрд╛: рд╣реЗ рдЕрд╢рд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдВрд╕рд╛рдареА рдпреЛрдЧреНрдп рдЖрд╣реЗ рдЬреЗ рдЖрдзреАрдЪ HashiCorp рдордзреАрд▓ рдЗрддрд░ рдЙрдкрд╛рдп рд╡рд╛рдкрд░рддрд╛рдд, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, Vault рдЖрдгрд┐ Consul, рдЖрдгрд┐ рдкреНрд░рдХрд▓реНрдк рд╕реНрд╡рддрдГрдЪ рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛рдВрдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд рдЬрдЯрд┐рд▓ рдирд╛рд╣реАрдд. рдпрд╛ рд╕рд╛рдордЧреНрд░реАрдордзреНрдпреЗ Nomad рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдХреНрд▓рд╕реНрдЯрд░рдордзреНрдпреЗ рджреЛрди рдиреЛрдбреНрд╕ рдПрдХрддреНрд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рддрд╕реЗрдЪ Gitlab рд╕рд╣ Nomad рдПрдХрддреНрд░рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рд╕реВрдЪрдирд╛ рдЕрд╕рддреАрд▓.

Consul рд╡рд╛рдкрд░реВрди Nomad рдХреНрд▓рд╕реНрдЯрд░ рд╕реЗрдЯ рдХрд░рдгреЗ рдЖрдгрд┐ 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

рднрдЯрдХреНрдпрд╛, рд╕рд▓реНрд▓рд╛рдЧрд╛рд░рд╛рдЪреА рд╕реНрдерд╛рдкрдирд╛. рднрдЯрдХреНрдпрд╛рдВрдЪреЗ рдХреНрд▓рд╕реНрдЯрд░ рддрдпрд╛рд░ рдХрд░рдгреЗ

рдЪрд▓рд╛ рдореВрд▓рднреВрдд рд╕реНрдерд╛рдкрдиреЗрд╕рд╣ рдкреНрд░рд╛рд░рдВрдн рдХрд░реВрдпрд╛. рдЬрд░реА рд╕реЗрдЯрдЕрдк рд╕реЛрдкреЗ рд╣реЛрддреЗ, рдореА рд▓реЗрдЦрд╛рдЪреНрдпрд╛ рдЕрдЦрдВрдбрддреЗрдЪреНрдпрд╛ рдлрд╛рдпрджреНрдпрд╛рд╕рд╛рдареА рддреНрдпрд╛рдЪреЗ рд╡рд░реНрдгрди рдХрд░реЗрди: рдЬреЗрд╡реНрд╣рд╛ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕реЗрд▓ рддреЗрд╡реНрд╣рд╛ рджреНрд░реБрдд рдкреНрд░рд╡реЗрд╢рд╛рд╕рд╛рдареА рддреЗ рдореВрд▓рдд: рдорд╕реБрджреЗ рдЖрдгрд┐ рдиреЛрдЯреНрд╕рдордзреВрди рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ.

рдЖрдкрдг рд╕рд░рд╛рд╡ рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА, рдЖрдкрдг рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рднрд╛рдЧрд╛рд╡рд░ рдЪрд░реНрдЪрд╛ рдХрд░реВ, рдХрд╛рд░рдг рдпрд╛ рдЯрдкреНрдкреНрдпрд╛рд╡рд░ рднрд╡рд┐рд╖реНрдпрд╛рддреАрд▓ рд░рдЪрдирд╛ рд╕рдордЬреВрди рдШреЗрдгреЗ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ.

рдЖрдордЪреНрдпрд╛рдХрдбреЗ рджреЛрди рднрдЯрдХреНрдпрд╛ рдиреЛрдбреНрд╕ рдЖрд╣реЗрдд рдЖрдгрд┐ рдЖрдореНрд╣рд╛рд▓рд╛ рддреЗ рдПрдХрд╛ рдХреНрд▓рд╕реНрдЯрд░рдордзреНрдпреЗ рдПрдХрддреНрд░ рдХрд░рд╛рдпрдЪреЗ рдЖрд╣реЗрдд рдЖрдгрд┐ рднрд╡рд┐рд╖реНрдпрд╛рдд рдЖрдореНрд╣рд╛рд▓рд╛ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХреНрд▓рд╕реНрдЯрд░ рд╕реНрдХреЗрд▓рд┐рдВрдЧрдЪреА рджреЗрдЦреАрд▓ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реЗрд▓ - рдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣рд╛рд▓рд╛ рдХреЙрдиреНрд╕реБрд▓рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реЗрд▓. рдпрд╛ рд╕рд╛рдзрдирд╛рд╕рд╣, рдирд╡реАрди рдиреЛрдбреНрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдХрд░рдгреЗ рдЖрдгрд┐ рдЬреЛрдбрдгреЗ рд╣реЗ рдЕрдЧрджреА рд╕реЛрдкреЗ рдХрд╛рдо рдмрдирддреЗ: рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓рд╛ рдиреЛрдореЕрдб рдиреЛрдб рдХреЙрдиреНрд╕реБрд▓ рдПрдЬрдВрдЯрд╢реА рдХрдиреЗрдХреНрдЯ рд╣реЛрддреЛ, рдЖрдгрд┐ рдирдВрддрд░ рд╡рд┐рджреНрдпрдорд╛рди рдиреЛрдореЕрдб рдХреНрд▓рд╕реНрдЯрд░рд╢реА рдХрдиреЗрдХреНрдЯ рд╣реЛрддреЛ. рдореНрд╣рдгреВрди, рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рдЖрдореНрд╣реА рдХреЙрдиреНрд╕реБрд▓ рд╕рд░реНрд╡реНрд╣рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реВ, рд╡реЗрдм рдкреЕрдиреЗрд▓рд╕рд╛рдареА рдореВрд▓рднреВрдд http рдЕрдзрд┐рдХреГрддрддрд╛ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░реВ (рддреЗ рдбреАрдлреЙрд▓реНрдЯрдиреБрд╕рд╛рд░ рдЕрдзрд┐рдХреГрддрддреЗрд╢рд┐рд╡рд╛рдп рдЖрд╣реЗ рдЖрдгрд┐ рдмрд╛рд╣реНрдп рдкрддреНрддреНрдпрд╛рд╡рд░ рдкреНрд░рд╡реЗрд╢ рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ), рддрд╕реЗрдЪ рдХреЙрдиреНрд╕реБрд▓ рдПрдЬрдВрдЯ рд╕реНрд╡рддрдГ рдиреЛрдореЕрдб рд╕рд░реНрд╡реНрд╣рд░рд╡рд░, рддреНрдпрд╛рдирдВрддрд░ рдЖрдореНрд╣реА рдлрдХреНрдд рднрдЯрдХреНрдпрд╛рдХрдбреЗ рдЬрд╛рдК.

HashiCorp рдЪреА рдЯреВрд▓реНрд╕ рдЗрдиреНрд╕реНрдЯреЙрд▓ рдХрд░рдгреЗ рдЦреВрдк рд╕реЛрдкреЗ рдЖрд╣реЗ: рдореВрд▓рдд:, рдЖрдореНрд╣реА рдлрдХреНрдд рдмрд╛рдпрдирд░реА рдлрд╛рдЗрд▓ рдмрд┐рди рдбрд┐рд░реЗрдХреНрдЯрд░реАрдордзреНрдпреЗ рд╣рд▓рд╡рддреЛ, рдЯреВрд▓рдЪреА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓ рд╕реЗрдЯ рдХрд░рддреЛ рдЖрдгрд┐ рддреНрдпрд╛рдЪреА рд╕рд░реНрд╡реНрд╣рд┐рд╕ рдлрд╛рдЗрд▓ рддрдпрд╛рд░ рдХрд░рддреЛ.

рдХреЙрдиреНрд╕реБрд▓ рдмрд╛рдпрдирд░реА рдлрд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рд╛ рдЖрдгрд┐ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рд╣реЛрдо рдбрд┐рд░реЗрдХреНрдЯрд░реАрдордзреНрдпреЗ рдЕрдирдкреЕрдХ рдХрд░рд╛:

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 рд╕рд╣ рдХрд╛рдо рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣рд╛рд▓рд╛ keygen рдХрдорд╛рдВрдб рд╡рд╛рдкрд░реВрди рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдХреА рддрдпрд╛рд░ рдХрд░рд╛рд╡реА рд▓рд╛рдЧреЗрд▓:

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

рдЦрд╛рд▓реАрд▓ рд╕рдВрд░рдЪрдиреЗрд╕рд╣ /etc/consul.d/ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рддрдпрд╛рд░ рдХрд░реВрди, Consul рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕реЗрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкреБрдвреЗ рдЬрд╛рдКрдпрд╛:

/etc/consul.d/
тФЬтФАтФА bootstrap
тФВ   тФФтФАтФА config.json

рдмреВрдЯрд╕реНрдЯреНрд░реЕрдк рдбрд┐рд░реЗрдХреНрдЯрд░реАрдордзреНрдпреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓ config.json рдЕрд╕реЗрд▓ - рддреНрдпрд╛рдд рдЖрдореНрд╣реА рдХреЙрдиреНрд╕реБрд▓ рд╕реЗрдЯрд┐рдВрдЧреНрдЬ рд╕реЗрдЯ рдХрд░реВ. рддреНрдпрд╛рдЪреА рд╕рд╛рдордЧреНрд░реА:

{
"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"]
}

рдЪрд▓рд╛ рдореБрдЦреНрдп рдирд┐рд░реНрджреЗрд╢ рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреЗ рдЕрд░реНрде рд╕реНрд╡рддрдВрддреНрд░рдкрдгреЗ рдкрд╛рд╣реВ:

  • рдмреВрдЯрд╕реНрдЯреНрд░реЕрдк: рдЦрд░реЗ. рдирд╡реАрди рдиреЛрдб рдХрдиреЗрдХреНрдЯ рдХреЗрд▓реЗрд▓реЗ рдЕрд╕рд▓реНрдпрд╛рд╕ рдЖрдореНрд╣реА рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рдЬреЛрдбрдгреЗ рд╕рдХреНрд╖рдо рдХрд░рддреЛ. рдореА рд▓рдХреНрд╖рд╛рдд рдШреЗрддреЛ рдХреА рдЕрдкреЗрдХреНрд╖рд┐рдд рдиреЛрдбреНрд╕рдЪреА рдЕрдЪреВрдХ рд╕рдВрдЦреНрдпрд╛ рдЖрдореНрд╣реА рдпреЗрдереЗ рджрд░реНрд╢рд╡рдд рдирд╛рд╣реА.
  • рд╕рд░реНрд╡реНрд╣рд░: рдЦрд░реЗ. рд╕рд░реНрд╡реНрд╣рд░ рдореЛрдб рд╕рдХреНрд╖рдо рдХрд░рд╛. рдпрд╛ рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрдирд╡рд░реАрд▓ рд╕рд▓реНрд▓рд╛рдЧрд╛рд░ рд╕рдзреНрдпрд╛ рдПрдХрдореЗрд╡ рд╕рд░реНрд╡реНрд╣рд░ рдЖрдгрд┐ рдорд╛рд╕реНрдЯрд░ рдореНрд╣рдгреВрди рдХрд╛рдо рдХрд░рддреАрд▓, рдиреЛрдореЕрдбрдЪреЗ рд╡реНрд╣реАрдПрдо рдЧреНрд░рд╛рд╣рдХ рдЕрд╕рддреАрд▓.
  • рдорд╛рд╣рд┐рддреА рдХреЗрдВрджреНрд░: dc1. рдХреНрд▓рд╕реНрдЯрд░ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдбреЗрдЯрд╛ рд╕реЗрдВрдЯрд░рдЪреЗ рдирд╛рд╡ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рд╛. рд╣реЗ рджреЛрдиреНрд╣реА рдХреНрд▓рд╛рдпрдВрдЯ рдЖрдгрд┐ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдПрдХрд╕рд╛рд░рдЦреЗ рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.
  • рдПрдирдХреНрд░рд┐рдкреНрдЯ: рддреБрдордЪреА-рдХреА. рдХреА, рдЬреА рдпреБрдирд┐рдХ рдЕрд╕рд╛рд╡реА рдЖрдгрд┐ рд╕рд░реНрд╡ рдХреНрд▓рд╛рдпрдВрдЯ рдЖрдгрд┐ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдЬреБрд│рд▓реА рдкрд╛рд╣рд┐рдЬреЗ. consul keygen рдХрдорд╛рдВрдб рд╡рд╛рдкрд░реВрди рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗрд▓реЗ.
  • start_join. рдпрд╛ рд╕реВрдЪреАрдордзреНрдпреЗ рдЖрдореНрд╣реА IP рдкрддреНрддреНрдпрд╛рдВрдЪреА рд╕реВрдЪреА рд╕реВрдЪрд┐рдд рдХрд░рддреЛ рдЬреНрдпрд╛рд╡рд░ рдХрдиреЗрдХреНрд╢рди рдХреЗрд▓реЗ рдЬрд╛рдИрд▓. рдпрд╛ рдХреНрд╖рдгреА рдЖрдкрдг рдлрдХреНрдд рдЖрдкрд▓рд╛ рд╕реНрд╡рддрдГрдЪрд╛ рдкрддреНрддрд╛ рд╕реЛрдбрддреЛ.

рдпрд╛ рдЯрдкреНрдкреНрдпрд╛рд╡рд░ рдЖрдкрдг рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╡рд╛рдкрд░реВрди рдХреЙрдиреНрд╕реБрд▓ рдЪрд╛рд▓рд╡реВ рд╢рдХрддреЛ:

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

рдЖрддреНрддрд╛ рдбреАрдмрдЧ рдХрд░рдгреНрдпрд╛рдЪрд╛ рд╣рд╛ рдПрдХ рдЪрд╛рдВрдЧрд▓рд╛ рдорд╛рд░реНрдЧ рдЖрд╣реЗ, рддрдерд╛рдкрд┐, рддреБрдореНрд╣реА рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдгрд╛рдВрдореБрд│реЗ рд╣реА рдкрджреНрдзрдд рд╕рддрдд рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕ рд╕рдХреНрд╖рдо рдЕрд╕рдгрд╛рд░ рдирд╛рд╣реА. 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

Systemctl рджреНрд╡рд╛рд░реЗ рдХреЙрдиреНрд╕реБрд▓ рд▓рд╛рдБрдЪ рдХрд░рд╛:

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

рдЪрд▓рд╛ рддрдкрд╛рд╕реВрдпрд╛: рдЖрдордЪреА рд╕реЗрд╡рд╛ рдЪрд╛рд▓реВ рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЖрдгрд┐ рдХреЙрдиреНрд╕реБрд▓ рд╕рджрд╕реНрдпрд╛рдВрдЪреНрдпрд╛ рдЖрджреЗрд╢рд╛рдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдХрд░реВрди рдЖрдореНрд╣реА рдЖрдордЪрд╛ рд╕рд░реНрд╡реНрд╣рд░ рдкрд╛рд╣рд┐рд▓рд╛ рдкрд╛рд╣рд┐рдЬреЗ:

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 рджреЛрдиреНрд╣реА рдлрдХреНрдд рдЧреНрд░реЗ рд╡реЗрдмрд╡рд░ рдЖрд╣реЗрдд, рддреНрдпрд╛рдореБрд│реЗ рдпреЗрдереЗ рдЕрд╢реА рдХреЛрдгрддреАрд╣реА рд╕рдорд╕реНрдпрд╛ рдирд╛рд╣реА.

рдЙрд░реНрд╡рд░рд┐рдд рджреЛрди рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдЖрдореНрд╣реА рдЦрд╛рд▓реАрд▓ рд╕реВрдЪрдирд╛рдВрдиреБрд╕рд╛рд░ рдХреЙрдиреНрд╕реБрд▓ рдПрдЬрдВрдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЛ. рдЖрдореНрд╣реА рдмрд╛рдпрдирд░реА рдлрд╛рдЗрд▓рд╕рд╣ рдЪрд░рдгрд╛рдВрдЪреА рдкреБрдирд░рд╛рд╡реГрддреНрддреА рдХрд░рддреЛ:

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

рдЖрдореНрд╣реА рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рд╕рд▓реНрд▓рд╛рдЧрд╛рд░ рд╕реБрд░реВ рдХрд░рддреЛ. рдЖрддрд╛, рд▓реЙрдиреНрдЪ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдЖрдкрдг nsul рд╕рджрд╕реНрдпрд╛рдВрдордзреНрдпреЗ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗрд▓реА рд╕реЗрд╡рд╛ рдкрд╛рд╣рд┐рд▓реА рдкрд╛рд╣рд┐рдЬреЗ. рдпрд╛рдЪрд╛ рдЕрд░реНрде рддреЛ рдХреНрд▓рд╕реНрдЯрд░рд╢реА рдХреНрд▓рд╛рдпрдВрдЯ рдореНрд╣рдгреВрди рдпрд╢рд╕реНрд╡реАрдкрдгреЗ рдХрдиреЗрдХреНрдЯ рдЭрд╛рд▓рд╛ рдЖрд╣реЗ. рджреБрд╕рд▒реНрдпрд╛ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рддреАрдЪ рдкреБрдирд░рд╛рд╡реГрддреНрддреА рдХрд░рд╛ рдЖрдгрд┐ рддреНрдпрд╛рдирдВрддрд░ рдЖрдореНрд╣реА 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

рдЕрдирдкреЕрдХ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдЖрдореНрд╣рд╛рд▓рд╛ 65 MB рд╡рдЬрдирд╛рдЪреА Nomad рдмрд╛рдпрдирд░реА рдлрд╛рдЗрд▓ рдорд┐рд│реЗрд▓ - рддреА /usr/local/bin рд╡рд░ рд╣рд▓рд╡рд▓реА рдЬрд╛рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

рдЪрд▓рд╛ Nomad рд╕рд╛рдареА рдбреЗрдЯрд╛ рдбрд┐рд░реЗрдХреНрдЯрд░реА рддрдпрд╛рд░ рдХрд░реВ рдЖрдгрд┐ рддрд┐рдЪреА рд╕рд░реНрд╡реНрд╣рд┐рд╕ рдлрд╛рдЗрд▓ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реВ (рдмрд╣реБрдзрд╛ рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рддреА рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдирд╕реЗрд▓):

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

рддрдерд╛рдкрд┐, рдЖрдореНрд╣рд╛рд▓рд╛ рднрдЯрдХреНрдпрд╛ рд▓рд╛рдБрдЪ рдХрд░рдгреНрдпрд╛рдЪреА рдШрд╛рдИ рдирд╛рд╣реА - рдЖрдореНрд╣реА рдЕрджреНрдпрд╛рдк рддреНрдпрд╛рдЪреА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реА рдирд╛рд╣реА:

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 рдирд┐рд░реНрджреЗрд╢рд╛рдЪреЗ рдореВрд▓реНрдп рдмрджрд▓рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реЗрд▓.

рдпрд╛ рдЯрдкреНрдкреНрдпрд╛рд╡рд░ рд╢реЗрд╡рдЯрдЪреА рдЧреЛрд╖реНрдЯ рдореНрд╣рдгрдЬреЗ рдкреНрд░реЙрдХреНрд╕реА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ HTTP рдЕрдзрд┐рдХреГрддрддрд╛ рд╕реЗрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА Nginx рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреЗ. 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";
        }
        
}

рдЖрддрд╛ рдЖрдореНрд╣реА рдмрд╛рд╣реНрдп рдиреЗрдЯрд╡рд░реНрдХрджреНрд╡рд╛рд░реЗ рд╡реЗрдм рдкреЕрдиреЗрд▓рдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░реВ рд╢рдХрддреЛ. рдХрдиреЗрдХреНрдЯ рдХрд░рд╛ рдЖрдгрд┐ рд╕рд░реНрд╡реНрд╣рд░ рдкреГрд╖реНрдард╛рд╡рд░ рдЬрд╛:

Consul рд╡рд╛рдкрд░реВрди Nomad рдХреНрд▓рд╕реНрдЯрд░ рд╕реЗрдЯ рдХрд░рдгреЗ рдЖрдгрд┐ Gitlab рд╕рд╣ рдПрдХрддреНрд░рд┐рдд рдХрд░рдгреЗ
рдкреНрд░рддрд┐рдорд╛ 1. рдиреЛрдореЕрдб рдХреНрд▓рд╕реНрдЯрд░рдордзреАрд▓ рд╕рд░реНрд╡реНрд╣рд░рдЪреА рдпрд╛рджреА

рдкреЕрдиреЗрд▓рдордзреНрдпреЗ рджреЛрдиреНрд╣реА рд╕рд░реНрд╡реНрд╣рд░ рдпрд╢рд╕реНрд╡реАрд░рд┐рддреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдЭрд╛рд▓реЗ рдЖрд╣реЗрдд, рдЖрдореНрд╣рд╛рд▓рд╛ рдиреЛрдореЕрдб рдиреЛрдб рд╕реНрдЯреЗрдЯрд╕ рдХрдорд╛рдВрдбрдЪреНрдпрд╛ рдЖрдЙрдЯрдкреБрдЯрдордзреНрдпреЗ рд╕рдорд╛рди рдЧреЛрд╖реНрдЯ рджрд┐рд╕реЗрд▓:

Consul рд╡рд╛рдкрд░реВрди Nomad рдХреНрд▓рд╕реНрдЯрд░ рд╕реЗрдЯ рдХрд░рдгреЗ рдЖрдгрд┐ Gitlab рд╕рд╣ рдПрдХрддреНрд░рд┐рдд рдХрд░рдгреЗ
рдкреНрд░рддрд┐рдорд╛ 2. рдиреЛрдореЕрдб рдиреЛрдб рд╕реНрдЯреЗрдЯрд╕ рдХрдорд╛рдВрдбрдЪреЗ рдЖрдЙрдЯрдкреБрдЯ

рдХреЙрдиреНрд╕реБрд▓рдЪреЗ рдХрд╛рдп? рдЪрд▓рд╛ рдПрдХ рдирдЬрд░ рдЯрд╛рдХреВрдпрд╛. рдХреЙрдиреНрд╕реБрд▓ рдХрдВрдЯреНрд░реЛрд▓ рдкреЕрдирд▓рд╡рд░ рдЬрд╛, рдиреЛрдбреНрд╕ рдкреЗрдЬрд╡рд░:
Consul рд╡рд╛рдкрд░реВрди Nomad рдХреНрд▓рд╕реНрдЯрд░ рд╕реЗрдЯ рдХрд░рдгреЗ рдЖрдгрд┐ Gitlab рд╕рд╣ рдПрдХрддреНрд░рд┐рдд рдХрд░рдгреЗ
рдкреНрд░рддрд┐рдорд╛ 3. рдХреЙрдиреНрд╕реБрд▓ рдХреНрд▓рд╕реНрдЯрд░рдордзреАрд▓ рдиреЛрдбреНрд╕рдЪреА рдпрд╛рджреА

рдЖрддрд╛ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдХрдиреНрд╕реБрд▓рдЪреНрдпрд╛ рд╕рдВрдпреЛрдЧрд╛рдиреЗ рдХрд╛рдо рдХрд░рдгрд╛рд░реЗ рдПрдХ рддрдпрд╛рд░ рднрдЯрдХреЗ рдЖрд╣реЗрдд. рдЕрдВрддрд┐рдо рдЯрдкреНрдкреНрдпрд╛рдд, рдЖрдореНрд╣реА рдордиреЛрд░рдВрдЬрдХ рднрд╛рдЧрд╛рдХрдбреЗ рдЬрд╛рдК: Gitlab рддреЗ Nomad рдкрд░реНрдпрдВрдд рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░рдЪреА рдбрд┐рд▓рд┐рд╡реНрд╣рд░реА рд╕реЗрдЯ рдХрд░рдгреЗ рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛ рдЗрддрд░ рдХрд╛рд╣реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдВрдмрджреНрджрд▓ рджреЗрдЦреАрд▓ рдмреЛрд▓рдгреЗ.

рдЧрд┐рдЯрд▓реЕрдм рд░рдирд░ рддрдпрд╛рд░ рдХрд░рдгреЗ

рдиреЛрдореЕрдбрд╡рд░ рдбреЙрдХрд░ рдкреНрд░рддрд┐рдорд╛ рддреИрдирд╛рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рдЖрддрдордзреНрдпреЗ рдиреЛрдореЕрдб рдмрд╛рдпрдирд░реА рдлрд╛рдЗрд▓рд╕рд╣ рдПрдХ рд╡реЗрдЧрд│рд╛ рд░рдирд░ рд╡рд╛рдкрд░реВ (рдпреЗрдереЗ, рддрд╕реЗ, рдЖрдореНрд╣реА рд╣реЕрд╢рд┐рдХреЙрд░реНрдк рдНрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕рдЪреЗ рдЖрдгрдЦреА рдПрдХ рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рд▓рдХреНрд╖рд╛рдд рдШреЗрдК рд╢рдХрддреЛ - рд╡реИрдпрдХреНрддрд┐рдХрд░рд┐рддреНрдпрд╛ рддреНрдпрд╛ рдПрдХрд▓ рдмрд╛рдпрдирд░реА рдлрд╛рдЗрд▓ рдЖрд╣реЗрдд). рд░рдирд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХреЗрдд рдЕрдкрд▓реЛрдб рдХрд░рд╛. рддреНрдпрд╛рд╕рд╛рдареА рдЦрд╛рд▓реАрд▓ рд╕рд╛рдордЧреНрд░реАрд╕рд╣ рдПрдХ рд╕рд╛рдзреА рдбреЙрдХрд░рдлрд╛рдЗрд▓ рддрдпрд╛рд░ рдХрд░реВрдпрд╛:


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-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

рдпреЗрдереЗ рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рдореЕрдиреНрдпреБрдЕрд▓реА рд╣реЛрддреЗ, рдкрд░рдВрддреБ рддреБрдореНрд╣реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдбрд┐рд░реЗрдХреНрдЯреНрд░реАрдЪреА рд╕рд╛рдордЧреНрд░реА рдмрджрд▓рдгреНрдпрд╛рд╕рд╛рдареА рддреЗ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░реВ рд╢рдХрддрд╛. рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдордзреНрдпреЗ рджреЛрди рдЯрдкреНрдкреЗ рдЕрд╕рддрд╛рдд: рдкреНрд░рддрд┐рдорд╛ рдЕрд╕реЗрдВрдмреНрд▓реА рдЖрдгрд┐ рднрдЯрдХреНрдпрд╛рдВрд╡рд░ рддреНрдпрд╛рдЪреА рддреИрдирд╛рддреА. рдкрд╣рд┐рд▓реНрдпрд╛ рдЯрдкреНрдкреНрдпрд╛рд╡рд░, рдЖрдореНрд╣реА рдПрдХ рдбреЙрдХрд░ рдкреНрд░рддрд┐рдорд╛ рдПрдХрддреНрд░ рдХрд░рддреЛ рдЖрдгрд┐ рддреА рдЖрдордЪреНрдпрд╛ рд░рдЬрд┐рд╕реНрдЯреНрд░реАрдордзреНрдпреЗ рдврдХрд▓рддреЛ рдЖрдгрд┐ рджреБрд╕рд▒реНрдпрд╛ рдЯрдкреНрдкреНрдпрд╛рд╡рд░ рдЖрдореНрд╣реА рдЖрдордЪреА рдиреЛрдХрд░реА рдиреЛрдореЕрдбрдордзреНрдпреЗ рд╕реБрд░реВ рдХрд░рддреЛ.

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" {}
                }
            }
        }
    }
}

рдХреГрдкрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ рдХреА рдорд╛рдЭреНрдпрд╛рдХрдбреЗ рдПрдХ рдЦрд╛рдЬрдЧреА рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдЖрд╣реЗ рдЖрдгрд┐ рдбреЙрдХрд░ рдЗрдореЗрдЬ рдпрд╢рд╕реНрд╡реАрд░рд┐рддреНрдпрд╛ рдЦреЗрдЪрдгреНрдпрд╛рд╕рд╛рдареА рдорд▓рд╛ рддреНрдпрд╛рдд рд▓реЙрдЧ рдЗрди рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд рд╕рд░реНрд╡реЛрддреНрддрдо рдЙрдкрд╛рдп рдореНрд╣рдгрдЬреЗ рд╡реНрд╣реЙрд▓реНрдЯрдордзреНрдпреЗ рд▓реЙрдЧрд┐рди рдЖрдгрд┐ рдкрд╛рд╕рд╡рд░реНрдб рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░рдгреЗ рдЖрдгрд┐ рдирдВрддрд░ рддреЗ рдиреЛрдореЕрдбрд╕рд╣ рд╕рдорд╛рдХрд▓рд┐рдд рдХрд░рдгреЗ. рднрдЯрдХреНрдпрд╛ рдореВрд│ рд╡реЙрд▓реНрдЯрд▓рд╛ рд╕рдорд░реНрдерди рджреЗрддрд╛рдд. рдкрд░рдВрддреБ рдкреНрд░рдердо, рд╡реНрд╣реЙрд▓реНрдЯрдордзреНрдпреЗрдЪ рдиреЛрдореЕрдбрд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдзреЛрд░рдгреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реВрдпрд╛; рддреНрдпрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХреЗрд▓реНрдпрд╛ рдЬрд╛рдК рд╢рдХрддрд╛рдд:

# 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

рдЖрддрд╛, рдЖрд╡рд╢реНрдпрдХ рдзреЛрд░рдгреЗ рддрдпрд╛рд░ рдХреЗрд▓реНрдпрд╛рд╡рд░, рдЖрдореНрд╣реА job.nomad рдлрд╛рдЗрд▓рдордзреАрд▓ рдЯрд╛рд╕реНрдХ рдмреНрд▓реЙрдХрдордзреНрдпреЗ рд╡реНрд╣реЙрд▓реНрдЯрд╕рд╣ рдПрдХрддреНрд░реАрдХрд░рдг рдЬреЛрдбреВ:

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

рдореА рдЯреЛрдХрдирджреНрд╡рд╛рд░реЗ рдЕрдзрд┐рдХреГрддрддрд╛ рд╡рд╛рдкрд░рддреЛ рдЖрдгрд┐ рдпреЗрдереЗ рдереЗрдЯ рдиреЛрдВрджрдгреА рдХрд░рддреЛ, рднрдЯрдХреНрдпрд╛ рдПрдЬрдВрдЯрд▓рд╛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛рдирд╛ рдЯреЛрдХрди рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рдореНрд╣рдгреВрди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкрд░реНрдпрд╛рдп рджреЗрдЦреАрд▓ рдЖрд╣реЗ:

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

рдЖрддрд╛ рдЖрдкрдг Vault рд╕рд╣ рдХреА рд╡рд╛рдкрд░реВ рд╢рдХрддреЛ. рдСрдкрд░реЗрд╢рдирдЪреЗ рддрддреНрддреНрд╡ рд╕реЛрдкреЗ рдЖрд╣реЗ: рдЖрдореНрд╣реА рдиреЛрдореЕрдб рдЬреЙрдмрдордзреНрдпреЗ рдПрдХ рдлрд╛рдЗрд▓ рддрдпрд╛рд░ рдХрд░рддреЛ рдЬреА рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдЪреА рдореВрд▓реНрдпреЗ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░реЗрд▓, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде:

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
}

рдпрд╛ рд╕реЛрдкреНрдпрд╛ рдкрдзреНрджрддреАрдиреЗ, рддреБрдореНрд╣реА рдиреЛрдореЕрдб рдХреНрд▓рд╕реНрдЯрд░рдордзреНрдпреЗ рдХрдВрдЯреЗрдирд░рдЪреА рдбрд┐рд▓рд┐рд╡реНрд╣рд░реА рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рднрд╡рд┐рд╖реНрдпрд╛рдд рддреНрдпрд╛рдЪреНрдпрд╛рд╕реЛрдмрдд рдХрд╛рдо рдХрд░реВ рд╢рдХрддрд╛. рдореА рдореНрд╣рдгреЗрди рдХреА рдХрд╛рд╣реА рдкреНрд░рдорд╛рдгрд╛рдд рдорд▓рд╛ рдиреЛрдореЕрдбрдмрджреНрджрд▓ рд╕рд╣рд╛рдиреБрднреВрддреА рдЖрд╣реЗ - рд╣реЗ рд▓рд╣рд╛рди рдкреНрд░рдХрд▓реНрдкрд╛рдВрд╕рд╛рдареА рдЕрдзрд┐рдХ рдпреЛрдЧреНрдп рдЖрд╣реЗ рдЬреЗрдереЗ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрдЯрд┐рд▓рддрд╛ рдЖрдгреВ рд╢рдХрддрд╛рдд рдЖрдгрд┐ рддреНрдпрд╛рдЪреА рдкреВрд░реНрдг рдХреНрд╖рдорддрд╛ рд▓рдХреНрд╖рд╛рдд рдШреЗрдгрд╛рд░ рдирд╛рд╣реА. рд╢рд┐рд╡рд╛рдп, рдиреЛрдореЕрдб рдирд╡рд╢рд┐рдХреНрдпрд╛рдВрд╕рд╛рдареА рдпреЛрдЧреНрдп рдЖрд╣реЗ - рддреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ рдЖрдгрд┐ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреЗ рд╕реЛрдкреЗ рдЖрд╣реЗ. рддрдерд╛рдкрд┐, рдХрд╛рд╣реА рдкреНрд░рдХрд▓реНрдкрд╛рдВрд╡рд░ рдЪрд╛рдЪрдгреА рдХрд░рддрд╛рдирд╛, рдорд▓рд╛ рддреНрдпрд╛рдЪреНрдпрд╛ рд╕реБрд░реБрд╡рд╛рддреАрдЪреНрдпрд╛ рдЖрд╡реГрддреНрддреНрдпрд╛рдВрдордзреНрдпреЗ рд╕рдорд╕реНрдпрд╛ рдпреЗрддреЗ - рдЕрдиреЗрдХ рдореВрд▓рднреВрдд рдХрд╛рд░реНрдпреЗ рддреЗрдереЗ рдирд╛рд╣реАрдд рдХрд┐рдВрд╡рд╛ рддреА рдпреЛрдЧреНрдпрд░рд┐рддреНрдпрд╛ рдХрд╛рд░реНрдп рдХрд░рдд рдирд╛рд╣реАрдд. рддрдерд╛рдкрд┐, рдорд╛рдЭрд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдЖрд╣реЗ рдХреА рднрдЯрдХреНрдпрд╛рдВрдЪрд╛ рд╡рд┐рдХрд╛рд╕ рд╣реЛрдд рд░рд╛рд╣реАрд▓ рдЖрдгрд┐ рднрд╡рд┐рд╖реНрдпрд╛рдд рддреЛ рдкреНрд░рддреНрдпреЗрдХрд╛рд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реА рдХрд╛рд░реНрдпреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрд▓.

рд▓реЗрдЦрдХ: рдЗрд▓реНрдпрд╛ рдЕрдБрдбреНрд░реАрд╡, рдЕреЕрд▓реЗрдХреНрд╕реА рдЭрд╛рджрд╛рди рдЖрдгрд┐ рд▓рд╛рдЗрд╡реНрд╣ рд▓рд┐рдирдХреНрд╕ рдЯреАрдорджреНрд╡рд╛рд░реЗ рд╕рдВрдкрд╛рджрд┐рдд


рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛