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
Ý kiến trên Hacker News
Cách dùng thuật ngữ "deploy" gây nhầm lẫ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
Kamal Proxy tồn tại để giải quyết các vấn đề của Docker Swarm
Muốn biết vì sao Kamal lại chọn Swarm
Chưa dùng Kamal Proxy, nhưng hoài nghi vì vấn đề hỗ trợ
Có vẻ đây là việc mà HAProxy có thể làm rất dễ dàng
Muốn biết liệu nó có triển khai mẫu "tạm dừng lưu lượng" hay không
Muốn biết ZDD (triển khai không downtime) hoạt động như thế nào
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
docker compose up --build --force-recreate weblàm mọi thứ trở nên vô nghĩaMuốn biết có cách nào đặt timeout hay không
Đây là hội chứng NIH (Not Invented Here)