ื”ืงืžืช ืืฉื›ื•ืœ Nomad ื‘ืืžืฆืขื•ืช Consul ื•ืฉื™ืœื•ื‘ ืขื Gitlab

ืžื‘ื•ื

ืœืื—ืจื•ื ื”, ื”ืคื•ืคื•ืœืจื™ื•ืช ืฉืœ Kubernetes ื’ื“ืœื” ื‘ืžื”ื™ืจื•ืช - ื™ื•ืชืจ ื•ื™ื•ืชืจ ืคืจื•ื™ืงื˜ื™ื ืžื™ื™ืฉืžื™ื ืื•ืชื”. ืจืฆื™ืชื™ ืœื’ืขืช ื‘ืžืชื–ืžืจ ื›ืžื• Nomad: ื”ื•ื ืžื•ืฉืœื ืœืคืจื•ื™ืงื˜ื™ื ืฉื›ื‘ืจ ืžืฉืชืžืฉื™ื ื‘ืคืชืจื•ื ื•ืช ืื—ืจื™ื ืฉืœ HashiCorp, ืœืžืฉืœ, Vault ื•-Consul, ื•ื”ืคืจื•ื™ืงื˜ื™ื ืขืฆืžื ืื™ื ื ืžื•ืจื›ื‘ื™ื ืžื‘ื—ื™ื ืช ืชืฉืชื™ืช. ื—ื•ืžืจ ื–ื” ื™ื›ื™ืœ ื”ื•ืจืื•ืช ืœื”ืชืงื ืช Nomad, ืฉื™ืœื•ื‘ ืฉื ื™ ืฆืžืชื™ื ืœืืฉื›ื•ืœ, ื•ื›ืŸ ืฉื™ืœื•ื‘ ืฉืœ Nomad ืขื Gitlab.

ื”ืงืžืช ืืฉื›ื•ืœ Nomad ื‘ืืžืฆืขื•ืช Consul ื•ืฉื™ืœื•ื‘ ืขื Gitlab

ืขืžื“ืช ืžื‘ื—ืŸ

ืงืฆืช ืขืœ ืกืคืกืœ ื”ื‘ื“ื™ืงื”: ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘ืฉืœื•ืฉื” ืฉืจืชื™ื ื•ื™ืจื˜ื•ืืœื™ื™ื ืขื ืžืืคื™ื™ื ื™ื ืฉืœ 2 ืžืขื‘ื“ื™ื, 4 ื–ื™ื›ืจื•ืŸ RAM, 50 ื’'ื™ื’ื”-ื‘ื™ื™ื˜ 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

ื”ืชืงื ื” ืฉืœ ื ื•ืžื“, ืงื•ื ืกื•ืœ. ื™ืฆื™ืจืช ืืฉื›ื•ืœ ื ื•ื•ื“ื™ื

ื ืชื—ื™ืœ ืขื ื”ื”ืชืงื ื” ื”ื‘ืกื™ืกื™ืช. ืœืžืจื•ืช ืฉื”ื”ื’ื“ืจื” ื”ื™ื™ืชื” ืคืฉื•ื˜ื”, ืืชืืจ ืื•ืชื” ืœืžืขืŸ ืฉืœืžื•ืช ื”ืžืืžืจ: ื”ื™ื ื ื•ืฆืจื” ื‘ืขืฆื ืžื˜ื™ื•ื˜ื•ืช ื•ื”ืขืจื•ืช ืœื’ื™ืฉื” ืžื”ื™ืจื” ื‘ืขืช ื”ืฆื•ืจืš.

ืœืคื ื™ ืฉื ืชื—ื™ืœ ื‘ืชืจื’ื•ืœ, ื ื“ื•ืŸ ื‘ื—ืœืง ื”ืชื™ืื•ืจื˜ื™, ื›ื™ ื‘ืฉืœื‘ ื–ื” ื—ืฉื•ื‘ ืœื”ื‘ื™ืŸ ืืช ื”ืžื‘ื ื” ื”ืขืชื™ื“ื™.

