เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบธเปˆเบก Nomad เป‚เบ”เบเปƒเบŠเป‰ Consul เปเบฅเบฐเบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบเบฑเบš Gitlab

เบเบฒเบ™เบ™เปเบฒเบชเบฐเป€เบซเบ™เบต

เบšเปเปˆเบ”เบปเบ™เบกเบฒเบ™เบตเป‰, เบ„เบงเบฒเบกเบ™เบดเบเบปเบกเบ‚เบญเบ‡ Kubernetes เป„เบ”เป‰เป€เบ•เบตเบšเป‚เบ•เบขเปˆเบฒเบ‡เป„เบงเบงเบฒ - เป‚เบ„เบ‡เบเบฒเบ™เบซเบผเบฒเบเบเบงเปˆเบฒเปเบฅเบฐเบซเบผเบฒเบเบเปเบฒเบฅเบฑเบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบกเบฑเบ™. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบชเปเบฒเบœเบฑเบ”เบเบฑเบšเบ™เบฑเบเบ”เบปเบ™เบ•เบตเป€เบŠเบฑเปˆเบ™ Nomad: เบกเบฑเบ™เปเบกเปˆเบ™เบ”เบตเป€เบฅเบตเบ”เบชเปเบฒเบฅเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบ™เปเบฒเปƒเบŠเป‰เบงเบดเบ—เบตเปเบเป‰เป„เบ‚เบญเบทเปˆเบ™เป†เบˆเบฒเบ HashiCorp, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, Vault เปเบฅเบฐ Consul, เปเบฅเบฐเป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡เบšเปเปˆเบชเบฑเบšเบชเบปเบ™เปƒเบ™เบ”เป‰เบฒเบ™เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™. เป€เบญเบเบฐเบชเบฒเบ™เบ™เบตเป‰เบˆเบฐเบกเบตเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ Nomad, เบชเบปเบกเบ—เบปเบšเบชเบญเบ‡ nodes เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบเบธเปˆเบก, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบเบฒเบ™เบฅเบงเบก Nomad เบเบฑเบš Gitlab.

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบธเปˆเบก Nomad เป‚เบ”เบเปƒเบŠเป‰ Consul เปเบฅเบฐเบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบเบฑเบš Gitlab

เบขเบทเบ™เบ—เบปเบ”เบชเบญเบš

เบžเบฝเบ‡เป€เบฅเบฑเบเบ™เป‰เบญเบเบเปˆเบฝเบงเบเบฑเบš bench เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš: เบชเบฒเบกเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ virtual เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบเบฑเบšเบฅเบฑเบเบชเบฐเบ™เบฐเบ‚เบญเบ‡ 2 CPU, 4 RAM, 50 Gb SSD, united เป€เบ›เบฑเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เบ—เบปเปˆเบงเป„เบ›. เบŠเบทเปˆ เปเบฅเบฐเบ—เบตเปˆเบขเบนเปˆ 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 nomad เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบฅเบงเบกเบžเบงเบเบกเบฑเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบเบธเปˆเบก, เปเบฅเบฐเปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบ•เป‰เบญเบ‡เบเบฒเบ™เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเบเบธเปˆเบกเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ” - เบชเปเบฒเบฅเบฑเบšเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™ Consul. เบ”เป‰เบงเบเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ™เบตเป‰, เบเบฒเบ™เบชเป‰เบฒเบ‡เบเบธเปˆเบกเปเบฅเบฐเบเบฒเบ™เป€เบžเบตเปˆเบก nodes เบเบฒเบเป€เบ›เบฑเบ™เบงเบฝเบเบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบเบซเบผเบฒเบ: node Nomad เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบˆเบฐเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบ•เบปเบงเปเบ—เบ™ Consul, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบเบธเปˆเบก Nomad เบ—เบตเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบง. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เปƒเบ™เบ•เบญเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เบญเบ‡ Consul, เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ” http เบžเบทเป‰เบ™เบ–เบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฐเบ”เบฒเบ™เป€เบงเบฑเบšเป„เบŠเบ•เปŒ (เบกเบฑเบ™เบšเปเปˆเบกเบตเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปเบฅเบฐเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ—เบตเปˆเบขเบนเปˆเบžเบฒเบเบ™เบญเบ), เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบ•เบปเบงเปเบ—เบ™ Consul เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ Nomad, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป„เบ› Nomad เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™.

เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ‚เบญเบ‡ HashiCorp เปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเบซเบผเบฒเบ: เป‚เบ”เบเบžเบทเป‰เบ™เบ–เบฒเบ™เปเบฅเป‰เบง, เบžเบงเบเป€เบฎเบปเบฒเบžเบฝเบ‡เปเบ•เปˆเบเป‰เบฒเบเป„เบŸเบฅเปŒ binary เป„เบ›เบซเบฒ bin directory, เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป„เบŸเบฅเปŒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบท, เปเบฅเบฐเบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ‚เบญเบ‡เบกเบฑเบ™.

เบ”เบฒเบงเป‚เบซเบฅเบ”เป„เบŸเบฅเปŒ Consul binary เปเบฅเบฐ unpack เบกเบฑเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ home directory เบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰:

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: เบ„เบงเบฒเบกเบˆเบดเบ‡. เบžเบงเบเป€เบฎเบปเบฒเป€เบ›เบตเบ”เปƒเบŠเป‰เบเบฒเบ™เป€เบžเบตเปˆเบกเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ‚เบญเบ‡เป‚เบ™เบ”เปƒเบซเบกเปˆเบ–เป‰เบฒเบžเบงเบเป€เบ‚เบปเบฒเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ. เบ‚เป‰เบญเบเบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเป„เบ”เป‰เบŠเบตเป‰เบšเบญเบเป€เบ–เบดเบ‡เบˆเปเบฒเบ™เบงเบ™เบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™เบ‚เบญเบ‡เบ‚เปเป‰เบ—เบตเปˆเบ„เบฒเบ”เบงเปˆเบฒเบˆเบฐเบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰.
  • เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ: เบ„เบงเบฒเบกเบˆเบดเบ‡. เป€เบ›เบตเบ”เปƒเบŠเป‰เป‚เปเบ”เป€เบŠเบตเบšเป€เบงเบต. Consul เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡ virtual เบ™เบตเป‰เบˆเบฐเป€เบฎเบฑเบ”เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเปเบฅเบฐเปเบกเปˆเบšเบปเบ”เบ”เบฝเบงเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™, VM เบ‚เบญเบ‡ Nomad เบˆเบฐเป€เบ›เบฑเบ™เบฅเบนเบเบ„เป‰เบฒ.
  • เบชเบนเบ™โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™: dc1. เบฅเบฐเบšเบธเบŠเบทเปˆเบ‚เบญเบ‡เบชเบนเบ™เบ‚เปเป‰เบกเบนเบ™เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบเบธเปˆเบก. เบกเบฑเบ™เบ•เป‰เบญเบ‡เบ„เบทเบเบฑเบ™เปƒเบ™เบ—เบฑเบ‡เบฅเบนเบเบ„เป‰เบฒ เปเบฅเบฐเป€เบŠเบตเบšเป€เบงเบต.
  • เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”: เบเบฐเปเบˆเบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒ. เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™, เป€เบŠเบดเปˆเบ‡เบเบฑเบ‡เบˆเบฐเบ•เป‰เบญเบ‡เป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบเปเบฅเบฐเบเบปเบ‡เบเบฑเบšเบฅเบนเบเบ„เป‰เบฒเปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เบฑเบ‡เบซเบกเบปเบ”. เบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เป‚เบ”เบเปƒเบŠเป‰เบ„เปเบฒเบชเบฑเปˆเบ‡ 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

เป€เบ›เบตเบ”เบ•เบปเบงเบเบปเบ‡เบชเบธเบ™เบœเปˆเบฒเบ™ 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 เปเบฅเบฐเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ proxying เปเบฅเบฐเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ” 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 เบ•เบฒเบกเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ•เปเปˆเป„เบ›เบ™เบตเป‰. เบžเบงเบเป€เบฎเบปเบฒเป€เบฎเบฑเบ”เป€เบฅเบทเป‰เบกเบ„เบทเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ”เป‰เบงเบเป„เบŸเบฅเปŒ binary:

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

