рдХрдиреНрд╕реБрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдШреБрдордиреНрддреЗ рдХреНрд▓рд╕реНрдЯрд░ рд╕реЗрдЯрдЕрдк рдЧрд░реНрджреИ рд░ Gitlab рд╕рдБрдЧ рдПрдХреАрдХрд░рдг рдЧрд░реНрджреИ

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

рд╣рд╛рд▓реИ, Kubernetes рдХреЛ рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдЫрд┐рдЯреЛ рдмрдвреНрджреИ рдЧрдПрдХреЛ рдЫ - рдЕрдзрд┐рдХ рд░ рдЕрдзрд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реБ рдпрд╕рд▓рд╛рдИ рд▓рд╛рдЧреВ рдЧрд░реНрджреИ рдЫрдиреНред рдо Nomad рдЬрд╕реНрддреИ рдЕрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрдЯрд░рд▓рд╛рдИ рдЫреБрди рдЪрд╛рд╣рдиреНрдЫреБ: рдпреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ рдЙрдкрдпреБрдХреНрдд рдЫ рдЬреБрди рдкрд╣рд┐рд▓реЗ рдиреИ HashiCorp рдмрд╛рдЯ рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рдирд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, Vault рд░ Consul, рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВ рдЖрдлреИрдВрдорд╛ рдкреВрд░реНрд╡рд╛рдзрд╛рд░рдХреЛ рд╣рд┐рд╕рд╛рдмрд▓реЗ рдЬрдЯрд┐рд▓ рдЫреИрдирдиреНред рдпреЛ рд╕рд╛рдордЧреНрд░реАрд▓реЗ Nomad рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди, рджреБрдИ рдиреЛрдбрд╣рд░реВрд▓рд╛рдИ рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рд╕рдВрдпреЛрдЬрди рдЧрд░реНрдиреЗ, рд╕рд╛рдереИ Gitlab рд╕рдБрдЧ 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

Nomad, Consul рдХреЛ рд╕реНрдерд╛рдкрдирд╛ред рдШреБрдордиреНрддреЗ рдХреНрд▓рд╕реНрдЯрд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджреИ

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

рд╣рд╛рдореАрд▓реЗ рдЕрднреНрдпрд╛рд╕ рд╕реБрд░реБ рдЧрд░реНрдиреБ рдЕрдШрд┐, рд╣рд╛рдореА рд╕реИрджреНрдзрд╛рдиреНрддрд┐рдХ рднрд╛рдЧрдорд╛ рдЫрд▓рдлрд▓ рдЧрд░реНрдиреЗрдЫреМрдВ, рдХрд┐рдирднрдиреЗ рдпрд╕ рдЪрд░рдгрдорд╛ рднрд╡рд┐рд╖реНрдпрдХреЛ рд╕рдВрд░рдЪрдирд╛ рдмреБрдЭреНрди рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЫред

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

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/

рдЕрдм рд╣рд╛рдореАрд╕рдБрдЧ рдердк рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдХреЛ рд▓рд╛рдЧрд┐ рддрдпрд╛рд░ рдХрдиреНрд╕реБрд▓ рдмрд╛рдЗрдирд░реА рдЫред

рдХрдиреНрд╕реБрд▓рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди, рд╣рд╛рдореАрд▓реЗ keygen рдЖрджреЗрд╢ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдПрдЙрдЯрд╛ рдЕрджреНрд╡рд┐рддреАрдп рдХреБрдЮреНрдЬреА рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ:

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

рдирд┐рдореНрди рд╕рдВрд░рдЪрдирд╛рдХреЛ рд╕рд╛рде /etc/consul.d/ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реА рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджреИ рдХрдиреНрд╕реБрд▓ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд╕реЗрдЯрдЕрдк рдЧрд░реНрди рдЕрдЧрд╛рдбрд┐ рдмрдвреМрдВ:

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

