🚦 Hướng dẫn cài đặt và cấu hình Kong Cluster cho người mới bắt đầu
Tổng quan về Kong Cluster
Kong Cluster là một giải pháp mạnh mẽ cho việc quản lý API, cho phép chạy nhiều nút Kong gateway song song. Điều này mang lại lợi ích lớn cho việc phân phối tải và đảm bảo tính khả dụng cao.
Khái niệm cơ bản về Kong Cluster
Trong thực tế, một Kong Cluster có nghĩa là bạn sẽ chạy nhiều nút Kong gateway cạnh nhau, từ đó có thể:
- Phân phối tải giữa các nút (điều này giúp tăng hiệu suất), và
- Đảm bảo hoạt động liên tục ngay cả khi một nút gặp sự cố.
Trong cấu hình của bạn:
- kong-1 và kong-2 là hai nút gateway.
- Chúng chia sẻ cùng một cơ sở dữ liệu Postgres (cơ sở dữ liệu
kong-ce-database) để đọc/ghi cùng một cấu hình. - HAProxy (dịch vụ
haproxy) đứng ở phía trước để phân phối các yêu cầu đến kong-1 và kong-2.
Lợi ích của việc sử dụng Load Balancer với Kong
Sử dụng một load balancer (LB) như HAProxy mang lại những lợi ích sau:
- Phân phối các yêu cầu đến các nút (mặc định là round-robin).
- Kiểm tra tình trạng hoạt động của từng nút và dừng gửi lưu lượng đến các nút không khỏe (tự động chuyển đổi khi có sự cố).
- Cung cấp cho bạn một điểm cuối ổn định để các ứng dụng kết nối (không cần phải xử lý nhiều máy chủ Kong ở phía ứng dụng).
Cấu trúc docker-compose.yml hiện tại
Bạn đã thực hiện 90% công việc. Dưới đây là những gì đã được thiết lập:
- Postgres 13 cho Kong (chế độ DB)
- Các bản di chuyển một lần
- Hai nút Kong (cổng admin/proxy khác nhau)
- HAProxy (cửa ra chính)
- Mongo + Konga (giao diện người dùng thân thiện)
- (Tùy chọn) Kong Dashboard
Chúng ta sẽ thêm:
- Một tệp cấu hình HAProxy (bao gồm
X-Served-By+ LB admin), - Hai dịch vụ upstream nhỏ để trình diễn khả năng chuyển đổi khi gặp sự cố (httpbin), và
- Một upstream Kong với kiểm tra tình trạng hoạt động.
Bước 1: Cấu hình HAProxy cho việc cân bằng tải các nút Kong
Tạo tệp ./haproxy/haproxy.cfg bên cạnh tệp compose của bạn:
global
maxconn 4096
defaults
mode tcp
timeout connect 5s
timeout client 30s
timeout server 30s
frontend fe_proxy
bind *:9200
mode http
option forwardfor
default_backend be_kong
backend be_kong
mode http
balance roundrobin
http-response add-header X-Served-By %[srv_name]
server kong1 kong-1:8000 check inter 2000 rise 3 fall 2
server kong2 kong-2:18000 check inter 2000 rise 3 fall 2
frontend fe_admin
bind *:9201
mode http
default_backend be_admin
backend be_admin
mode http
option httpchk GET /
balance roundrobin
server kong1 kong-1:8001 check inter 2000 rise 3 fall 2
server kong2 kong-2:18001 check inter 2000 rise 3 fall 2
- Điều này sẽ mở ra http://localhost:9200 (proxy LB) và http://localhost:9201 (admin LB).
- LB proxy sẽ chèn
X-Served-Byđể bạn có thể thấy nút Kong nào đã xử lý yêu cầu.
Bước 2: Cấu hình đầy đủ docker-compose.yml
Lưu tệp sau đây như tệp compose của bạn (nó là bản gốc của bạn, cộng với: cổng HAProxy 9201 và hai dịch vụ httpbin).
# Cấu hình DB Kong (CE/OSS)
x-kong-config: &kong-env
KONG_DATABASE: postgres
KONG_PG_HOST: kong-ce-database
KONG_PG_DATABASE: kong
KONG_PG_USER: kong
KONG_PG_PASSWORD: kong
services:
kong-ce-database:
image: postgres:13
container_name: kong-ce-database
environment:
POSTGRES_USER: kong
POSTGRES_DB: kong
POSTGRES_PASSWORD: kong
volumes:
- kong_db_data:/var/lib/postgresql/data
networks: [kong-ce-net]
ports:
- "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U kong -d kong"]
interval: 10s
timeout: 5s
retries: 20
restart: unless-stopped
kong-migrations:
image: kong:3.9.1
container_name: kong-migrations
depends_on:
kong-ce-database:
condition: service_healthy
environment:
<<: *kong-env
entrypoint: >
/bin/sh -lc
"kong migrations bootstrap -v || (kong migrations up -v && kong migrations finish -v)"
networks: [kong-ce-net]
restart: "no"
kong-1:
image: kong:3.9.1
container_name: kong-1
depends_on:
kong-ce-database:
condition: service_healthy
kong-migrations:
condition: service_completed_successfully
environment:
<<: *kong-env
KONG_ADMIN_LISTEN: "0.0.0.0:8001,0.0.0.0:8444 ssl"
ports:
- "8000:8000"
- "8443:8443"
- "8001:8001"
- "8444:8444"
healthcheck:
test: ["CMD", "kong", "health"]
networks: [kong-ce-net]
restart: unless-stopped
kong-2:
image: kong:3.9.1
container_name: kong-2
depends_on:
kong-ce-database:
condition: service_healthy
kong-migrations:
condition: service_completed_successfully
environment:
<<: *kong-env
KONG_ADMIN_LISTEN: "0.0.0.0:18001,0.0.0.0:18444 ssl"
KONG_PROXY_LISTEN: "0.0.0.0:18000,0.0.0.0:18443 ssl"
ports:
- "8002:18000"
- "18443:18443"
- "18001:18001"
- "18444:18444"
healthcheck:
test: ["CMD", "kong", "health"]
networks: [kong-ce-net]
restart: unless-stopped
haproxy:
image: haproxy:2.9
container_name: kong-haproxy
networks: [kong-ce-net]
depends_on:
kong-1:
condition: service_started
kong-2:
condition: service_started
ports:
- "9200:9200"
- "9201:9201"
volumes:
- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
command: ["/usr/local/sbin/haproxy","-f","/usr/local/etc/haproxy/haproxy.cfg","-db"]
restart: unless-stopped
mongo:
image: mongo:4.4
container_name: mongo
volumes:
- mongo_data:/data/db
networks: [kong-ce-net]
ports:
- "27017:27017"
healthcheck:
test: ["CMD", "mongo", "--eval", "db.runCommand({ ping: 1 })"]
interval: 10s
timeout: 5s
retries: 20
restart: unless-stopped
konga-prepare:
image: pantsel/konga:latest
container_name: konga-prepare
depends_on:
mongo:
condition: service_healthy
command: -c prepare -a mongo -u mongodb://mongo:27017/konga
networks: [kong-ce-net]
restart: "no"
konga:
image: pantsel/konga:latest
container_name: konga
depends_on:
mongo:
condition: service_healthy
konga-prepare:
condition: service_completed_successfully
environment:
DB_ADAPTER: mongo
DB_HOST: mongo
DB_PORT: 27017
DB_DATABASE: konga
NODE_ENV: production
ports:
- "1337:1337"
networks: [kong-ce-net]
restart: unless-stopped
kongdash:
image: pgbi/kong-dashboard:v2
container_name: kongdash
command: ["start", "--kong-url", "http://kong-1:8001"]
depends_on:
kong-1:
condition: service_started
ports:
- "8085:8080"
networks: [kong-ce-net]
restart: unless-stopped
httpbin1:
image: mccutchen/go-httpbin:v2.15.0
container_name: httpbin1
networks: [kong-ce-net]
restart: unless-stopped
httpbin2:
image: mccutchen/go-httpbin:v2.15.0
container_name: httpbin2
networks: [kong-ce-net]
restart: unless-stopped
volumes:
kong_db_data: {}
mongo_data: {}
networks:
kong-ce-net:
driver: bridge
Khởi động mọi thứ:
docker compose up -d
Bước 3: Cấu hình Kong thông qua Admin API cho việc failover upstream
Chúng ta sẽ tạo:
- Một Upstream (tên logic) với
- Hai Targets (
httpbin1&httpbin2), cộng thêm - kiểm tra tình trạng hoạt động để Kong có thể tự động loại bỏ một target không tốt,
- Một Service chỉ đến upstream, và
- Một Route để xuất ra.
3.1 Tạo Upstream với kiểm tra tình trạng
curl -sS -X POST http://localhost:8001/upstreams \
-H "Content-Type: application/json" \
-d '{
"name": "demo-upstream",
"healthchecks": {
"active": {
"http_path": "/status/200",
"timeout": 1,
"healthy": { "interval": 5, "successes": 1 },
"unhealthy": { "interval": 5, "http_failures": 1, "tcp_failures": 1, "timeouts": 1 }
}
}
}'
3.2 Đăng ký hai targets
curl -sS -X POST http://localhost:8001/upstreams/demo-upstream/targets \
-H "Content-Type: application/json" \
-d '{"target":"httpbin1:8080","weight":100}'
curl -sS -X POST http://localhost:8001/upstreams/demo-upstream/targets \
-H "Content-Type: application/json" \
-d '{"target":"httpbin2:8080","weight":100}'
3.3 Tạo một Service sử dụng upstream
curl -sS -X POST http://localhost:8001/services \
-H "Content-Type: application/json" \
-d '{"name":"demo-svc","host":"demo-upstream","port":8080,"protocol":"http"}'
3.4 Xuất ra với một Route
curl -sS -X POST http://localhost:8001/services/demo-svc/routes \
-H "Content-Type: application/json" \
-d '{"name":"demo-route","paths":["/demo"]}'
Điểm cuối ứng dụng của bạn (thông qua HAProxy → Kong) là:
http://localhost:9200/demo/get
Kiểm tra cơ bản:
curl -i http://localhost:9200/demo/get
# mong đợi 200 + tiêu đề X-Served-By từ HAProxy: kong1 hoặc kong2
Cấu hình Konga (giao diện người dùng)
- Mở http://localhost:1337 và tạo người dùng admin.
- Thêm một Connection (chỉ định Konga đến admin LB):
Trong Konga -> CONNECTIONS -> Nhấn nút [+ NEW CONNECTION]
Nhập thông tin sau:
- Name:
Haproxy-LB - Kong Admin URL:
http://localhost:9201 - Username: Tên người dùng Konga của bạn
- Password: Mật khẩu Konga của bạn
- Trong Konga, bạn có thể xây dựng cùng các đối tượng thông qua giao diện người dùng:
- Upstreams → Thêm Upstream (
demo-upstream) - Targets → Thêm Target (
httpbin1:8080,httpbin2:8080) - Services → Thêm Service (
demo-svc, host:demo-upstream, port8080) - Routes → Thêm Route (
demo-route, paths:/demo)
Kiểm tra tính năng failover hoạt động
A) Failover nút Gateway
Xem nút nào đã phục vụ bạn:
curl -i http://localhost:9200/status | grep -i X-Served-By
Dừng một nút Kong:
docker stop kong-1
for i in {1..6}; do curl -sI http://localhost:9200/status | grep -i X-Served-By; done
# mong đợi chỉ kong2 bây giờ
docker start kong-1
B) Failover target upstream
Kiểm tra tình trạng sức khỏe:
curl -sS http://localhost:8001/upstreams/demo-upstream/health | jq .
Dừng một target:
docker stop httpbin1
Gọi vẫn trả về 200 (được phục vụ bởi httpbin2):
for i in {1..6}; do curl -s -o /dev/null -w "%{http_code}\n" http://localhost:9200/demo/get; done
Một số mẹo khắc phục sự cố nhanh
- Konga không thể truy cập Admin API? Sử dụng admin LB:
http://localhost:9201. - HAProxy 503? Kiểm tra nhật ký
haproxyvà xác minh các admin & proxy:
curl http://localhost:8001/status
curl http://localhost:18001/status
Tóm tắt
- Bạn đã xây dựng một Kong cluster hai nút (OSS) chia sẻ một cơ sở dữ liệu Postgres.
- Sử dụng HAProxy cho việc cân bằng tải và chuyển đổi khi gặp sự cố (proxy
:9200, admin:9201vớiX-Served-By). - Tạo một Kong Upstream với kiểm tra tình trạng hoạt động cho việc chuyển đổi giữa hai target.
- Konga làm giao diện quản lý thân thiện.