Nomad (Hashicorp)

Présentation

Nomad est un orchestrateur. Il peut déployer divers types de tâches appelées job : commandes, conteneurs Docker/rkt/LXC, VM Qemu…

L’architecture Nomad se compose :

  • de serveurs qui vont jouer le rôle d’orchestrateur et vont servir l’API
  • de clients qui exécuteront les tâches sur les machines

Nomad s’intègre avec les autres produits d’Hashicorp tel que Consul et Vault.

Installation rapide du service

Nomad peut être utilisé en multi-master. Nomad peut être configuré pour être client ou serveur ou les deux à la fois. Ce dernier cas est déconseillé d’après la documentation.

Le programme se présente sous la forme d’un fichier binaire. Il faut lui ajouter un fichier service pour l’utiliser avec systemd :

[Unit]
Description=Nomad
After=network.target

[Service]
ExecStart=/usr/bin/nomad agent -config=/etc/nomad/nomad.conf

[Install]
WantedBy=multi-user.target

Le fichier de configuration, écrit en HCL se présente ainsi :

bind_addr = "0.0.0.0"

data_dir  = "/var/lib/nomad"

advertise {
  http = "10.42.1.11"
  rpc  = "10.42.1.11"
  serf = "10.42.1.11"
}

server {
  enabled          = true
  bootstrap_expect = 2
}

client {
  enabled       = true
  network_speed = 10
  options {
    "driver.raw_exec.enable" = "1"
  }
}

consul {
  address = "127.0.0.1:8500"
}

vault {
  enabled = true
  address = "http://127.0.0.1:8200"
  token   = "8332917a-08fa-a989-9bbc-277c60fa9026"
}

Lancer un job

Voici un modèle de job :

job "docs" {
  datacenters = ["dc1"]

  group "example" {
    task "server" {
      driver = "docker"

      config {
        image = "hashicorp/http-echo"
        args = [
          "-listen", ":5678",
          "-text", "hello world",
        ]
        network_mode = "weave"
      }

      resources {
        network {
          port "http" {
            static = "5678"
          }
        }
      }

      service {
        tags = ["default"]
        port = "http"

        check {
          type     = "tcp"
          interval = "10s"
          timeout  = "2s"
        }
      }

      vault {
        policies = ["http"]
      }

    }
  }
}

Pour l’exécuter :

nomad run docs.nomad