เบซเบผเบฑเบ‡เบˆเบฒเบ unpacking, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป„เบ”เป‰เบฎเบฑเบš Nomad binary file เบ™เป‰เปเบฒเบซเบ™เบฑเบ 65 MB - เบกเบฑเบ™เบ•เป‰เบญเบ‡เบ–เบทเบเบเป‰เบฒเบเป„เบ› /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

เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบฎเบตเบšเบฎเป‰เบญเบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบตเบ”เบ•เบปเบง 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 เบชเปเบฒเบฅเบฑเบš proxying เปเบฅเบฐเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ” 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";
        }
        
}

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบเบฐเบ”เบฒเบ™เป€เบงเบฑเบšเป„เบŠเบ•เปŒเป‚เบ”เบเบœเปˆเบฒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบžเบฒเบเบ™เบญเบ. เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ เปเบฅเบฐเป„เบ›เบ—เบตเปˆเปœเป‰เบฒเป€เบŠเบตเบšเป€เบงเบต:

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบธเปˆเบก Nomad เป‚เบ”เบเปƒเบŠเป‰ Consul เปเบฅเบฐเบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบเบฑเบš Gitlab
เบฎเบนเบšเบžเบฒเบš 1. เบฅเบฒเบเบŠเบทเปˆเป€เบŠเบตเบšเป€เบงเบตเปƒเบ™เบเบธเปˆเบก Nomad

เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เบฑเบ‡เบชเบญเบ‡เบ–เบทเบเบชเบฐเปเบ”เบ‡เบขเปˆเบฒเบ‡เบชเปเบฒเป€เบฅเบฑเบ”เบœเบปเบ™เปƒเบ™เบเบฐเบ”เบฒเบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบซเบฑเบ™เบชเบดเปˆเบ‡เบ”เบฝเบงเบเบฑเบ™เปƒเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡เบชเบฐเบ–เบฒเบ™เบฐเบžเบฒเบš nomad:

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบธเปˆเบก Nomad เป‚เบ”เบเปƒเบŠเป‰ Consul เปเบฅเบฐเบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบเบฑเบš Gitlab
เบฎเบนเบšเบžเบฒเบš 2. เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡เบชเบฐเบ–เบฒเบ™เบฐ nomad nomad

เบเบปเบ‡เบชเบธเบ™เปเบกเปˆเบ™เบซเบเบฑเบ‡? เบ‚เปเปƒเบซเป‰เป€เบšเบดเปˆเบ‡. เป„เบ›เบ—เบตเปˆเบเบฐเบ”เบฒเบ™เบ„เบงเบšเบ„เบธเบก Consul, เป„เบ›เบซเบฒเบซเบ™เป‰เบฒ nodes:
เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบธเปˆเบก Nomad เป‚เบ”เบเปƒเบŠเป‰ Consul เปเบฅเบฐเบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบเบฑเบš Gitlab
เบฎเบนเบšเบžเบฒเบš 3. เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡ nodes เปƒเบ™เบเบธเปˆเบก Consul

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบžเบงเบเป€เบฎเบปเบฒเบกเบต Nomad เบเบฐเบเบฝเบกเป€เบฎเบฑเบ”เบงเบฝเบเบฎเปˆเบงเบกเบเบฑเบ™เบเบฑเบšเบเบปเบ‡เบชเบธเบ™. เปƒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบชเบธเบ”เบ—เป‰เบฒเบ, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป„เบ›เบซเบฒเบชเปˆเบงเบ™เบ—เบตเปˆเบกเปˆเบงเบ™เบŠเบทเปˆเบ™: เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เบˆเบฑเบ”เบชเบปเปˆเบ‡เบ•เบนเป‰เบ„เบญเบ™เป€เบ—เบ™เป€เบ™เบต Docker เบˆเบฒเบ Gitlab เป„เบ› Nomad, เปเบฅเบฐเบเบฑเบ‡เป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบฅเบฑเบเบชเบฐเบ™เบฐเบ—เบตเปˆเป‚เบ”เบ”เป€เบ”เบฑเปˆเบ™เบญเบทเปˆเบ™เป†เบ‚เบญเบ‡เบกเบฑเบ™.