рдореБрдЦреНрдп рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВ рд░ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдЕрд░реНрдерд▓рд╛рдИ рдЫреБрдЯреНрдЯреИ рд╣реЗрд░реМрдВ:

  • рдмреБрдЯрд╕реНрдЯреНрд░реНрдпрд╛рдк: рд╕рддреНрдпред рд╣рд╛рдореА рдирдпрд╛рдБ рдиреЛрдбрд╣рд░реВ рдЬрдбрд╛рди рднрдПрдХрд╛ рдЦрдгреНрдбрдорд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдердкреНрдиреЗ рд╕рдХреНрд╖рдо рдЧрд░реНрдЫреМрдВред рдо рдиреЛрдЯ рдЧрд░реНрдЫреБ рдХрд┐ рд╣рд╛рдореА рдпрд╣рд╛рдБ рдЕрдкреЗрдХреНрд╖рд┐рдд рдиреЛрдбрд╣рд░реВрдХреЛ рд╕рд╣реА рд╕рдВрдЦреНрдпрд╛ рд╕рдВрдХреЗрдд рдЧрд░реНрджреИрдиреМрдВред
  • рд╕рд░реНрднрд░: рд╕рддреНрдпред рд╕рд░реНрднрд░ рдореЛрдб рд╕рдХреНрд╖рдо рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдпрд╕ рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рдирдорд╛ рдХрдиреНрд╕реБрд▓рд▓реЗ рдорд╛рддреНрд░ рд╕рд░реНрднрд░ рд░ рдорд╛рд╕реНрдЯрд░рдХреЛ рд░реВрдкрдорд╛ рдХрд╛рдо рдЧрд░реНрдиреЗрдЫ, Nomad's VM рдЧреНрд░рд╛рд╣рдХрд╣рд░реВ рд╣реБрдиреЗрдЫрдиреНред
  • рдбреЗрдЯрд╛рд╕реЗрдЯ: 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 рдорд╛ рд╣рд╛рдореНрд░реЛ рдЖрд╡реЗрджрди рддреИрдирд╛рдд рдЧрд░реНрди рд╕рдХреНрд╖рдо рд╣реБрдиреЗрдЫреИрдиреМрдВред рдореЗрд░реЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯрдорд╛, 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 рд╕реНрдерд╛рдкрдирд╛ рд░ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рд╕реБрд░реБ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВред

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

рдЕрдирдкреНрдпрд╛рдХ рдЧрд░реЗрдкрдЫрд┐, рд╣рд╛рдореАрд▓реЗ 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";
        }
        
}

рдЕрдм рд╣рд╛рдореА рдмрд╛рд╣реНрдп рдиреЗрдЯрд╡рд░реНрдХ рдорд╛рд░реНрдлрдд рд╡реЗрдм рдкреНрдпрд╛рдирд▓ рдкрд╣реБрдБрдЪ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВред рдЬрдбрд╛рди рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рд╕рд░реНрднрд░ рдкреГрд╖реНрдардорд╛ рдЬрд╛рдиреБрд╣реЛрд╕реН:

рдХрдиреНрд╕реБрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдШреБрдордиреНрддреЗ рдХреНрд▓рд╕реНрдЯрд░ рд╕реЗрдЯрдЕрдк рдЧрд░реНрджреИ рд░ Gitlab рд╕рдБрдЧ рдПрдХреАрдХрд░рдг рдЧрд░реНрджреИ
рдЫрд╡рд┐ резред Nomad рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рд╕рд░реНрднрд░рд╣рд░реВрдХреЛ рд╕реВрдЪреА

рджреБрдмреИ рд╕рд░реНрднрд░рд╣рд░реВ рдкреНрдпрд╛рдирд▓рдорд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реБрдиреНрдЫрдиреН, рд╣рд╛рдореА рдШреБрдордиреНрддреЗ рдиреЛрдб рд╕реНрдерд┐рддрд┐ рдЖрджреЗрд╢рдХреЛ рдЖрдЙрдЯрдкреБрдЯрдорд╛ рдПрдЙрдЯреИ рдХреБрд░рд╛ рджреЗрдЦреНрдиреЗрдЫреМрдВ:

