Pada minggu kemarin kita sudah membahas tentang membuat staging server yang mana ditenagai oleh traefik (tulisan selengkapnya bisa dibaca disini). Namun, mungkin ada yang belum terlalu familiar dengan Traefik, atau kurang familiar dengan bagaimana cara kerja traefik.

Meskipun ditulisan tersebut sudah kita bahas sedikit tentang mengapa menggunakan Traefik, ditulisan ini kita akan bahas lebih dalam seputar Traefik. Lalu diakhir tulisan kita akan mempraktikkan nya, oke?

The Edge Router

Internet adalah tentang bagaimana komputer saling terhubung, tentang bagaimana satu komputer berkomunikasi dengan komputer lainnya. Sama seperti manusia, untuk bisa berkomunikasi dengan lancar, kita memerlukan "cara yang disepakati kedua belah pihak", yakni bahasa yang sama-sama dimengerti.

Misalnya, orang Jawa akan nyambung bila berbicara bahasa Jawa dengan orang yang mengerti bahasa Jawa juga. Mereka secara tidak langsung sama-sama sepakat untuk berbicara menggunakan bahasa Jawa.

Di Internet, protokol yang biasa digunakan adalah TCP/IP, spesifiknya adalah HTTP untuk komunikasi antara komputer satu (client) dengan komputer lainnya (server). Singkatnya, client (browser) mengetikkan sebuah "identifier" yang biasa disebut domain address di address bar browser, lalu browser mencari alamat IP dari domain tersebut ke DNS, baru request akan diteruskan ke alamat IP yang dituju.

Tugas edge router adalah meneruskan request tersebut. Tentang siapa yang bertanggung jawab untuk request ini?

Gambar diatas adalah ilustrasi bagaimana client (cURL) ingin mengakses blog ini, yang mana dia membawa Request Header (yang ber-simbol >) dengan key Host yang bernilai alamat domain blog ini. Dan dari (salah satunya) header tersebutlah edge router tau "siapa" yang sekiranya bertanggung jawab terhadap request tersebut.

Dan dalam konteks disini, Traefik adalah Edge router kita!

The (auto) service discovery

Jika kita berbicara tentang "tradisional" web app (hmm, monolith?), ketika kita akses path /author dari suatu domain, pasti si "app" mencoba bertanya ke "application router" tentang siapa yang bertanggung jawab untuk path tersebut?

Beda dengan let's say microservices. Mungkin bisa saja path tersebut mengarah ke container lain, mesin lain, server lain. Alias, service lain.

Jika kita ambil contoh dengan yang monolith tadi, pada dasarnya routing sudah berada di level aplikasi, yang maksudnya, konteksnya berada di seputar aplikasi tersebut saja. Beda dengan si microservices yang memang routing nya bukan berada di level aplikasi, melainkan... Di edge router?

Ya, di level infra. Untuk bisa tau /author ini misalnya di handle oleh container dengan id 1fa3er21a9h1 , memangnya caranya gimana? Menggunakan cara tradisional "tembak port"? Jika port nya dinamis, apakah yakin menuju container yang kita inginkan? Apalagi yang menggunakan cluster, ke IP address mana kita harus nembaknya?

Disinilah peran Service Discovery, via Service Registry. Kita tidak akan berbicara panjang lebar tentang Service Discovery, karena Traefik menjanjikan proses discovery ini dilakukan secara automagically. Singkatnya, Traefik tau itu semua berdasarkan "karakteristik" yang diberikan oleh service itu sendiri.

"Karakteristik" tersebut disebut "rules". Dan kamu, memberikan karakteristik tersebut via "label" yang akan kita bahas lebih lanjut nanti.

OK, 2 hal tersebut (Edge router & auto service discovery) adalah 2 konsep dasar dari Traefik, mari sekarang kamu move on ke aku.

Ke fitur.

Fitur

Saya tidak akan membahas tentang "perbandingan" terhadap tools lain, mendingan mari kita bahas apa saja sih yang ditawarkan oleh Traefik ini?

Load Balancer

Load balancing adalah tentang bagaimana cara mengatur request yang ada terhadap kumpulan server secara efisien. Jika kamu hanya menggunakan 1 server, pastinya load balancer ini tidak akan berguna :))