เบเบฒเบ™เบชเป‰เบฒเบ‡ Gitlab Runner

เป€เบžเบทเปˆเบญเบ™เปเบฒเปƒเบŠเป‰เบฎเบนเบšเบžเบฒเบš docker เบเบฑเบš Nomad, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเปƒเบŠเป‰ runner เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบ—เบตเปˆเบกเบตเป„เบŸเบฅเปŒ Nomad binary เบžเบฒเบเปƒเบ™ (เป‚เบ”เบเบงเบดเบ—เบตเบ—เบฒเบ‡เบเบฒเบ™, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบญเบทเปˆเบ™เบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ 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}

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบกเบตเบฎเบนเบšเบžเบฒเบšเบ—เบตเปˆเบกเบตเบขเบนเปˆเบ‚เบญเบ‡เบ™เบฑเบเปเบฅเปˆเบ™ Nomad เปƒเบ™ Gitlab Registry, เบ•เบญเบ™เบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป„เบ›เบซเบฒเบšเปˆเบญเบ™เป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เป‚เบ„เบ‡เบเบฒเบ™เป‚เบ”เบเบเบปเบ‡, เบชเป‰เบฒเบ‡ Pipeline เปเบฅเบฐเบเปเบฒเบซเบ™เบปเบ”เบ„เปˆเบฒเบงเบฝเบ Nomad เบ‚เบญเบ‡ 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

เบ—เบตเปˆเบ™เบตเป‰, เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป€เบเบตเบ”เบ‚เบถเป‰เบ™เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡, เปเบ•เปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ” configure เบกเบฑเบ™เบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เป€เบ™เบทเป‰เบญเปƒเบ™เบ‚เบญเบ‡เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเป‚เบ„เบ‡เบเบฒเบ™. เบ—เปเปˆเบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบชเบญเบ‡เบ‚เบฑเป‰เบ™เบ•เบญเบ™: เบเบฒเบ™เบ›เบฐเบเบญเบšเบฎเบนเบšเบžเบฒเบšเปเบฅเบฐเบเบฒเบ™เบ™เปเบฒเป„เบ›เปƒเบŠเป‰เบเบฑเบš nomad. เปƒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เปเบฒเบญเบดเบ”, เบžเบงเบเป€เบฎเบปเบฒเบ›เบฐเบเบญเบšเบฎเบนเบšเบžเบฒเบš docker เปเบฅเบฐเบเบนเป‰เบกเบฑเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ Registry เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เปเบฅเบฐเปƒเบ™เบ„เบฑเป‰เบ‡เบ—เบตเบชเบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบ›เบตเบ”เบ•เบปเบงเบงเบฝเบเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปƒเบ™ 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" {}
                }
            }
        }
    }
}

เบเบฐโ€‹เบฅเบธโ€‹เบ™เบฒโ€‹เบชเบฑเบ‡โ€‹เป€เบเบ”โ€‹เบงเปˆเบฒโ€‹เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบกเบตโ€‹เบเบฒเบ™โ€‹เบˆเบปเบ”โ€‹เบ—เบฐโ€‹เบšเบฝเบ™โ€‹เป€เบญโ€‹เบเบฐโ€‹เบŠเบปเบ™โ€‹เปเบฅเบฐโ€‹เบชเบปเบšโ€‹เบœเบปเบ™โ€‹เบชเปเบฒโ€‹เป€เบฅเบฑเบ”โ€‹เบเบฒเบ™โ€‹เบ”เบถเบ‡โ€‹เบฎเบนเบšโ€‹เบžเบฒเบš docker เป€เบ›เบฑเบ™โ€‹เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบˆเปเบฒโ€‹เป€เบ›เบฑเบ™โ€‹เบ•เป‰เบญเบ‡โ€‹เป€เบ‚เบปเป‰เบฒโ€‹เบชเบนเปˆโ€‹เบฅเบฐโ€‹เบšเบปเบšโ€‹เบกเบฑเบ™โ€‹. เบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบšเบปเบšเปเบฅเบฐเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ Vault เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบเบฑเบš Nomad. Nomad เป‚เบ”เบเบžเบทเป‰เบ™เบ–เบฒเบ™เปเบฅเป‰เบงเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ Vault. เปเบ•เปˆเบ—เปเบฒเบญเบดเบ”, เปƒเบซเป‰เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบ™เบฐเป‚เบเบšเบฒเบเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบชเปเบฒเบฅเบฑเบš Nomad เปƒเบ™ Vault เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡; เบžเบงเบเป€เบ‚เบปเบฒเบชเบฒเบกเบฒเบ”เบ”เบฒเบงเป‚เบซเบฅเบ”เป„เบ”เป‰:

