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 require blocks, 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. The drivers/ and plugins/ 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 full hcl/v2 and gohcl ecosystem 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 a replace directive 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.