ื™ืฉ ืœื ื• ืฉื ื™ ืฆืžืชื™ื ื ื•ื•ื“ื™ื ื•ืื ื—ื ื• ืจื•ืฆื™ื ืœืฉืœื‘ ืื•ืชื ืœืืฉื›ื•ืœ, ื•ื‘ืขืชื™ื“ ื ืฆื˜ืจืš ื’ื ืงื ื” ืžื™ื“ื” ืื•ื˜ื•ืžื˜ื™ ืฉืœ ืืฉื›ื•ืœื•ืช - ื‘ืฉื‘ื™ืœ ื–ื” ื ื–ื“ืงืง ืœืงื•ื ืกื•ืœ. ื‘ืขื–ืจืช ื”ื›ืœื™ ื”ื–ื”, clustering ื•ื”ื•ืกืคื” ืฉืœ ืฆืžืชื™ื ื—ื“ืฉื™ื ื”ื•ืคื›ื™ื ืœืžืฉื™ืžื” ืคืฉื•ื˜ื” ืžืื•ื“: ื”-Nomad ืฉื ื•ืฆืจ ืžืชื—ื‘ืจ ืœืกื•ื›ืŸ ื”-Consul, ื•ืœืื—ืจ ืžื›ืŸ ืžืชื—ื‘ืจ ืœืืฉื›ื•ืœ Nomad ื”ืงื™ื™ื. ืœื›ืŸ, ื‘ื”ืชื—ืœื” ื ืชืงื™ืŸ ืืช ืฉืจืช ื”-Consul, ื ืชืงื™ืŸ ื”ืจืฉืืช http ื‘ืกื™ืกื™ ืœืคืื ืœ ื”ืื™ื ื˜ืจื ื˜ (ื”ื•ื ืœืœื ื”ืจืฉืื” ื›ื‘ืจื™ืจืช ืžื—ื“ืœ ื•ื ื™ืชืŸ ืœื’ืฉืช ืืœื™ื• ื‘ื›ืชื•ื‘ืช ื—ื™ืฆื•ื ื™ืช), ื•ื›ืŸ ืืช ืกื•ื›ื ื™ ื”ืงื•ื ืกื•ืœ ืขืฆืžื ื‘ืฉืจืชื™ Nomad, ืœืื—ืจ ืžื›ืŸ ื ืžืฉื™ืš ืจืง ืœื ื•ืžืื“.

ื”ืชืงื ืช ื”ื›ืœื™ื ืฉืœ HashiCorp ื”ื™ื ืคืฉื•ื˜ื” ืžืื•ื“: ื‘ืขืฆื, ืื ื—ื ื• ืคืฉื•ื˜ ืžืขื‘ื™ืจื™ื ืืช ื”ืงื•ื‘ืฅ ื”ื‘ื™ื ืืจื™ ืœืกืคืจื™ื™ืช bin, ืžื’ื“ื™ืจื™ื ืืช ืงื•ื‘ืฅ ื”ืชืฆื•ืจื” ืฉืœ ื”ื›ืœื™ ื•ื™ื•ืฆืจื™ื ืืช ืงื•ื‘ืฅ ื”ืฉื™ืจื•ืช ืฉืœื•.

ื”ื•ืจื“ ืืช ื”ืงื•ื‘ืฅ ื”ื‘ื™ื ืืจื™ ืฉืœ ืงื•ื ืกื•ืœ ื•ืคืจืง ืื•ืชื• ืœืกืคืจื™ื™ืช ื”ื‘ื™ืช ืฉืœ ื”ืžืฉืชืžืฉ:

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

ืกืคืจื™ื™ืช ื”-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"]
}

