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
| Composant | Valeur |
|---|---|
| Serveur | Nomad server (control plane, quorum Raft) |
| Client | Nomad client (agent sur chaque nœud worker) |
| Réseau | Pas de CNI - intégration Consul recommandée |
| Secrets | Intégration Vault native |
| Service discovery | Consul (optionnel mais recommandé) |
| Interface web | UI 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
| Driver | Description |
|---|---|
docker | Conteneurs Docker/Podman |
exec | Binaires natifs (Linux) |
java | Applications JAR |
qemu | Machines virtuelles |
podman | Conteneurs 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
- Site officiel : https://www.nomadproject.io
- Documentation : https://developer.hashicorp.com/nomad/docs
- GitHub : https://github.com/hashicorp/nomad
- Releases : https://github.com/hashicorp/nomad/releases
- Intégration Consul : https://developer.hashicorp.com/nomad/docs/integrations/consul
- Intégration Vault : https://developer.hashicorp.com/nomad/docs/integrations/vault