3 poin oleh GN⁺ 2024-09-22 | 1 komentar | Bagikan ke WhatsApp

Kamal Proxy - mendukung deployment tanpa downtime dengan proxy HTTP minimal

Fitur

  • Kamal Proxy adalah proxy HTTP yang dirancang agar dapat dengan mudah mengorkestrasi deployment tanpa downtime
  • Dengan menjalankan aplikasi web di belakang Kamal Proxy, perubahan dapat dideploy tanpa mengganggu trafik yang sedang berlangsung
  • Dapat bekerja tanpa kerja sama khusus dari aplikasi
  • Dirancang sebagai bagian dari Kamal, tetapi juga dapat digunakan secara mandiri atau bersama alat deployment lain

Gambaran singkat

  • Untuk menjalankan instance proxy, gunakan perintah kamal-proxy run
  • Tidak ada file konfigurasi, tetapi jika nilai bawaan tidak sesuai dengan aplikasi, Anda dapat menentukan opsi
  • Misalnya, untuk menjalankan proxy di port selain port bawaan 80: kamal-proxy run --http-port 8080
  • Untuk melihat daftar opsi lengkap, jalankan kamal-proxy help run

Routing trafik

  • Untuk merutekan trafik ke aplikasi web melalui proxy, deploy instance aplikasi ke proxy dengan deploy
  • Saat instance dideploy, instance tersebut menjadi tersedia untuk digunakan proxy dan menggantikan instance yang sebelumnya digunakan
  • Saat menentukan instance, gunakan format hostname:port
  • Contoh: kamal-proxy deploy service1 --target web-1:3000
  • Proxy akan mendaftarkan web-1:3000 dengan nama layanan service1 dan segera memulai health check HTTP
  • Jika instance tidak menjadi sehat dalam waktu tertentu, perintah deploy akan membatalkan deployment dan mengembalikan kode keluar tidak normal
  • Setiap deployment mengambil alih seluruh trafik dari instance yang sebelumnya dideploy
  • Begitu instance baru sehat, seluruh trafik baru akan dirutekan ke instance tersebut
  • Perintah deploy menunggu hingga trafik pada instance sebelumnya benar-benar habis
  • Karena itu, jika deploy berhasil dikembalikan, instance lama dapat dihapus tanpa memutus request yang sedang berjalan
  • Trafik tidak akan dirutekan hingga instance baru menjadi sehat, dan instance lama baru dihapus setelah trafiknya benar-benar habis, sehingga deployment tanpa downtime dimungkinkan

Routing berbasis host

  • Dengan routing berbasis host, beberapa aplikasi dapat dijalankan di server yang sama
  • Saat mendeploy instance, Anda dapat menentukan host yang akan dilayani trafik
  • Contoh: kamal-proxy deploy service1 --target web-1:3000 --host app1.example.com
  • Instance yang dideploy dengan cara ini hanya akan menerima trafik untuk host yang ditentukan
  • Dengan mendeploy instance unik untuk tiap host, beberapa aplikasi dapat dijalankan di server yang sama tanpa konflik port
  • Host tertentu hanya dapat merutekan satu layanan pada satu waktu
  • Misalnya, jika setelah kamal-proxy deploy service1 --target web-1:3000 --host app1.example.com Anda menjalankan kamal-proxy deploy service2 --target web-2:3000 --host app1.example.com, akan terjadi error
  • Jika Anda menjalankan kamal-proxy remove service1 lalu kamal-proxy deploy service2 --target web-2:3000 --host app1.example.com, maka akan berhasil

TLS otomatis

  • Kamal Proxy dapat secara otomatis memperoleh dan memperbarui sertifikat TLS untuk aplikasi
  • Fitur ini dapat diaktifkan dengan menambahkan flag --tls saat mendeploy instance
  • Contoh: kamal-proxy deploy service1 --target web-1:3000 --host app1.example.com --tls

Menentukan opsi run dengan variabel lingkungan

  • Di lingkungan seperti saat dijalankan dalam container Docker, mungkin lebih praktis menentukan opsi run menggunakan variabel lingkungan
  • Misalnya, untuk mengatur port HTTP: kamal-proxy run --http-port 8080 atau HTTP_PORT=8080 kamal-proxy run
  • Jika variabel lingkungan bentrok dengan yang lain, Anda dapat membedakannya dengan menambahkan prefiks KAMAL_PROXY_
  • Contoh: KAMAL_PROXY_HTTP_PORT=8080 kamal-proxy run

Build

  • Jika lingkungan Go sudah disiapkan, Anda dapat membangun Kamal Proxy secara lokal: make
  • Atau membangunnya dengan container Docker: make docker

Mencobanya

  • Anda dapat mencoba perintah proxy dengan melihat konfigurasi Docker Compose di folder contoh

Ringkasan GN⁺

  • Kamal Proxy adalah proxy HTTP minimal yang mendukung deployment tanpa downtime dan dapat bekerja tanpa kerja sama khusus dari aplikasi
  • Menyediakan routing berbasis host dan TLS otomatis sehingga beberapa aplikasi dapat dijalankan di server yang sama
  • Opsi run dapat ditentukan melalui variabel lingkungan sehingga berguna di lingkungan seperti Docker
  • Untuk deployment tanpa downtime, trafik dirutekan ke instance baru dan sistem menunggu hingga trafik pada instance lama benar-benar habis
  • Proyek dengan fungsi serupa antara lain NGINX dan HAProxy

1 komentar

 
GN⁺ 2024-09-22
Opini Hacker News
  • Penggunaan istilah 'deploy' membingungkan

    • Istilah seperti 'bind', 'intercept', atau 'proxy' tampaknya lebih tepat
  • Membangun seluruh sistem demi deployment tanpa downtime terasa berlebihan

    • Deployment tanpa downtime juga bisa dilakukan hanya dengan aplikasi + proxy web yang mendukung Unix socket
  • Kamal Proxy ada untuk menyelesaikan masalah di Docker Swarm

    • Di Cloud 66, mereka menggunakan Caddy dan Traefik
  • Penasaran kenapa Kamal memilih Swarm

    • Mungkin karena kesederhanaannya
    • Kompleksitas tidak bisa benar-benar disembunyikan, dan akhirnya jadi membuat proxy sendiri
  • Belum pernah mencoba Kamal Proxy, tetapi skeptis karena masalah dukungan

    • Perlu dukungan untuk WebSockets, SSE, HTTP/3, serta berbagai kompresi dan enkripsi
  • Rasanya ini hal yang bisa dilakukan HAProxy dengan mudah

    • Ada fitur hitless reload
  • Penasaran apakah ini mengimplementasikan pola 'traffic pause'

    • Trafik bisa dijeda selama beberapa detik untuk melakukan perubahan infrastruktur
  • Penasaran bagaimana deployment tanpa downtime (ZDD) bekerja

    • Dua versi aplikasi berjalan bersamaan, lalu trafik baru diarahkan ke versi baru
    • Penasaran bagaimana masalah migrasi DB ditangani
  • Kamal 2 akan mendukung auto-SSL, dan memudahkan menjalankan banyak aplikasi di satu server

  • Cara penggunaannya tidak terlalu jelas

    • Menurut contoh, ini menjalankan 4 replika layanan 'web'
    • Untuk deployment tanpa downtime, seharusnya deploy ke target baru
    • Perintah docker compose up --build --force-recreate web membatalkan semuanya
    • Perlu panduan yang lebih jelas
  • Penasaran apakah ada cara untuk mengatur timeout

  • Ini sindrom NIH (Not Invented Here)