# 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

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™, เป„เบ”เป‰เบชเป‰เบฒเบ‡เบ™เบฐเป‚เบเบšเบฒเบเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบžเบตเปˆเบกเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เบเบฑเบš Vault เปƒเบ™เบšเบฅเบฑเบญเบเบงเบฝเบเปƒเบ™เป„เบŸเบฅเปŒ job.nomad:

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

เบ‚เป‰เบญเบเปƒเบŠเป‰เบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”เป‚เบ”เบ token เปเบฅเบฐเบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบกเบฑเบ™เป‚เบ”เบเบเบปเบ‡เบ—เบตเปˆเบ™เบตเป‰, เบเบฑเบ‡เบกเบตเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบˆเบฐเบฅเบฐเบšเบธ token เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ›เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ•เบปเบงเปเบ—เบ™ nomad:

$ 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 เปเบฅเบฐเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบกเบฑเบ™เปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเป€เบงเบปเป‰เบฒเบงเปˆเบฒเปƒเบ™เบšเบฒเบ‡เบ‚เบญเบšเป€เบ‚เบ”เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป€เบซเบฑเบ™เบญเบปเบเป€เบซเบฑเบ™เปƒเบˆเบเบฑเบš Nomad - เบกเบฑเบ™เป€เบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบเบเบงเปˆเบฒเบ—เบตเปˆ Kubernetes เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เปƒเบซเป‰เป€เบเบตเบ”เบ„เบงเบฒเบกเบชเบฑเบšเบชเบปเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเปเบฅเบฐเบˆเบฐเบšเปเปˆเบฎเบฑเบšเบฎเบนเป‰เป€เบ–เบดเบ‡เบ—เปˆเบฒเปเบฎเบ‡เบญเบฑเบ™เป€เบ•เบฑเบกเบ—เบตเปˆเบ‚เบญเบ‡เบกเบฑเบ™. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, Nomad เปเบกเปˆเบ™เบ”เบตเป€เบฅเบตเบ”เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ - เบกเบฑเบ™เบ‡เปˆเบฒเบเบ—เบตเปˆเบˆเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡เปเบฅเบฐเบ•เบฑเป‰เบ‡เบ„เปˆเบฒ. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเปƒเบ™เบšเบฒเบ‡เป‚เบ„เบ‡เบเบฒเบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบžเบปเบšเบšเบฑเบ™เบซเบฒเบเบฑเบšเบชเบฐเบšเบฑเบšเบ•เบปเป‰เบ™เบ‚เบญเบ‡เบกเบฑเบ™ - เบซเบ™เป‰เบฒเบ—เบตเปˆเบžเบทเป‰เบ™เบ–เบฒเบ™เบซเบผเบฒเบเบžเบฝเบ‡เปเบ•เปˆเบšเปเปˆเบกเบตเบซเบผเบทเบžเบงเบเบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป€เบŠเบทเปˆเบญเบงเปˆเบฒ Nomad เบˆเบฐเบชเบทเบšเบ•เปเปˆเบžเบฑเบ”เบ—เบฐเบ™เบฒเปเบฅเบฐเปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”เบกเบฑเบ™เบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบซเบ™เป‰เบฒเบ—เบตเปˆเบ—เบตเปˆเบ—เบธเบเบ„เบปเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™.

เบœเบนเป‰เบ‚เบฝเบ™: Ilya Andreev, เปเบเป‰เป„เบ‚เป‚เบ”เบ Alexey Zhadan เปเบฅเบฐเบ—เบตเบกเบ‡เบฒเบ™ Live Linux


เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™