ื”ื‘ื” ื ืกืชื›ืœ ืขืœ ื”ื”ื ื—ื™ื•ืช ื”ืขื™ืงืจื™ื•ืช ื•ืžืฉืžืขื•ื™ื•ืชื™ื”ืŸ ื‘ื ืคืจื“:

  • ืึนื–ึถืŸ ื”ึทื ึทืขึทืœ: ื ื›ื•ืŸ. ืื ื• ืžืืคืฉืจื™ื ื”ื•ืกืคื” ืื•ื˜ื•ืžื˜ื™ืช ืฉืœ ืฆืžืชื™ื ื—ื“ืฉื™ื ืื ื”ื ืžื—ื•ื‘ืจื™ื. ืืฆื™ื™ืŸ ืฉืื™ื ื ื• ืžืฆื™ื™ื ื™ื ื›ืืŸ ืืช ื”ืžืกืคืจ ื”ืžื“ื•ื™ืง ืฉืœ ื”ืฆืžืชื™ื ื”ืฆืคื•ื™ื™ื.
  • ืฉืจืช: ื ื›ื•ืŸ. ืืคืฉืจ ืžืฆื‘ ืฉืจืช. ืงื•ื ืกื•ืœ ื‘ืžื›ื•ื ื” ื”ื•ื™ืจื˜ื•ืืœื™ืช ื”ื–ื• ื™ืฉืžืฉ ื›ืฉืจืช ื•ื”ืžืืกื˜ืจ ื”ื™ื—ื™ื“ ื›ืจื’ืข, ื”-VM ืฉืœ Nomad ื™ื”ื™ื” ื”ืœืงื•ื—ื•ืช.
  • ืžืจื›ื– ื”ื ืชื•ื ื™ื: dc1. ืฆื™ื™ืŸ ืืช ืฉื ืžืจื›ื– ื”ื ืชื•ื ื™ื ืœื™ืฆื™ืจืช ื”ืืฉื›ื•ืœ. ื–ื” ื—ื™ื™ื‘ ืœื”ื™ื•ืช ื–ื”ื” ื’ื ื‘ืœืงื•ื—ื•ืช ื•ื’ื ื‘ืฉืจืชื™ื.
  • ืœื”ืฆืคื™ืŸ: ื”ืžืคืชื— ืฉืœืš. ื”ืžืคืชื—, ืฉื—ื™ื™ื‘ ืœื”ื™ื•ืช ื’ื ื™ื™ื—ื•ื“ื™ ื•ืœื”ืชืื™ื ื‘ื›ืœ ื”ืœืงื•ื—ื•ืช ื•ื”ืฉืจืชื™ื. ื ื•ืฆืจ ื‘ืืžืฆืขื•ืช ื”ืคืงื•ื“ื” consul keygen.
  • ื”ืชื—ืœ_ืœื”ืฆื˜ืจืฃ. ื‘ืจืฉื™ืžื” ื–ื• ืื ื• ืžืฆื™ื™ื ื™ื ืจืฉื™ืžื” ืฉืœ ื›ืชื•ื‘ื•ืช IP ืืœื™ื”ืŸ ื™ืชื‘ืฆืข ื”ื—ื™ื‘ื•ืจ. ื›ืจื’ืข ืื ื—ื ื• ืžืฉืื™ืจื™ื ืจืง ื›ืชื•ื‘ืช ืžืฉืœื ื•.

ื‘ืฉืœื‘ ื–ื” ื ื•ื›ืœ ืœื”ืคืขื™ืœ ืืช ืงื•ื ืกื•ืœ ื‘ืืžืฆืขื•ืช ืฉื•ืจืช ื”ืคืงื•ื“ื”:

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

ื–ื•ื”ื™ ื“ืจืš ื˜ื•ื‘ื” ืœื ืคื•ืช ื‘ืื’ื™ื ื›ืขืช, ืขื ื–ืืช, ืœื ืชื•ื›ืœ ืœื”ืฉืชืžืฉ ื‘ืฉื™ื˜ื” ื–ื• ืขืœ ื‘ืกื™ืก ืžืชืžืฉืš ืžืกื™ื‘ื•ืช ื‘ืจื•ืจื•ืช. ื‘ื•ืื• ื ื™ืฆื•ืจ ืงื•ื‘ืฅ ืฉื™ืจื•ืช ืœื ื™ื”ื•ืœ Consul ื‘ืืžืฆืขื•ืช systemd:

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

ืชื•ื›ืŸ ืงื•ื‘ืฅ consul.service:

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

ื”ืคืขืœ ืืช Consul ื“ืจืš systemctl:

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

ื‘ื•ืื• ื ื‘ื“ื•ืง: ื”ืฉื™ืจื•ืช ืฉืœื ื• ื—ื™ื™ื‘ ืœืคืขื•ืœ, ื•ืขืœ ื™ื“ื™ ื‘ื™ืฆื•ืข ื”ืคืงื•ื“ื” ืฉืœ ื—ื‘ืจื™ ื”ืงื•ื ืกื•ืœ ืขืœื™ื ื• ืœืจืื•ืช ืืช ื”ืฉืจืช ืฉืœื ื•:

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, ื ืฆื˜ืจืš ืœื ื˜ื•ืฉ ื–ืืช - ืื—ืจืช ืœื ื ื•ื›ืœ ืœืคืจื•ืก ืืช ื”ืืคืœื™ืงืฆื™ื” ืฉืœื ื• ืœื ื•ืžื“. ื‘ืคืจื•ื™ืงื˜ ืฉืœื™, ื’ื Gitlab ื•ื’ื Nomad ื ืžืฆืื™ื ืจืง ื‘ืจืฉืช ื”ืืคื•ืจื”, ื›ืš ืฉืื™ืŸ ื›ืืŸ ื‘ืขื™ื” ื›ื–ื•.

ื‘ืฉื ื™ ื”ืฉืจืชื™ื ื”ื ื•ืชืจื™ื ืื ื• ืžืชืงื™ื ื™ื ืกื•ื›ื ื™ Consul ืœืคื™ ื”ื”ื•ืจืื•ืช ื”ื‘ืื•ืช. ืื ื• ื—ื•ื–ืจื™ื ืขืœ ื”ืฉืœื‘ื™ื ืขื ื”ืงื•ื‘ืฅ ื”ื‘ื™ื ืืจื™:

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

ื‘ืื ืœื•ื’ื™ื” ืœืฉืจืช ื”ืงื•ื“ื, ืื ื• ื™ื•ืฆืจื™ื ืกืคืจื™ื™ื” ืขื‘ื•ืจ ืงื‘ืฆื™ ืชืฆื•ืจื” /etc/consul.d ืขื ื”ืžื‘ื ื” ื”ื‘ื:

/etc/consul.d/
โ”œโ”€โ”€ client
โ”‚   โ””โ”€โ”€ config.json

ืชื•ื›ืŸ ื”ืงื•ื‘ืฅ config.json:

{
    "datacenter": "dc1",
    "data_dir": "/opt/consul",
    "log_level": "DEBUG",
    "node_name": "nomad-livelinux-01",
    "server": false,
    "encrypt": "your-private-key",
    "domain": "livelinux",
    "addresses": {
      "dns": "127.0.0.1",
      "https": "0.0.0.0",
      "grpc": "127.0.0.1",
      "http": "127.0.0.1"
    },
    "bind_addr": "172.30.0.5", # ะปะพะบะฐะปัŒะฝั‹ะน ะฐะดั€ะตั ะฒะผ
    "start_join": ["172.30.0.15"], # ัƒะดะฐะปะตะฝะฝั‹ะน ะฐะดั€ะตั ะบะพะฝััƒะป ัะตั€ะฒะตั€ะฐ
    "ports": {
      "dns": 53
     }

ืฉืžื•ืจ ืืช ื”ืฉื™ื ื•ื™ื™ื ื•ืขื‘ื•ืจ ืœื”ื’ื“ืจืช ืงื•ื‘ืฅ ื”ืฉื™ืจื•ืช, ื”ืชื•ื›ืŸ ืฉืœื•:

/etc/systemd/system/consul.service:

[Unit]
Description="HashiCorp Consul - A service mesh solution"
Documentation=https://www.consul.io/
Requires=network-online.target
After=network-online.target

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

[Install]
WantedBy=multi-user.target

ืื ื• ืžืฉื™ืงื™ื ืงื•ื ืกื•ืœ ื‘ืฉืจืช. ื›ืขืช, ืœืื—ืจ ื”ื”ืฉืงื”, ืขืœื™ื ื• ืœืจืื•ืช ืืช ื”ืฉื™ืจื•ืช ื”ืžื•ื’ื“ืจ ืืฆืœ ื—ื‘ืจื™ 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

ืœืื—ืจ ืคื™ืจื•ืง, ื ืงื‘ืœ ืงื•ื‘ืฅ ื‘ื™ื ืืจื™ ืฉืœ Nomad ื‘ืžืฉืงืœ 65 ืžื’ื”-ื‘ื™ื™ื˜ - ื™ืฉ ืœื”ืขื‘ื™ืจื• ืœ- /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.

ื”ื“ื‘ืจ ื”ืื—ืจื•ืŸ ื‘ืฉืœื‘ ื–ื” ื”ื•ื ืœื”ื’ื“ื™ืจ ืืช Nginx ืœ-Proxy ื•ื”ื’ื“ืจืช ื”ืจืฉืืช 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 ื‘ืืžืฆืขื•ืช Consul ื•ืฉื™ืœื•ื‘ ืขื Gitlab
ืชืžื•ื ื” 2. ืคืœื˜ ืฉืœ ืคืงื•ื“ืช ืžืฆื‘ ื”ืฆื•ืžืช ื”ื ื•ื•ื“

ืžื” ืขื ืงื•ื ืกื•ืœ? ื‘ื•ืื• ื ืกืชื›ืœ. ืขื‘ื•ืจ ืœืœื•ื— ื”ื‘ืงืจื” ืฉืœ ืงื•ื ืกื•ืœ, ืœื“ืฃ ื”ืฆืžืชื™ื:
ื”ืงืžืช ืืฉื›ื•ืœ Nomad ื‘ืืžืฆืขื•ืช Consul ื•ืฉื™ืœื•ื‘ ืขื Gitlab
ืชืžื•ื ื” 3. ืจืฉื™ืžืช ืฆืžืชื™ื ื‘ืืฉื›ื•ืœ ื”ืงื•ื ืกื•ืœ

ืขื›ืฉื™ื• ื™ืฉ ืœื ื• ื ื•ื•ื“ ืžื•ื›ืŸ ืฉืขื•ื‘ื“ ื‘ืฉื™ืชื•ืฃ ืขื ืงื•ื ืกื•ืœ. ื‘ืฉืœื‘ ื”ืื—ืจื•ืŸ, ื ื’ื™ืข ืœื—ืœืง ื”ืžื”ื ื”: ื”ื’ื“ืจืช ืžืฉืœื•ื— ืฉืœ ืžื›ื•ืœื•ืช Docker ืž-Gitlab ืœื ื•ืžื“, ื•ื’ื ื ื“ื‘ืจ ืขืœ ื›ืžื” ืžื”ืžืืคื™ื™ื ื™ื ื”ื™ื™ื—ื•ื“ื™ื™ื ื”ืื—ืจื™ื ืฉืœื”.

ื™ืฆื™ืจืช Gitlab Runner

ื›ื“ื™ ืœืคืจื•ืก ืชืžื•ื ื•ืช docker ืœ-Nomad, ื ืฉืชืžืฉ ื‘ืจื ืจ ื ืคืจื“ ืขื ื”ืงื•ื‘ืฅ ื”ื‘ื™ื ืืจื™ ืฉืœ Nomad ื‘ืคื ื™ื (ื›ืืŸ, ืื’ื‘, ื ื•ื›ืœ ืœืฆื™ื™ืŸ ืขื•ื“ ืชื›ื•ื ื” ืฉืœ ื™ื™ืฉื•ืžื™ Hashicorp - ื‘ื ืคืจื“ ื”ื ืงื•ื‘ืฅ ื‘ื™ื ืืจื™ ื‘ื•ื“ื“). ื”ืขืœื” ืื•ืชื• ืœืกืคืจื™ื™ืช ื”ืจืฆื™ื. ื‘ื•ืื• ื ื™ืฆื•ืจ ืขื‘ื•ืจื• Dockerfile ืคืฉื•ื˜ ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:


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

ื‘ืื•ืชื• ืคืจื•ื™ืงื˜ ืื ื• ื™ื•ืฆืจื™ื ืืช .gitlab-ci.yml:

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

stages:
  - build

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

ื›ืชื•ืฆืื” ืžื›ืš, ืชื”ื™ื” ืœื ื• ืชืžื•ื ื” ื–ืžื™ื ื” ืฉืœ ืจืฅ Nomad ื‘-Gitlab Registry, ื›ืขืช ื ื•ื›ืœ ืœืขื‘ื•ืจ ื™ืฉื™ืจื•ืช ืœืžืื’ืจ ื”ืคืจื•ื™ืงื˜ื™ื, ืœื™ืฆื•ืจ Pipeline ื•ืœื”ื’ื“ื™ืจ ืืช ืขื‘ื•ื“ืช ื”ื ื•ื•ื“ื™ื ืฉืœ 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

ื›ืืŸ ื”ืคืจื™ืกื” ืžืชืจื—ืฉืช ื‘ืื•ืคืŸ ื™ื“ื ื™, ืื‘ืœ ืืชื” ื™ื›ื•ืœ ืœื”ื’ื“ื™ืจ ืื•ืชื” ื›ื“ื™ ืœืฉื ื•ืช ืืช ื”ืชื•ื›ืŸ ืฉืœ ืกืคืจื™ื™ืช ื”ืคืจื•ื™ืงื˜. ืฆื™ื ื•ืจ ืžื•ืจื›ื‘ ืžืฉื ื™ ืฉืœื‘ื™ื: ื”ืจื›ื‘ืช ืชืžื•ื ื” ื•ืคืจื™ืกื” ืฉืœื• ืœื ื•ื•ื“. ื‘ืฉืœื‘ ื”ืจืืฉื•ืŸ ืื ื—ื ื• ืžืจื›ื™ื‘ื™ื ืชืžื•ื ืช docker ื•ื“ื•ื—ืคื™ื ืื•ืชื” ืœืจื™ืฉื•ื ืฉืœื ื•, ื•ื‘ืฉื ื™ ืื ื—ื ื• ืžืฉื™ืงื™ื ืืช ื”ืขื‘ื•ื“ื” ืฉืœื ื• ื‘-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 ืื ื™ ืฆืจื™ืš ืœื”ื™ื›ื ืก ืืœื™ื•. ื”ืคืชืจื•ืŸ ื”ื˜ื•ื‘ ื‘ื™ื•ืชืจ ื‘ืžืงืจื” ื–ื” ื”ื•ื ืœื”ื–ื™ืŸ ืฉื ืžืฉืชืžืฉ ื•ืกื™ืกืžื” ืœื›ืกืคืช ื•ืœืื—ืจ ืžื›ืŸ ืœืฉืœื‘ ืื•ืชื” ืขื 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

ื›ืขืช, ืœืื—ืจ ืฉื™ืฆืจื ื• ืืช ื”ืžื“ื™ื ื™ื•ืช ื”ื“ืจื•ืฉื”, ื ื•ืกื™ืฃ ืื™ื ื˜ื’ืจืฆื™ื” ืขื Vault ื‘ื‘ืœื•ืง ื”ืžืฉื™ืžื•ืช ื‘ืงื•ื‘ืฅ job.nomad:

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

ืื ื™ ืžืฉืชืžืฉ ื‘ื”ืจืฉืื” ืœืคื™ ืืกื™ืžื•ืŸ ื•ืจื•ืฉื ืื•ืชื• ื™ืฉื™ืจื•ืช ื›ืืŸ, ื™ืฉ ื’ื ืืคืฉืจื•ืช ืœืฆื™ื™ืŸ ืืช ื”ืืกื™ืžื•ืŸ ื›ืžืฉืชื ื” ื‘ืขืช ื”ืคืขืœืช ืกื•ื›ืŸ ื ื•ื•ื“ื™ื:

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

ืขื›ืฉื™ื• ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœื”ืฉืชืžืฉ ื‘ืžืคืชื—ื•ืช ืขื Vault. ืขืงืจื•ืŸ ื”ืคืขื•ืœื” ืคืฉื•ื˜: ืื ื• ื™ื•ืฆืจื™ื ืงื•ื‘ืฅ ื‘-Nomad job ืฉื™ืื—ืกืŸ ืืช ื”ืขืจื›ื™ื ืฉืœ ืžืฉืชื ื™ื, ืœืžืฉืœ:

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

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

ื‘ื’ื™ืฉื” ื”ืคืฉื•ื˜ื” ื”ื–ื• ืชื•ื›ืœื• ืœื”ื’ื“ื™ืจ ืืช ืืกืคืงืช ื”ืงื•ื ื˜ื™ื™ื ืจื™ื ืœืืฉื›ื•ืœ Nomad ื•ืœืขื‘ื•ื“ ืื™ืชื• ื‘ืขืชื™ื“. ืื ื™ ืื’ื™ื“ ืฉื‘ืžื™ื“ื” ืžืกื•ื™ืžืช ืื ื™ ืžื–ื“ื”ื” ืขื Nomad - ื”ื•ื ืžืชืื™ื ื™ื•ืชืจ ืœืคืจื•ื™ืงื˜ื™ื ืงื˜ื ื™ื ืฉื‘ื”ื Kubernetes ื™ื›ื•ืœ ืœื’ืจื•ื ืœืžื•ืจื›ื‘ื•ืช ื ื•ืกืคืช ื•ืœื ื™ืžืžืฉ ืืช ืžืœื•ื ื”ืคื•ื˜ื ืฆื™ืืœ ืฉืœื•. ื‘ื ื•ืกืฃ, Nomad ืžื•ืฉืœื ืœืžืชื—ื™ืœื™ื - ืงืœ ืœื”ืชืงื ื” ื•ืœื”ื’ื“ืจื”. ืขื ื–ืืช, ื‘ืขืช ื‘ื“ื™ืงื” ื‘ืคืจื•ื™ืงื˜ื™ื ืžืกื•ื™ืžื™ื, ืื ื™ ื ืชืงืœ ื‘ื‘ืขื™ื” ืขื ื”ื’ืจืกืื•ืช ื”ืžื•ืงื“ืžื•ืช ืฉืœื• - ืคื•ื ืงืฆื™ื•ืช ื‘ืกื™ืกื™ื•ืช ืจื‘ื•ืช ืคืฉื•ื˜ ืื™ื ืŸ ืฉื ืื• ืฉื”ืŸ ืื™ื ืŸ ืคื•ืขืœื•ืช ื›ื”ืœื›ื”. ืขื ื–ืืช, ืื ื™ ืžืืžื™ืŸ ืฉ-Nomad ืชืžืฉื™ืš ืœื”ืชืคืชื— ื•ื‘ืขืชื™ื“ ื”ื™ื ืชืจื›ื•ืฉ ืืช ื”ืคื•ื ืงืฆื™ื•ืช ืฉื›ื•ืœื ืฆืจื™ื›ื™ื.

ืžื—ื‘ืจ: ืื™ืœื™ื” ืื ื“ืจื™ื™ื‘, ื‘ืขืจื™ื›ืช ืืœื›ืกื™ื™ ื–'ืื“ืืŸ ื•ืฆื•ื•ืช Live Linux


ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”