рдХрдиреНрд╕реБрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдШреБрдордиреНрддреЗ рдХреНрд▓рд╕реНрдЯрд░ рд╕реЗрдЯрдЕрдк рдЧрд░реНрджреИ рд░ Gitlab рд╕рдБрдЧ рдПрдХреАрдХрд░рдг рдЧрд░реНрджреИ
рдЫрд╡рд┐ резред рдШреБрдордиреНрддреЗ рдиреЛрдб рд╕реНрдерд┐рддрд┐ рдЖрджреЗрд╢рдХреЛ рдЖрдЙрдЯрдкреБрдЯ

рдХрдиреНрд╕реБрд▓рдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреЗ рд╣реЛ? рд╣реЗрд░реМрдВред рдХрдиреНрд╕реБрд▓ рдХрдиреНрдЯреНрд░реЛрд▓ рдкреНрдпрд╛рдирд▓рдорд╛ рдЬрд╛рдиреБрд╣реЛрд╕реН, рдиреЛрдбреНрд╕ рдкреГрд╖реНрдардорд╛:
рдХрдиреНрд╕реБрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдШреБрдордиреНрддреЗ рдХреНрд▓рд╕реНрдЯрд░ рд╕реЗрдЯрдЕрдк рдЧрд░реНрджреИ рд░ Gitlab рд╕рдБрдЧ рдПрдХреАрдХрд░рдг рдЧрд░реНрджреИ
рдЫрд╡рд┐ резред рдХрдиреНрд╕реБрд▓ рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рдиреЛрдбрд╣рд░реВрдХреЛ рд╕реВрдЪреА

рдЕрдм рд╣рд╛рдореАрд╕рдБрдЧ рдХрдиреНрд╕реБрд▓рд╕рдБрдЧ рдорд┐рд▓реЗрд░ рдХрд╛рдо рдЧрд░реНрдиреЗ рддрдпрд╛рд░реА рдЧрд░рд┐рдПрдХреЛ рдШреБрдордиреНрддреЗ рдЫред рдЕрдиреНрддрд┐рдо рдЪрд░рдгрдорд╛, рд╣рд╛рдореА рд░рдорд╛рдЗрд▓реЛ рднрд╛рдЧрдорд╛ рдкреБрдЧреНрдиреЗрдЫреМрдВ: рдЧрд┐рдЯрд▓реНрдпрд╛рдмрдмрд╛рдЯ рдиреЛрдорд╛рдбрд╕рдореНрдо рдбрдХрд░ рдХрдиреНрдЯреЗрдирд░рд╣рд░реВрдХреЛ рдбреЗрд▓рд┐рднрд░реА рд╕реЗрдЯрдЕрдк рдЧрд░реНрдиреЗ, рд░ рдпрд╕рдХрд╛ рдЕрдиреНрдп рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдкрдирд┐ рдХреБрд░рд╛ рдЧрд░реНрджреИред

Gitlab рдзрд╛рд╡рдХ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджреИ

Nomad рдорд╛ рдбрдХрд░ рдЫрд╡рд┐рд╣рд░реВ рддреИрдирд╛рдд рдЧрд░реНрди, рд╣рд╛рдореА рднрд┐рддреНрд░ Nomad рдмрд╛рдЗрдирд░реА рдлрд╛рдЗрд▓рдХреЛ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рдзрд╛рд╡рдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ (рдпрд╣рд╛рдБ, рд╡реИрд╕реЗ, рд╣рд╛рдореА Hashicorp рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдХреЛ рдЕрд░реНрдХреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдиреЛрдЯ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ - рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдкрдорд╛ рддрд┐рдиреАрд╣рд░реВ рдПрдХрд▓ рдмрд╛рдЗрдирд░реА рдлрд╛рдЗрд▓ рд╣реБрдиреН)ред рдпрд╕рд▓рд╛рдИ рд░рдирд░ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрдорд╛ рдЕрдкрд▓реЛрдб рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░реАрдХреЛ рд╕рд╛рде рдпрд╕рдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдбрдХрд░рдлрд╛рдЗрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реМрдВ:


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}

рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рд╣рд╛рдореАрд╕рдБрдЧ рдЧрд┐рдЯрд▓реНрдпрд╛рдм рд░рдЬрд┐рд╕реНрдЯреНрд░реАрдорд╛ рдШреБрдордиреНрддреЗ рдзрд╛рд╡рдХрдХреЛ рдЫрд╡рд┐ рдЙрдкрд▓рдмреНрдз рд╣реБрдиреЗрдЫ, рдЕрдм рд╣рд╛рдореА рд╕рд┐рдзреИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рднрдгреНрдбрд╛рд░рдорд╛ рдЬрд╛рди рд╕рдХреНрдЫреМрдВ, рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рд░ Nomad рдХреЛ рдШреБрдордиреНрддреЗ рдХрд╛рдо рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВред

рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗрдЯрдЕрдк

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

рдпрд╣рд╛рдБ рддреИрдирд╛рддреА рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рд╣реБрдиреНрдЫ, рддрд░ рддрдкрд╛рдЗрдБ рдпрд╕рд▓рд╛рдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрдХреЛ рд╕рд╛рдордЧреНрд░реА рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдорд╛ рджреБрдИ рдЪрд░рдгрд╣рд░реВ рд╣реБрдиреНрдЫрдиреН: рдЫрд╡рд┐ рдЕрд╕реЗрдВрдмрд▓реА рд░ рдШреБрдордиреНрддреЗрдорд╛ рдпрд╕рдХреЛ рддреИрдирд╛рддреАред рдкрд╣рд┐рд▓реЛ рдЪрд░рдгрдорд╛, рд╣рд╛рдореА рдПрдХ рдбрдХрд░ рдЫрд╡рд┐ рдЬрдореНрдорд╛ рдЧрд░реНрдЫреМрдВ рд░ рдпрд╕рд▓рд╛рдИ рд╣рд╛рдореНрд░реЛ рд░рдЬрд┐рд╕реНрдЯреНрд░реАрдорд╛ рдзрдХреЗрд▓реНрдЫреМрдВ, рд░ рджреЛрд╕реНрд░реЛрдорд╛ рд╣рд╛рдореА 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" {}
                }
            }
        }
    }
}

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджрд┐рдиреБрд╣реЛрд╕реН рдХрд┐ рдорд╕рдБрдЧ рдПрдХ рдирд┐рдЬреА рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдЫ рд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдПрдХ рдбрдХрд░ рдЫрд╡рд┐ рддрд╛рдиреНрди рдореИрд▓реЗ рдпрд╕рдорд╛ рд▓рдЧ рдЗрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдпрд╕ рдорд╛рдорд▓рд╛ рдорд╛ рд╕рдмреИ рднрдиреНрджрд╛ рд░рд╛рдореНрд░реЛ рд╕рдорд╛рдзрд╛рди рднрд▓реНрдЯ рдорд╛ рд▓рдЧрдЗрди рд░ рдкрд╛рд╕рд╡рд░реНрдб рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реНрди рд░ рддреНрдпрд╕рдкрдЫрд┐ Nomad рд╕рдВрдЧ рдПрдХреАрдХреГрдд рдЫред Nomad рдиреЗрдЯрд┐рднрд▓реЗ рднрд▓реНрдЯрд▓рд╛рдИ рд╕рдорд░реНрдерди рдЧрд░реНрджрдЫред рддрд░ рдкрд╣рд┐рд▓реЗ, рднреЛрд▓реНрдЯрдорд╛ 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

рдЕрдм, рдЖрд╡рд╢реНрдпрдХ рдиреАрддрд┐рд╣рд░реВ рдмрдирд╛рдПрдкрдЫрд┐, рд╣рд╛рдореА job.nomad рдлрд╛рдЗрд▓рдорд╛ рдЯрд╛рд╕реНрдХ рдмреНрд▓рдХрдорд╛ рднрд▓реНрдЯрд╕рдБрдЧ рдПрдХреАрдХрд░рдг рдердкреНрдиреЗрдЫреМрдВ:

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

рдо рдЯреЛрдХрди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫреБ рд░ рдпрд╕рд▓рд╛рдИ рд╕рд┐рдзреИ рдпрд╣рд╛рдБ рджрд░реНрддрд╛ рдЧрд░реНрджрдЫреБ, рддреНрдпрд╣рд╛рдБ рдШреБрдордиреНрддреЗ рдПрдЬреЗрдиреНрдЯ рд╕реБрд░реБ рдЧрд░реНрджрд╛ рдЯреЛрдХрдирд▓рд╛рдИ рдЪрд░рдХреЛ рд░реВрдкрдорд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрдиреЗ рд╡рд┐рдХрд▓реНрдк рдкрдирд┐ рдЫ:

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

