Basic Setup (Not Recommended):
- Download nomad binary & make it executable:
$ wget https://releases.hashicorp.com/nomad/1.0.5/nomad_1.0.5_linux_amd64.zip $ unzip nomad_1.0.5_linux_amd64.zip $ mv nomad /usr/local/bin/
- Create configs directory & data directory:
$ sudo mkdir --parents /opt/nomad $ sudo mkdir --parents /opt/data/redis $ sudo mkdir --parents /etc/nomad.d $ sudo chmod 700 /etc/nomad.d $ sudo chmod 700 /opt/data $ sudo touch /etc/nomad.d/nomad.hcl $ sudo touch /etc/nomad.d/server.hcl $ sudo touch /etc/nomad.d/client.hcl
- Add this configuration to the
/etc/nomad.d/nomad.hcl
configuration file
datacenter = "dc1" data_dir = "/opt/nomad"
- Add this configuration to the
/etc/nomad.d/client.hcl
configuration file
client { enabled = true host_volume "redis_data" { path = "/opt/data/redis" read_only = false } } plugin "docker" { config { volumes { enabled = true selinuxlabel = "z" } } }
- Add this configuration to the
/etc/nomad.d/server.hcl
configuration file
acl { enabled = true } server { enabled = true bootstrap_expect = 1 }
- Create a nomad service file
$ sudo touch /etc/systemd/system/nomad.service
- Add this configuration to the nomad service file
/etc/systemd/system/nomad.service
[Unit] Description=Nomad Documentation=https://nomadproject.io/docs/ [Service] ExecStart=/usr/local/bin/nomad agent -config /etc/nomad.d Restart=on-failure RestartSec=2 [Install] WantedBy=multi-user.target
- Start nomad
sudo systemctl enable nomad sudo systemctl start nomad sudo systemctl status nomad
- Genertal ACL secrets
$ nomad acl bootstrap Accessor ID = a8b724ef-b5eb-21c0-1a68-b0d3616e1e62 Secret ID = 07fe0ee6-59bc-8ea0-aeeb-9b4e9edcb555 Name = Bootstrap Token Type = management Global = true Policies = n/a Create Time = 2021-05-10 21:05:21.498072284 +0000 UTC Create Index = 10 Modify Index = 10 $ export NOMAD_TOKEN=07fe0ee6-59bc-8ea0-aeeb-9b4e9edcb555
- Create your first job to deploy a stateless container from the server ui
http://127.0.0.1:4646/ui
job "api" { datacenters = ["dc1"] group "example" { task "server" { driver = "docker" config { image = "hashicorp/http-echo:0.2.1" args = [ "-listen", ":5678", "-text", "hello world", ] } resources { network { mbits = 10 port "http" { static = "5678" } } } } } }
- And another one for stateful container
job "cache" { datacenters = ["dc1"] group "redis" { volume "redis_data" { type = "host" read_only = false source = "redis_data" } task "server" { driver = "docker" volume_mount { volume = "redis_data" destination = "/data" read_only = false } config { image = "redis:4-alpine" labels = { "sh.hippo.service" = "redis" "sh.hippo.service_type" = "cache" } port_map { http = 6379 } command = "redis-server" args = [ "--requirepass", "mystery", ] } env = { HEALTHY_FOR = -1, } resources { cpu = 100 memory = 256 network { mbits = 10 port "http" { static = "6379" } } } } } }
Multi Nodes Setup (Recommended):
To fully understand how nomad cluster should look like, please check this guide!
Assuming we have two servers, one for the nomad server (Leader) and another for the client. Both servers are in DC1
. The leader server has public IP $SERVER_PUBLIC_IP
and private IP $SERVER_PRIVATE_IP
.
First we run the leader or the nomad server by following the next steps:
- Download nomad binary & make it executable:
$ wget https://releases.hashicorp.com/nomad/1.0.5/nomad_1.0.5_linux_amd64.zip $ unzip nomad_1.0.5_linux_amd64.zip $ mv nomad /usr/local/bin/
- Create configs directory & data directory:
$ sudo mkdir --parents /opt/nomad $ sudo mkdir --parents /opt/data/redis $ sudo mkdir --parents /etc/nomad.d $ sudo chmod 700 /etc/nomad.d $ sudo chmod 700 /opt/data $ sudo touch /etc/nomad.d/nomad.hcl $ sudo touch /etc/nomad.d/server.hcl
- Add this configuration to the
/etc/nomad.d/nomad.hcl
configuration file
datacenter = "dc1" data_dir = "/opt/nomad"
- Add this configuration to the
/etc/nomad.d/server.hcl
configuration file
acl { enabled = true } server { enabled = true bootstrap_expect = 1 } bind_addr = "$SERVER_PUBLIC_IP" addresses { http = "$SERVER_PUBLIC_IP" rpc = "$SERVER_PRIVATE_IP" serf = "$SERVER_PRIVATE_IP" } advertise { http = "$SERVER_PUBLIC_IP:4646" rpc = "$SERVER_PRIVATE_IP:4647" serf = "$SERVER_PRIVATE_IP:4648" }
- Create a nomad service file
$ sudo touch /etc/systemd/system/nomad.service
- Add this configuration to the nomad service file
/etc/systemd/system/nomad.service
[Unit] Description=Nomad Documentation=https://nomadproject.io/docs/ [Service] ExecStart=/usr/local/bin/nomad agent -config /etc/nomad.d Restart=on-failure RestartSec=2 [Install] WantedBy=multi-user.target
- Start nomad
sudo systemctl enable nomad sudo systemctl start nomad sudo systemctl status nomad
- Genertal ACL secrets
$ nomad acl bootstrap -address=http://$SERVER_PUBLIC_IP:4646 Accessor ID = a8b724ef-b5eb-21c0-1a68-b0d3616e1e62 Secret ID = 07fe0ee6-59bc-8ea0-aeeb-9b4e9edcb555 Name = Bootstrap Token Type = management Global = true Policies = n/a Create Time = 2021-05-10 21:05:21.498072284 +0000 UTC Create Index = 10 Modify Index = 10 $ export NOMAD_TOKEN=07fe0ee6-59bc-8ea0-aeeb-9b4e9edcb555
Then we run the client by following the next steps:
- Download nomad binary & make it executable:
$ wget https://releases.hashicorp.com/nomad/1.0.5/nomad_1.0.5_linux_amd64.zip $ unzip nomad_1.0.5_linux_amd64.zip $ mv nomad /usr/local/bin/
- Create configs directory & data directory:
$ sudo mkdir --parents /opt/nomad $ sudo mkdir --parents /opt/data/redis $ sudo mkdir --parents /etc/nomad.d $ sudo chmod 700 /etc/nomad.d $ sudo chmod 700 /opt/data $ sudo touch /etc/nomad.d/nomad.hcl $ sudo touch /etc/nomad.d/client.hcl
- Add this configuration to the
/etc/nomad.d/nomad.hcl
configuration file
datacenter = "dc1" data_dir = "/opt/nomad"
- Add this configuration to the
/etc/nomad.d/client.hcl
configuration file
client { enabled = true servers = ["$SERVER_PRIVATE_IP:4647"] host_volume "redis_data" { path = "/opt/data/redis" read_only = false } } plugin "docker" { config { volumes { enabled = true selinuxlabel = "z" } } }
- Create a nomad service file
$ sudo touch /etc/systemd/system/nomad.service
- Add this configuration to the nomad service file
/etc/systemd/system/nomad.service
[Unit] Description=Nomad Documentation=https://nomadproject.io/docs/ [Service] ExecStart=/usr/local/bin/nomad agent -config /etc/nomad.d Restart=on-failure RestartSec=2 [Install] WantedBy=multi-user.target
- Start nomad
sudo systemctl enable nomad sudo systemctl start nomad sudo systemctl status nomad
CNI Plugins in Nomad
Nomad uses CNI plugins when bridge networking is used. To install CNI plugins:
$ curl -L -o cni-plugins.tgz https://github.com/containernetworking/plugins/releases/download/v0.8.0/cni-plugins-linux-amd64-v0.8.0.tgz $ mkdir -p /opt/cni/bin $ tar -C /opt/cni/bin -xzf cni-plugins.tgz
job "clivern" { datacenters = ["dc1"] group "services" { network { port "toad0_srv" { static = 8080 } port "toad1_srv" { static = 8081 } } task "toad0" { driver = "docker" config { image = "clivern/toad:release-0.2.4" labels = { "com.clivern.service" = "toad" "com.clivern.service_type" = "web" } ports = ["toad0_srv"] command = "./toad" args = [ "--port", "${NOMAD_PORT_toad0_srv}", ] } env = { IS_STATEFUL = "false", TOAD0_ADDR = "${NOMAD_HOST_ADDR_toad0_srv}", TOAD1_ADDR = "${NOMAD_HOST_ADDR_toad1_srv}", } resources { network { mbits = 10 } } } task "toad1" { driver = "docker" config { image = "clivern/toad:release-0.2.3" labels = { "com.clivern.service" = "toad" "com.clivern.service_type" = "web" } ports = ["toad1_srv"] command = "./toad" args = [ "--port", "${NOMAD_PORT_toad1_srv}", ] } env = { IS_STATEFUL = "false", TOAD0_ADDR = "${NOMAD_HOST_ADDR_toad0_srv}", TOAD1_ADDR = "${NOMAD_HOST_ADDR_toad1_srv}", } resources { network { mbits = 10 } } } } }
Top comments (0)