Misal, kamu memiliki situs bernama bukalara.com. Server kamu hanya kuat menghandle 1000 request per-detik atau server akan memberikan response code 503 alias down. Cara untuk menanggulanginya adalah dengan membuat "instance baru". Kasarnya, bila kita membuat 3 instance, berarti sekarang bukalara.com bisa menghandle 3000 request per-detik.

Masalahnya, singkatnya ada 2. Pertama, bagaimana cara "mem-proxy" request-request tersebut ke "instance" kita yang mana berbeda-beda namun tetap 1 service? Kedua, bagaimana caranya agar request tersebut dihandle secara efisien (masa instance 1 handle 1500 req/s dan instance 2 handle 1500 req/s)?

Itulah tugasnya load balancer. Menjawab yang pertama, traefik akan mengaturnya secara... automagically! Buat instance sebanyak-banyaknya, maka traefik akan "meng-load-balance" nya ke instance yang berbeda-beda. Dan menjawab pertanyaan kedua, ada 2 algoritma yang didukung traefik: wrr (weighted round robin) dan drr (dynamic round robin).

Yang singkatnya, untuk wrr, bila 3 instance tersebut memiliki kriteria seperti berikut:

  • Instance 1, weight 4
  • Instance 2, weight 8
  • Instance 3, weight 6

Maka, setiap 4 request akan dikirim ke instance 1, dan 8 nya akan dikirim ke instance 2, dan 6 nya akan dikirim ke instance 3. Automagically by traefik. Sehingga, server akan tetap "balance" se-balance yang kita maksud.

Healthcheck

Harusnya namanya saja sudah merepresentasikan apa yang sebenarnya dilakukan. Singkatnya, healthcheck untuk melakukan pengecekan apakah service yang dimaksud tersebut "healthy" atau "unhealthy" (down).

Misal dengan cara melakukan request setiap n waktu ke endpoint yang sudah ditentukan dengan batas ambang n waktu. Misal, bila dalam 10 detik server tidak me-response, berarti kemungkinan service tersebut down.

Hanya cek saja.

Circuit Breaker

Kesalahan pasti akan terjadi, dan seringnya tidak terprediksi. Daripada pusing gambling menentukan kapan masalah itu akan datang, mendingan menyiapkan jalan keluar disaat masalah itu datang.

Bila healthcheck hanya tentang melakukan cek saja, circuit breaker adalah tentang jalan keluarnya. Sehingga, load balancer tidak meneruskan request ke container yang bermasalah/unhealthy secara berkelanjutan yang dapat menyebabkan penggunaan CPU yang meningkat dan membuat load balancing "tidak balance".

Bila healtcheck mungkin threshold nya ada di timeout, di circuit breaker salah satunya adalah di rasio total jumlah error response code (5xx)

Automatic SSL

Sooooo life saver! Thanks to Let's Encrypt, sekarang semua website bisa dengan mudah membuat & menggunakan sertifikat ssl!

Dan gratis :))

Jika biasanya kita menggunakan certbot untuk provisioning sertifikat ssl kita secara otomatis, dengan traefik, bisa lebih otomatis lagi. Jadi, ketika kita men-deploy service baru, endpoint tersebut akan langsung bisa diakses via protokol https tanpa harus melakukan "acme challenge" lagi secara manual.

My mind = bloon blown!

Sebenarnya masih banyak fitur-fitur lain yang ditawarkan oleh traefik (tracing, metrics, dll), disini kita akan fokus di 4 fitur tersebut terlebih dahulu biar sisanya bisa eksplor sendiri ya sayangku.

Praktik

Sekarang mari kita mulai praktik. Kamu bisa memulai menggunakan traefik dengan 3 cara: Via executable binary, Docker image, atau Helm (k8s).

Jadi, traefik membutuhkan provider yang kamu gunakan. Provider ini singkatnya adalah komponen "infra" yang kamu gunakan. Traefik saat ini mendukung 5 provider:

  • Docker
  • Kubernetes
  • Marathon
  • Rancher
  • File

Biar enak, mari kita menggunakan via Docker image aja.

Deploy the Traefik!