рдЕрдм рд╣рд╛рдореА Vault рд╕рдБрдЧ рдХреБрдЮреНрдЬреАрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВред рд╕рдЮреНрдЪрд╛рд▓рдирдХреЛ рд╕рд┐рджреНрдзрд╛рдиреНрдд рд╕рд░рд▓ рдЫ: рд╣рд╛рдореА Nomad рдХрд╛рд░реНрдпрдорд╛ рдПрдЙрдЯрд╛ рдлрд╛рдЗрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдЫреМрдВ рдЬрд╕рд▓реЗ рдЪрд░рд╣рд░реВрдХреЛ рдорд╛рдирд╣рд░реВ рднрдгреНрдбрд╛рд░ рдЧрд░реНрдиреЗрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐:

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 рд╕рдБрдЧ рд╕рд╣рд╛рдиреБрднреВрддрд┐ рд░рд╛рдЦреНрдЫреБ - рдпреЛ рд╕рд╛рдирд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реБ рдХреЛ рд▓рд╛рдЧреА рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рдЫ рдЬрд╣рд╛рдБ Kubernetes рд▓реЗ рдердк рдЬрдЯрд┐рд▓рддрд╛ рдирд┐рдореНрддреНрдпрд╛рдЙрди рд╕рдХреНрдЫ рд░ рдпрд╕рдХреЛ рдкреВрд░реНрдг рдХреНрд╖рдорддрд╛ рдорд╣рд╕реБрд╕ рдЧрд░реНрджреИрдиред рд╕рд╛рдереИ, Nomad рд╢реБрд░реБрд╡рд╛рддрдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЙрдкрдпреБрдХреНрдд рдЫ - рдпреЛ рд╕реНрдерд╛рдкрдирд╛ рд░ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рд╕рдЬрд┐рд▓реЛ рдЫред рдпрджреНрдпрдкрд┐, рдХреЗрд╣реА рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдорд╛ рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрджрд╛, рдореИрд▓реЗ рдпрд╕рдХреЛ рдкреНрд░рд╛рд░рдореНрднрд┐рдХ рд╕рдВрд╕реНрдХрд░рдгрд╣рд░реВрдорд╛ рд╕рдорд╕реНрдпрд╛рдХреЛ рд╕рд╛рдордирд╛ рдЧрд░реНрдЫреБ - рдзреЗрд░реИ рдЖрдзрд╛рд░рднреВрдд рдХрд╛рд░реНрдпрд╣рд░реВ рддреНрдпрд╣рд╛рдБ рдЫреИрдирдиреН рд╡рд╛ рддрд┐рдиреАрд╣рд░реВрд▓реЗ рд╕рд╣реА рд░реВрдкрдорд╛ рдХрд╛рдо рдЧрд░реНрджреИрдирдиреНред рдпрджреНрдпрдкрд┐, рдо рд╡рд┐рд╢реНрд╡рд╛рд╕ рдЧрд░реНрдЫреБ рдХрд┐ Nomad рд╡рд┐рдХрд╛рд╕ рдЬрд╛рд░реА рд░рд╣рдиреЗрдЫ рд░ рднрд╡рд┐рд╖реНрдпрдорд╛ рдпрд╕рд▓реЗ рд╕рдмреИрд▓рд╛рдИ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрдиреЗ рдХрд╛рд░реНрдпрд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗрдЫред

рд▓реЗрдЦрдХ: рдЗрд▓реНрдпрд╛ рдПрдиреНрдбреНрд░реАрдн, рдПрд▓реЗрдХреНрд╕реА рдЭрд╛рджрд╛рди рд░ рд▓рд╛рдЗрдн рд▓рд┐рдирдХреНрд╕ рдЯреЛрд▓реА рджреНрд╡рд╛рд░рд╛ рд╕рдореНрдкрд╛рджрди


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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди