0
0
Lập trình
Admin Team
Admin Teamtechmely

Hướng dẫn cài đặt và cấu hình Kong Cluster

Đăng vào 7 tháng trước

• 9 phút đọc

🚦 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-1kong-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:

  1. Một tệp cấu hình HAProxy (bao gồm X-Served-By + LB admin),
  2. Hai dịch vụ upstream nhỏ để trình diễn khả năng chuyển đổi khi gặp sự cố (httpbin), và
  3. 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:

Copy
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

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).

Copy
# 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ứ:

Copy
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

Copy
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

Copy
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

Copy
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

Copy
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à:

Copy
http://localhost:9200/demo/get

Kiểm tra cơ bản:

Copy
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)

  1. Mở http://localhost:1337 và tạo người dùng admin.
  2. 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
  1. 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, port 8080)
  • 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:

Copy
curl -i http://localhost:9200/status | grep -i X-Served-By

Dừng một nút Kong:

Copy
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:

Copy
curl -sS http://localhost:8001/upstreams/demo-upstream/health | jq .

Dừng một target:

Copy
docker stop httpbin1

Gọi vẫn trả về 200 (được phục vụ bởi httpbin2):

Copy
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ý haproxy và xác minh các admin & proxy:
Copy
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 :9201 với X-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.
Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào