Konfigurasi Nomad

Konfigurasi Nomad default berada di /etc/nomad.d/nomad.hcl. Pada catatan ini, kita akan mengonfigurasi Nomad agar dapat berfungsi sebagai server dan client dalam cluster, serta mengintegrasikannya dengan Consul untuk service discovery.

Sama seperti Consul, kita juga akan mengonfigurasi Nomad untuk menggunakan TLS dalam seluruh komunikasi antar node. Caranya membuatnya pun mirip, oleh karena itu kita ringkas saja di sini.

Kita buat CA terlebih dahulu menggunakan helper bawaan Nomad. Setelah terbuat, salin sertifikat ke semua node dalam cluster.

nomad tls ca create

Kemudian di setiap node kita lakukan langkah berikut.


# Membuat direktori untuk tempat sertifikat
sudo mkdir -p /nomad/config/certs

# Start nomad agar user dan group nomad dibuat
sudo systemctl start nomad

# Ubah permission direktori sertifikat agar dapat diakses oleh nomad
sudo chown -R nomad:nomad /nomad/config/certs

# -----------------------------------------------------------------------------
# Setelah langkah di atas, aku asumsikan kita sudah menyalin file CA dan Key
# ke direktori /nomad/config/certs di setiap node.
# -----------------------------------------------------------------------------

# Membuat sertifikat server di setiap node
cd /nomad/config/certs
sudo nomad tls cert create -server

Lanjut ke konfigurasi Nomad di setiap node. Edit file /etc/nomad.d/nomad.hcl.

# Copyright (c) HashiCorp, Inc.
# SPDX-License-Identifier: BUSL-1.1

# Full configuration options can be found at https://developer.hashicorp.com/nomad/docs/configuration

data_dir  = "/opt/nomad/data"
bind_addr = "0.0.0.0"

advertise {
  # Ganti dengan public IP address dari masing-masing node. Dengan mengatur
  # advertise address, Nomad tidak akan salah dalam mendeteksi alamat IP-nya sendiri.
  http   = "203.0.113.10"
  rpc    = "203.0.113.10"
  serf   = "203.0.113.10"
}

consul {
  address   = "localhost:8500"
  token     = "<bootstrap-token-from-consul>"
}

server {
  enabled = true
  bootstrap_expect = 3
}

client {
  enabled = true
}

tls {
  # Aktifkan TLS untuk komunikasi HTTP dan RPC
  http = true
  rpc = true

  ca_file   = "/nomad/config/certs/ca.pem"
  cert_file = "/nomad/config/certs/global-server-nomad-cert.pem"
  key_file  = "/nomad/config/certs/global-server-nomad-key.pem"

  verify_server_hostname = true

  # Nonaktifkan verifikasi sertifikat client (opsional) agar kita dapat
  # mengakses Nomad UI dari browser tanpa perlu sertifikat client
  verify_https_client = false
}

Note: bootstrap_expect di bagian server disesuaikan dengan jumlah node server yang kita miliki. Fungsi utama adalah untuk memungkinkan pemilihan pemimpin awal (leader election) secara otomatis dalam cluster baru, sehingga tidak perlu intervensi manual.

Sekarang kita jalankan Nomad dan buat jalan secara otomatis saat sistem boot.

sudo systemctl enable --now nomad

# Pastikan running dan tidak ada error
sudo systemctl status nomad

Untuk memastikan Nomad sudah berjalan dengan benar, kita akan coba mengaksesnya melalui Nomad CLI di workstation kita.

# Set dulu address dan TLS environment variable
# Selengkapnya di https://developer.hashicorp.com/nomad/commands#environment-variables
export NOMAD_ADDR=https://<node-ip>:4646
export NOMAD_SKIP_VERIFY=true

# Cek status node dalam cluster
nomad node status

# Jika berhasil, akan muncul output seperti berikut:
ID        Node Pool  DC   Name    Class   Drain  Eligibility  Status
08c236db  default    dc1  node3   <none>  false  eligible     ready
220092dd  default    dc1  node2   <none>  false  eligible     ready
cf522cd4  default    dc1  node1   <none>  false  eligible     ready

# Periksa apakah Nomad dapat mendaftarkan dirinya ke Consul Service Catalog
consul catalog services

Saatnya mengamankan Nomad dengan ACL agar tidak sembarang orang bisa mengakses cluster kita. Lanjut ke bagian berikutnya untuk konfigurasi ACL di Nomad, kita perlu melakukan hal berikut:

  1. Mengaktifkan ACL di Nomad
  2. Membuat token bootstrap

Edit file /etc/nomad.d/nomad.hcl di setiap node, tambahkan stanza berikut:

acl {
  enabled = true
}

Setelah itu restart Nomad dan buat token bootstrap di salah satu node.

sudo systemctl restart nomad

nomad acl bootstrap

# Output menampilkan token bootstrap seperti berikut:
Accessor ID  = 52d3353d-d7b9-d945-0591-1af608732b76
Secret ID    = 4b0a41ca-6d32-1853-e64b-de0d347e4525
Name         = Bootstrap Token
Type         = management
Global       = true
Policies     = n/a
Create Time  = 2017-09-11 18:38:11.929089612 +0000 UTC
Create Index = 11
Modify Index = 11

Karena sekarang kita sudah mengaktifkan ACL, seharusnya kita tidak bisa lagi mengakses Nomad tanpa menyertakan token. Coba jalankan nomad node status di workstation kita, seharusnya akan muncul error 403 Forbidden.

Setelah itu kita coba lagi dengan menyertakan token bootstrap yang tadi dibuat.

export NOMAD_TOKEN=4b0a41ca-6d32-1853-e64b-de0d347e4525

nomad node status

Jika berhasil, kita akan melihat daftar node dalam cluster seperti sebelumnya.

Sekali lagi, catatan ini hanya untuk keperluan belajar dan eksplorasi. Tidak seharusnya menggunakan bootstrap token di lingkungan production karena token ini memiliki hak akses penuh (management) ke seluruh cluster Nomad.