Nomad — Overview#
Identity#
- Module path: github.com/hashicorp/nomad
- Go version: 1.25.8
- License: BUSL-1.1 (Business Source License 1.1; Licensor: IBM Corp., formerly HashiCorp)
- Repository: https://github.com/hashicorp/nomad
Purpose#
Nomad is a flexible workload orchestrator that deploys and manages containers (Docker, Podman), non-containerized applications (raw executables, Java), and virtual machines (QEMU) across on-premises and cloud infrastructure. It targets platform engineering and operations teams who need Kubernetes-grade orchestration without mandatory containerization. Unlike Kubernetes, Nomad ships as a single binary that self-sufficiently handles resource management, scheduling, and cluster coordination without requiring external storage or coordination services.
Significance#
Nomad occupies a unique position in the orchestration landscape as the primary production-grade alternative to Kubernetes that explicitly supports legacy and heterogeneous workloads. It has been adopted at scale (10K+ node clusters documented in production), is deeply integrated with the HashiCorp/IBM ecosystem (Vault for secrets, Consul for service discovery, Terraform for provisioning), and serves as a reference implementation for distributed scheduler design in Go. The shift to BUSL-1.1 in 2024 (alongside other HashiCorp tools) made it source-available rather than open-source, reflecting the broader commercial tension in infrastructure OSS, but the codebase remains publicly readable and highly influential.
Key metrics#
- Go files: 2,129 (XL tier; work item classified as L)
- Top-level directories: acl, api, client, command, contributing, demo, dev, drivers, e2e, enos, helper, integrations, internal, jobspec2, lib, nomad, plugins, scheduler, testutil, tools, ui, version, website
- Direct dependencies: ~127 (from go.mod
requireblocks, excluding// indirect) - go.sum entries: ~1,180 lines (reflecting a large transitive dependency tree)
- First commit / age: Repository cloned as shallow (1 commit); Nomad was publicly released in September 2015 — approximately 10 years old
Notable characteristics#
- Plugin-first task driver architecture: Task drivers (Docker, exec, Java, QEMU, Podman) are isolated as plugins using
hashicorp/go-plugin, enabling third-party driver development without forking the core. Thedrivers/andplugins/packages expose the extension surface. - Single-binary, zero-external-dependency design: Nomad bundles its own Raft consensus implementation, gossip protocol, and scheduler into one binary. It explicitly avoids requiring external services like etcd or ZooKeeper — a deliberate architectural philosophy documented in its README.
- HCL2 job specification: Jobs are defined in HCL2 (HashiCorp Configuration Language v2), parsed via the
jobspec2/package. This means the fullhcl/v2andgohclecosystem is part of the data path, adding expressive templating and type checking to job definitions. - Separate api/ sub-module: The
api/directory is its own Go module (github.com/hashicorp/nomad/api), providing a standalone client library that external tooling can import without pulling in the full server. This module boundary is enforced via areplacedirective in go.mod. - Scheduler as a standalone package: The
scheduler/package implements the bin-packing and spread scheduler algorithms independently from the server package, making it testable and comprehensible in isolation — a notable separation of concerns for a system of this complexity.