3 điểm bởi GN⁺ 2024-09-22 | 1 bình luận | Chia sẻ qua WhatsApp

Kamal Proxy - hỗ trợ triển khai không gián đoạn với một proxy HTTP tối giản

Tính năng

  • Kamal Proxy là một proxy HTTP, được thiết kế để dễ dàng điều phối triển khai không gián đoạn
  • Khi chạy ứng dụng web phía sau Kamal Proxy, có thể triển khai thay đổi mà không làm gián đoạn lưu lượng đang diễn ra
  • Có thể hoạt động mà không cần sự phối hợp đặc biệt từ ứng dụng
  • Được thiết kế như một phần của Kamal, nhưng cũng có thể dùng độc lập hoặc cùng với các công cụ triển khai khác

Tổng quan nhanh

  • Để chạy một instance proxy, dùng lệnh kamal-proxy run
  • Không có tệp cấu hình, nhưng có thể chỉ định tùy chọn nếu giá trị mặc định không phù hợp với ứng dụng
  • Ví dụ, để chạy proxy trên cổng khác thay vì cổng mặc định 80: kamal-proxy run --http-port 8080
  • Để xem toàn bộ danh sách tùy chọn, chạy kamal-proxy help run

Định tuyến lưu lượng

  • Để định tuyến lưu lượng tới ứng dụng web thông qua proxy, hãy deploy một instance ứng dụng vào proxy
  • Khi deploy một instance, instance đó sẽ sẵn sàng để proxy sử dụng và thay thế instance đang được dùng trước đó
  • Khi chỉ định instance, sử dụng định dạng hostname:port
  • Ví dụ: kamal-proxy deploy service1 --target web-1:3000
  • Proxy sẽ đăng ký web-1:3000 dưới tên dịch vụ service1 và ngay lập tức bắt đầu kiểm tra tình trạng HTTP
  • Nếu instance không trở nên healthy trong khoảng thời gian quy định, lệnh deploy sẽ hủy triển khai và trả về mã thoát lỗi
  • Mỗi lần deploy sẽ tiếp nhận toàn bộ lưu lượng từ instance đã được deploy trước đó
  • Khi instance mới trở nên healthy, mọi lưu lượng mới sẽ được định tuyến tới instance đó
  • Lệnh deploy sẽ chờ cho đến khi lưu lượng ở instance cũ được xả hết hoàn toàn
  • Vì vậy, khi deploy trả về thành công, có thể gỡ bỏ instance cũ mà không làm gián đoạn các request đang diễn ra
  • Lưu lượng sẽ không được định tuyến cho đến khi instance mới trở nên healthy, và instance cũ chỉ bị gỡ sau khi lưu lượng được xả hết hoàn toàn, nhờ đó có thể triển khai không gián đoạn

Định tuyến theo host

  • Định tuyến theo host cho phép chạy nhiều ứng dụng trên cùng một máy chủ
  • Khi deploy instance, có thể chỉ định host sẽ phục vụ lưu lượng
  • Ví dụ: kamal-proxy deploy service1 --target web-1:3000 --host app1.example.com
  • Instance được deploy theo cách này sẽ chỉ nhận lưu lượng cho host đã chỉ định
  • Có thể deploy các instance riêng cho từng host để chạy nhiều ứng dụng trên cùng một máy chủ mà không bị xung đột cổng
  • Một host cụ thể chỉ có thể được định tuyến tới một dịch vụ tại một thời điểm
  • Ví dụ: sau khi chạy kamal-proxy deploy service1 --target web-1:3000 --host app1.example.com, nếu chạy kamal-proxy deploy service2 --target web-2:3000 --host app1.example.com thì sẽ phát sinh lỗi
  • Sau kamal-proxy remove service1, nếu chạy kamal-proxy deploy service2 --target web-2:3000 --host app1.example.com thì sẽ thành công

TLS tự động

  • Kamal Proxy có thể tự động lấy và gia hạn chứng chỉ TLS cho ứng dụng
  • Có thể bật tính năng này bằng cách thêm cờ --tls khi deploy instance
  • Ví dụ: kamal-proxy deploy service1 --target web-1:3000 --host app1.example.com --tls

Chỉ định tùy chọn run bằng biến môi trường

  • Trong những môi trường như khi chạy trong container Docker, việc dùng biến môi trường để chỉ định các tùy chọn run có thể thuận tiện hơn
  • Ví dụ, để thiết lập cổng HTTP: kamal-proxy run --http-port 8080 hoặc HTTP_PORT=8080 kamal-proxy run
  • Nếu biến môi trường bị xung đột với biến khác, có thể phân biệt bằng cách thêm tiền tố KAMAL_PROXY_
  • Ví dụ: KAMAL_PROXY_HTTP_PORT=8080 kamal-proxy run

Build

  • Nếu đã thiết lập môi trường Go, có thể build Kamal Proxy cục bộ bằng: make
  • Hoặc có thể build bằng container Docker: make docker

Thử dùng

  • Có thể thử các lệnh proxy bằng cách xem cấu hình Docker Compose trong thư mục ví dụ

Tóm tắt của GN⁺

  • Kamal Proxy là một proxy HTTP tối giản hỗ trợ triển khai không gián đoạn và có thể hoạt động mà không cần sự phối hợp đặc biệt từ ứng dụng
  • Cung cấp định tuyến theo host và TLS tự động để có thể chạy nhiều ứng dụng trên cùng một máy chủ
  • Có thể chỉ định tùy chọn run bằng biến môi trường, hữu ích trong các môi trường như Docker
  • Để triển khai không gián đoạn, nó định tuyến lưu lượng sang instance mới và chờ cho đến khi lưu lượng ở instance cũ được xả hết hoàn toàn
  • Các dự án cung cấp tính năng tương tự gồm có NGINX, HAProxy, v.v.

1 bình luận

 
GN⁺ 2024-09-22
Ý kiến trên Hacker News
  • Cách dùng thuật ngữ "deploy" gây nhầm lẫn

    • Có vẻ các thuật ngữ như "bind", "intercept", "proxy" sẽ phù hợp hơn
  • Xây cả một hệ thống hoàn chỉnh chỉ để triển khai không gián đoạn là quá mức cần thiết

    • Chỉ với ứng dụng + web proxy hỗ trợ Unix socket cũng có thể triển khai không gián đoạn
  • Kamal Proxy tồn tại để giải quyết các vấn đề của Docker Swarm

    • Ở Cloud 66, họ đã dùng Caddy và Traefik
  • Muốn biết vì sao Kamal lại chọn Swarm

    • Có thể là vì sự đơn giản
    • Không thể che giấu sự phức tạp, và cuối cùng vẫn phải tự làm proxy riêng
  • Chưa dùng Kamal Proxy, nhưng hoài nghi vì vấn đề hỗ trợ

    • Cần hỗ trợ WebSockets, SSE, HTTP/3, nhiều kiểu nén và mã hóa khác nhau
  • Có vẻ đây là việc mà HAProxy có thể làm rất dễ dàng

    • Nó có tính năng hitless reload
  • Muốn biết liệu nó có triển khai mẫu "tạm dừng lưu lượng" hay không

    • Có thể tạm dừng lưu lượng trong vài giây để thực hiện thay đổi hạ tầng
  • Muốn biết ZDD (triển khai không downtime) hoạt động như thế nào

    • Hai phiên bản của ứng dụng cùng chạy đồng thời, và lưu lượng mới được định tuyến sang phiên bản mới
    • Muốn biết vấn đề migration cơ sở dữ liệu được xử lý ra sao
  • Kamal 2 sẽ hỗ trợ auto-SSL và giúp chạy nhiều ứng dụng trên một máy chủ dễ dàng hơn

  • Không hiểu cách sử dụng

    • Theo ví dụ thì nó khởi động 4 bản sao của dịch vụ "web"
    • Để triển khai không gián đoạn thì phải triển khai sang target mới
    • Lệnh docker compose up --build --force-recreate web làm mọi thứ trở nên vô nghĩa
    • Cần hướng dẫn rõ ràng hơn
  • Muốn biết có cách nào đặt timeout hay không

  • Đây là hội chứng NIH (Not Invented Here)