Orchestration

Nomad

Orchestrateur multi-workload HashiCorp pour conteneurs, VMs et binaires. Alternative légère à Kubernetes, configuration HCL, intégration native Consul et Vault.

Nomad est un orchestrateur de workloads développé par HashiCorp. Contrairement à Kubernetes, il n'est pas limité aux conteneurs : il supporte nativement Docker, les VMs QEMU, les binaires Java, les scripts Bash, et d'autres types de tâches via un système de drivers. Sa configuration en HCL (HashiCorp Configuration Language) est plus accessible que les YAML Kubernetes, et son intégration avec Consul (service mesh) et Vault (secrets) est native.

Idéal pour : environnements hétérogènes (conteneurs + VMs + binaires), équipes déjà dans l'écosystème HashiCorp, cas où Kubernetes est surdimensionné.

Licence : Nomad est passé de MPL 2.0 à BSL 1.1 en août 2023. Il reste gratuit pour un usage non-concurrentiel (hors offre SaaS concurrente de HashiCorp). Vérifier la licence pour les usages commerciaux.


Informations essentielles

Origine : HashiCorp (États-Unis)  ·  Licence : BSL 1.1 (source-available)  ·  Architectures : x86_64, ARM64, ARMv7

Liens : Site officiel  ·  Documentation  ·  GitHub  ·  Releases

Support : HashiCorp maintient les 2 dernières versions mineures. La version Enterprise inclut support et fonctionnalités avancées.

Stack par défaut

ComposantValeur
ServeurNomad server (control plane, quorum Raft)
ClientNomad client (agent sur chaque nœud worker)
RéseauPas de CNI - intégration Consul recommandée
SecretsIntégration Vault native
Service discoveryConsul (optionnel mais recommandé)
Interface webUI intégrée

Concepts clés

Job

Le Job est l'unité de déploiement, défini en HCL. Il contient des group (groupe de tâches co-localisées) qui contiennent des task (unité d'exécution).

Drivers de tâches

DriverDescription
dockerConteneurs Docker/Podman
execBinaires natifs (Linux)
javaApplications JAR
qemuMachines virtuelles
podmanConteneurs Podman (plugin)

Allocation

Une allocation est l'instance d'un groupe de tâches schedulée sur un client Nomad. Équivalent du Pod Kubernetes.


Prérequis

  • Linux, macOS ou Windows (clients et servers)
  • Pour Docker : Docker installé sur les clients
  • Ports : 4646/TCP (HTTP API), 4647/TCP (RPC), 4648/TCP+UDP (Serf/gossip)

Installation

# Ubuntu / Debian (dépôt HashiCorp)
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] \
  https://apt.releases.hashicorp.com $(lsb_release -cs) main" | \
  sudo tee /etc/apt/sources.list.d/hashicorp.list

sudo apt-get update && sudo apt-get install -y nomad

# RHEL / Rocky Linux
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum install -y nomad

Mode développement (single-node tout-en-un)

# Démarre server + client sur la même machine
sudo nomad agent -dev

# Dans un autre terminal
export NOMAD_ADDR=http://127.0.0.1:4646
nomad status

Cluster de production

Configuration server

# /etc/nomad.d/server.hcl
datacenter = "dc1"
data_dir   = "/opt/nomad/data"

server {
  enabled          = true
  bootstrap_expect = 3   # nombre de servers pour le quorum
}

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

Configuration client

# /etc/nomad.d/client.hcl
datacenter = "dc1"
data_dir   = "/opt/nomad/data"

client {
  enabled = true
  servers = ["192.168.1.10:4647", "192.168.1.11:4647", "192.168.1.12:4647"]
}
sudo systemctl enable --now nomad
nomad server members   # vérifier les servers
nomad node status      # vérifier les clients

Déployer un workload

Conteneur Docker

# nginx.nomad
job "nginx" {
  datacenters = ["dc1"]
  type        = "service"

  group "web" {
    count = 2

    network {
      port "http" {
        static = 8080
      }
    }

    task "nginx" {
      driver = "docker"

      config {
        image = "nginx:alpine"
        ports = ["http"]
      }

      resources {
        cpu    = 100
        memory = 128
      }
    }

    service {
      name = "nginx"
      port = "http"
      check {
        type     = "http"
        path     = "/"
        interval = "10s"
        timeout  = "2s"
      }
    }
  }
}
# Soumettre le job
nomad job run nginx.nomad

# Vérifier
nomad job status nginx
nomad alloc logs <alloc-id>

Binaire natif (exec)

job "mon-service" {
  group "app" {
    task "server" {
      driver = "exec"
      config {
        command = "/usr/local/bin/mon-service"
        args    = ["--port", "8080"]
      }
      resources {
        cpu    = 500
        memory = 256
      }
    }
  }
}

Mise à jour

# Mettre à jour le paquet
sudo apt-get install --only-upgrade nomad

# Ou télécharger le binaire directement
curl -LO https://releases.hashicorp.com/nomad/<version>/nomad_<version>_linux_amd64.zip
unzip nomad_*.zip && sudo mv nomad /usr/local/bin/

# Redémarrer les agents (servers d'abord, puis clients)
sudo systemctl restart nomad

Troubleshooting

Server non élu

nomad server members
# Vérifier que bootstrap_expect correspond au nombre de servers actifs
sudo journalctl -u nomad -f

Allocation en erreur

# Voir les allocations
nomad job status <job-name>

# Logs de l'allocation
nomad alloc logs <alloc-id>
nomad alloc status <alloc-id>

# Logs du driver
nomad alloc logs -stderr <alloc-id>

Client ne se connecte pas

# Vérifier la connectivité vers les servers
curl http://192.168.1.10:4646/v1/status/leader

nomad node status
sudo journalctl -u nomad -n 50

Commandes utiles

# État général
nomad server members
nomad node status
nomad job status

# Jobs
nomad job run <fichier.nomad>
nomad job stop <nom-job>
nomad job plan <fichier.nomad>   # dry-run

# Allocations
nomad alloc status <alloc-id>
nomad alloc logs <alloc-id>
nomad alloc exec -task <task> <alloc-id> /bin/sh   # shell interactif

# Interface web
# http://<server-ip>:4646/ui
nomad ui   # ouvre le navigateur

Ressources

Newsletter · 2 000+ abonnés

Reste au courant de ce qui bouge en prod

RudeOps veille devops hebdo, droit au but.

Gratuit · Sans spam · Désinscription en un clic