Menjalankan Job di Nomad

Setelah Nomad terkonfigurasi dan berjalan sebagai server dan client dalam cluster, kita akan mencoba untuk menjalankan sebuah job sederhana. Aku cari project random di GitHub yang bisa dijalankan sebagai container. Aku menemukan project Javascript-Snake yang telah dijadikan Docker image di Docker Hub dengan nama aschil/snake.

Membuat Job Nomad

Di workstation kita, buat sebuah file bernama snake.hcl dengan isi sebagai berikut. Untuk referensi lengkap lihat di Job Specification.

job "snake-web" {
  datacenters = ["dc1"]

  group "snake" {
    # Menjalankan hanya 1 instance dari group ini
    count = 1

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

    task "snake" {
      driver = "docker"

      config {
        image = "aschil/snake:latest"
        ports = ["http"]
      }

      resources {
        cpu    = 50
        memory = 100
      }
    }
  }
}

Ringkasan:

  • Karena aplikasi kita berjalan di port 8080, kita buat pemetaan port di dalam blok network. Dengan ini, nomad akan mengalokasikan port acak di host dan memetakannya ke port 8080 di dalam container.

    network {
      port "http" {
        to = 8080
      }
    }
    
  • Di dalam blok task, kita menggunakan driver docker untuk menjalankan container dari image aschil/snake:latest. Task adalah unit terkecil dari pekerjaan yang dijalankan Nomad. Kita juga mengatur sumber daya CPU dan memori yang dialokasikan untuk task ini.

    task "snake" {
      driver = "docker"
    
      config {
        image = "aschil/snake:latest"
    
        # Set port mapping ke network port "http" yang telah didefinisikan sebelumnya
        ports = ["http"]
      }
    
      resources {
        cpu    = 100   # in MHz
        memory = 300  # in MB
      }
    }
    

Menjalankan Job di Nomad

Setalah itu kita jalankan job melalui cli di workstation kita.

# Pastikan environment variable seperti token dan address sudah di set.

nomad job run snake.hcl

# Cek status job
nomad job status snake-web

# Outputnya akan seperti berikut:
ID            = snake-web
Name          = snake-web
Submit Date   = 2026-02-09T10:48:51+07:00
Type          = service
Priority      = 50
Datacenters   = dc1
Namespace     = default
Node Pool     = default
Status        = running
Periodic      = false
Parameterized = false

Summary
Task Group  Queued  Starting  Running  Failed  Complete  Lost  Unknown
snake       0       0         1        0       0         0     0

Latest Deployment
ID          = e795dfa4
Status      = successful
Description = Deployment completed successfully

Deployed
Task Group  Desired  Placed  Healthy  Unhealthy  Progress Deadline
snake       1        1       1        0          2026-02-09T03:59:04Z

Allocations
ID        Node ID   Task Group  Version  Desired  Status   Created  Modified
e77694de  cf522cd4  snake       0        run      running  23s ago  11s ago

Sekarang kita sudah berhasil menjalankan job di Nomad. Untuk saat ini baru satu instance yang berjalan. Pertanyaannya mungkin ialah:

  • Di node mana job ini berjalan?
  • Port berapa yang digunakan untuk mengakses aplikasi ini?

Alokasi

Alokasi adalah instance dari sebuah task group yang berjalan di dalam cluster Nomad. Dalam job ini, alokasi ialah container Docker yang menjalankan aplikasi snake.

Untuk melihat daftar dan detail alokasi kita bisa menjalankan perintah berikut:

# Daftar alokasi dari job snake-web
nomad job allocs snake-web

# Output:
ID        Node ID   Task Group  Version  Desired  Status   Created    Modified
e77694de  cf522cd4  snake       0        run      running  3m46s ago  3m34s ago

# Detail alokasi
nomad alloc status e77694de

# Output:
ID                  = e77694de-a563-427f-0445-b481a935fbaa
Eval ID             = 2985850a
Name                = snake-web.snake[0]
Node ID             = cf522cd4
Node Name           = ubt-tm-1
Job ID              = snake-web
Job Version         = 0
Client Status       = running
Client Description  = Tasks are running
Desired Status      = run
Desired Description = <none>
Created             = 4m43s ago
Modified            = 4m31s ago
Deployment ID       = e795dfa4
Allocation Addresses:
Label  Dynamic  Address
*http  yes      203.0.113.10:30438 -> 8080

Task "snake" is "running"
Task Resources:
CPU      Memory   Disk     Addresses
100 MHz  300 MiB  300 MiB

Task Events:
Started At     = 2026-02-09T03:48:54Z
Finished At    = N/A
Total Restarts = 0
Last Restart   = N/A

Recent Events:
Time                       Type        Description
2026-02-09T10:48:54+07:00  Started     Task started by client
2026-02-09T10:48:51+07:00  Driver      Downloading image
2026-02-09T10:48:51+07:00  Task Setup  Building Task Directory
2026-02-09T10:48:51+07:00  Received    Task received by client

Dari output di atas, kita bisa melihat bahwa alokasi e77694de berjalan di node ubt-tm-1. Sedangkan untuk address dari aplikasi kita ialah 203.0.113.10:30438. Jika kita buka di browser, kita akan melihat game snake yang bisa dimainkan.

Game Snake di Browser

Mendaftarkan Service di Consul

Karena nantinya kita akan menambahkan proxy web server, kita perlu mendaftarkan service aplikasi snake ini di Consul agar nanti kita bisa membuat konfigurasi proxy dengan dinamis. Kita akan menggunakan consul-template untuk membuat file konfigurasi proxy secara otomatis berdasarkan service yang terdaftar di Consul.

Untuk itu, kita perlu menambahkan blok service di dalam task snake pada file snake.hcl di dalam stanza group "snake" seperti berikut:

group "snake" {
 count = 1

  service {
    name = "snake-web"
    port = "http" # Sesuai dengan nama port di blok network.

    # Health check agar Consul dapat memantau kesehatan service ini
    check {
      type     = "http"
      path     = "/"
      interval = "3s"
      timeout  = "2s"
    }
  }
  ...
}

Setelah itu kita jalankan ulang job-nya dengan perintah berikut:

nomad job run snake.hcl

Untuk memeriksa apakah service sudah terdaftar di Consul, kita bisa membuka Consul UI atau melalu cli:

# Pastikan environment variable sudah di set

consul catalog services

Jika berhasil, akan muncul service snake-web di daftar service yang terdaftar di Consul.