Persiapan VM untuk pembuatan cluster

Dalam setup ini, aku menggunakan 3 virtual machine untuk membuat cluster HashiCorp Nomad. Setiap node dikonfigurasi sebagai server dan client sekaligus, dan seluruh node berjalan menggunakan public IP address dan kita beri nama datacenternya dengan nama default (dc1).

Setup ini dibuat untuk keperluan belajar, eksplorasi, dan deployment skala kecil, agar lebih mudah memahami bagaimana Nomad dan komponen pendukungnya bekerja dalam satu cluster.

Konfigurasi Cluster

  • Jumlah node: 3
  • Role: Server + Client (semua node)
  • Network: Public IP address
  • Datacenter: dc1 (default)
  • OS: Ubuntu 24.04.3 LTS

Konfigurasi ini tidak direkomendasikan untuk environment production. Menjalankan semua node sebagai server dan client dengan public IP hanya cocok untuk demonstrasi atau beban rendah.

Meskipun demikian, untuk kebutuhan belajar dan testing, setup sederhana ini cukup efektif dan mengurangi kompleksitas awal.

Detail Node dan Alamat IP

Setiap node dalam cluster ini memiliki public IP address yang digunakan untuk komunikasi antar node dan akses dari luar cluster.

NodeRolePublic IP
node-1Server + Client203.0.113.10
node-2Server + Client203.0.113.11
node-3Server + Client203.0.113.12

Public IP ini digunakan untuk:

  • Komunikasi antar server Nomad (Raft & gossip)
  • Registrasi dan penjadwalan workload
  • Akses Nomad UI dan API selama proses pembelajaran
  • Akses service dari luar cluster melalui reverse proxy

Komponen Tambahan

Selain Nomad, cluster ini juga menggunakan beberapa komponen pendukung untuk service discovery, reverse proxy, dan konfigurasi dinamis.

Consul

Consul digunakan sebagai service discovery dan key-value store. Semua node Nomad terhubung ke Consul untuk:

  • Registrasi service secara otomatis dari Nomad
  • Health check service
  • Menyediakan data untuk dynamic configuration

Consul berjalan di setiap node dan terintegrasi langsung dengan Nomad, sehingga setiap workload yang dideploy dapat terdeteksi dan dikelola secara otomatis.

Caddy (Custom Build dengan Consul & Cloudflare Plugin)

Caddy digunakan sebagai reverse proxy dan HTTP server, dan diinstall di seluruh node dalam cluster. Setiap node menjalankan Caddy dengan public IP masing-masing, sehingga traffic dapat masuk melalui node mana pun.

Seluruh public IP dari node-node tersebut didaftarkan ke Cloudflare (A record), sehingga:

  • Request dari client dapat diarahkan ke node mana saja
  • Tidak ada single point of entry
  • Distribusi traffic terjadi secara natural

Caddy menggunakan custom build yang menyertakan:

Peran Consul Plugin pada Caddy

Consul plugin berfungsi sebagai penghubung antara service discovery di Consul dan routing di Caddy.

Dengan plugin ini, Caddy dapat:

  • Penyimpanan sertifikat TLS di Consul KV store
  • Mengambil daftar service yang terdaftar di Consul
  • Menentukan upstream secara otomatis
  • Menyesuaikan routing saat service di-deploy, di-scale, atau dihentikan
  • Menghindari konfigurasi reverse proxy yang statis

Hal ini membuat Caddy menjadi reverse proxy yang aware terhadap kondisi cluster.

Cloudflare Plugin & TLS Challenge

Cloudflare plugin digunakan untuk mempermudah proses pengambilan sertifikat TLS dari Let’s Encrypt menggunakan DNS challenge.

Plugin ini penting karena pada arsitektur multi-node:

  • Request HTTP challenge bisa masuk ke node yang berbeda
  • Node yang menerima challenge belum tentu node yang mengajukan permintaan sertifikat
  • Hal ini dapat menyebabkan proses HTTP challenge gagal

Dengan DNS challenge melalui Cloudflare:

  • Validasi sertifikat tidak bergantung pada node tertentu
  • Proses lebih stabil
  • Cocok untuk cluster dengan banyak public IP

Plugin ini opsional, aku sendiri hanya membuildnya dengan caddy tapi tidak menggunakannya untuk artikel ini. Kita masih bisa menggunakan HTTP challenge dengan cara menambahkan hanya satu IP pada DNS A record di Cloudflare sampai Caddy mendapatkan sertifikatnya, kemudian baru mengubahnya menjadi multiple A record.

Consul Template

Untuk menjaga konfigurasi Caddy tetap sinkron dengan kondisi cluster, maka kita juga perlu menggunakan consul-template.

Consul-template berfungsi untuk:

  • Mengambil data dari Consul secara berkala
  • Menghasilkan konfigurasi Caddy berdasarkan template
  • Me-reload Caddy secara otomatis ketika terjadi perubahan

Dengan kombinasi Nomad, Consul, Caddy, dan consul-template, setiap perubahan service (deploy, scale, stop) akan tercermin secara otomatis pada layer routing tanpa intervensi manual.

Docker

Setiap node dalam cluster juga menginstall Docker, namun di sini aku tidak akan membahas cara instalasinya, sehingga aku asumsikan docker sudah terinstall di setiap node.