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.
| Node | Role | Public IP |
|---|---|---|
| node-1 | Server + Client | 203.0.113.10 |
| node-2 | Server + Client | 203.0.113.11 |
| node-3 | Server + Client | 203.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.