Kita disini akan menggunakan docker-compose karena menjalankan docker run blablabla bikin males dan membuat file .sh lebih males lagi. Pada dasarnya docker-compose adalah sebuah tool untuk menjalankan aplikasi docker yang menggunakan banyak container, yang dibagi-bagi menjadi/sebagai sebuah services.

Traefik adalah service pertama kita, minimal konfigurasi untuk membuat service adalah:

nama_service:
  image: <docker_image>

Mari kita buat service traefik kita (di file docker-compose.yml):

version: "3" # tell docker we use compose v3 okok

services:
  traefik: # our service name
    image: traefik:1.7 # stable version
    command:
      - --docker # we use docker as our provider, ok? remember lah
      - --api # tell traefik to expose the "dashboard" so we can ss it
    ports:
      - "80:80" # traefik (the edge router) port used (:80)
      - "8080:8080" # traefik (the dashboard) port used (:8080)
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock # mount docker socket to traefik so traefik can access the cluster (docker) API

Lalu kita "deploy" service tersebut dengan perintah berikut

docker-compose up -d traefik

Jika port 80 kamu sudah digunakan (biasanya oleh web server), kamu bisa mematikan terlebih dahulu service tersebut sehingga traefik bisa berjalan di port 80 (gak mungkin dong user harus akses situs kita seperti ini kan: https://108kb.io:8000)

Lalu bila sukses dan kita akses localhost:8080 maka seharusnya muncul dashboard traefik kita!

Bakal di-redirect ke locahost:8080/dashboard/ kok

Deploy another service!

Kita akan menggunakan example image nya dari traefik, yakni containous/whoami, sebuah "web app" untuk menampilkan beberapa informasi seperti Request Header, IP dari container tsb, dll.

whoami:
  image: containous/whoami

Lalu kita deploy dengan cara seperti biasa:

docker-compose up -d whoami

Lalu... Apa?

Kita belum ngasih tau "provider" alias si docker ini tentang "karakteristik" atau "rules" (masih ingat, kan?). Untuk ngasih tau traefik si service whoami ini karakteristiknya apa, mari kita tambahkan "labels" di file docker-compose.yml kita.

labels:
  - "traefik.frontend.rule=Host: whoami.docker.localhost"

Label diatas intinya adalah Jika ada request ke Host: whoami.docker.localhost, maka container inilah harusnya yang ngehandle!

Atau bisa langsung di akses di browser (klo di kamu bisa ya)

Sama kan seperti yg versi curl? (Dominannya beda di user agent string aja)

Sekarang kita coba Load Balancer nya, kita buat 3 instance untuk service ini.

docker-compose up -d --scale whoami=3

Kita lihat instance kita:

Sekarang kita coba lakukan request lagi ke endpoint sebelumnya

Dan lihat ke bagian Hostname (yang sudah di highlight), nilainya berbeda-beda kan setiap request? Yang berarti, load balancer kita sudah berjalan sesuai dengan yang kita harapkan!

Begitupula via Path :))

whoareyou:
  image: containous/whoami
  labels:
    - "traefik.frontend.rule=Host: youare.docker.localhost; Path:/nice"

Hasilnya:

Bagaimana bila ingin menggunakan SSL?

Pertama, Let's Encrypt (dan semua non-self-assigned ssl certificate) tidak mendukung localhost. Kedua, bila ingin mencoba di "real" domain kamu, kamu tinggal tambahkan beberapa command ini di service traefik mu:

  - --acme.email=your_email@domain.tld
  - --acme.storage=acme.json
  - --acme.onHostRule=true
  - --acme.entryPoint=https
  - --acme.httpchallenge.entrypoint=http

Dan mount certificate nya ke traefik

volumes:
  - ...
  - ${pwd}/acme.json:/acme.json

Restart, maka semua services yang memiliki Host harusnya bisa diakses via HTTPS! Contohnya... Blog ini?


Semoga dengan tulisan ini sudah mengerti sedikit tentang konsep dasar traefik, fitur-fiturnya, dan alasannya mengapa menggunakan traefik. Jika menemukan kesalahan, typo, ataupun ada yang masih membingungkan, bisa japri aja telegramku masih yang lama kok.

Atau bisa langsung kirim di kolom komentar, you are welcome.

File docker-compose.yml final nya ada disini.

Thanks for stopping by.