Coding Gun

จัดการกับ Kong แบบง่ายๆด้วย Konga

Konga คือ Open-source software ที่เราสามารถจัดการกับ Configuration ของ Kong ผ่านทาง GUI(graphical user interface)

จริงๆถ้าเราไม่มี Konga เราก็สามารถจัดการกับ Kong ผ่านทาง Admin API ได้อยู่แล้ว(โดย default จะผ่าน port 8001 และ 8444) แต่จะทำงานได้ยากมากๆ ตัว Admin API จะเหมาะสำหรับการทำงานแบบอัตโนมติเท่านั้น

และถ้าใครใช้ Kong Enterprise ก็ไม่จำเป็นต้องใช้ Konga เพราะคุณจะมี Kong Manager ให้ใช้งานอยู่แล้ว แต่ถ้าใครยังไม่มี license ของ Kong Enterprise คุณก็ต้องใช้ Konga ในการทำงาน

เริ่มต้นใช้งาน Konga ด้วย Docker Compose

ก่อนอื่นเราต้องสร้าง Kong และ Konga ขึ้นมาก่อนด้วย docker-compose.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
version: '3.7'
services:
  kong-database:
    image: postgres
    container_name: kong-postgres
    restart: on-failure
    volumes:
      - kong_data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: kong
      POSTGRES_PASSWORD: ${KONG_PG_PASSWORD:-kong}
      POSTGRES_DB: kong
    ports:
      - "5432:5432"
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "kong"]
      interval: 30s
      timeout: 30s
      retries: 3

  kong:
    build:
      context: .
      dockerfile: kong.Dockerfile
    environment:
      KONG_DATABASE: postgres
      KONG_PG_HOST: kong-database
      KONG_PG_DATABASE: kong
      KONG_PG_USER: kong
      KONG_PG_PASSWORD: ${KONG_PG_PASSWORD:-kong}
      KONG_PROXY_LISTEN: 0.0.0.0:8000, 0.0.0.0:8443 ssl
      KONG_PROXY_LISTEN_SSL: 0.0.0.0:8443
      KONG_ADMIN_LISTEN: 0.0.0.0:8001
    depends_on:
      - kong-database
    healthcheck:
      test: ["CMD", "kong", "health"]
      interval: 10s
      timeout: 10s
      retries: 10
    ports:
      - 8000:8000
      - 8001:8001
      - 8443:8443
      - 8444:8444
  kong-ui:
    image: pantsel/konga:latest
    ports:
      - 1337:1337
  
  product-service:
    build:
      context: .
      dockerfile: product.Dockerfile
    ports:
      - 3000:3000
    tty: true

  order-service:
    build:
      context: .
      dockerfile: order.Dockerfile
    ports:
      - 8087:8087

volumes:
  kong_data: {}

คุณสามารถดูตัวอย่างไฟล์ทั้งหมดได้ที่ https://github.com/irobust/MicroservicesDemo/tree/main/04-API-Gateway

หลังจากนั้นคุณจะสามารถเข้าไปดู Konga ได้ที่ http://localhost:1337

เริ่มต้นสร้าง Connection

เริ่มต้นการใช้งานคุณต้องทำการสร้าง Admin Account เพื่อสำหรับ Sign in เข้าใช้งานก่อน

“Get Start to Konga”
กรอกข้อมูลเพื่อสร้าง Account
หลังจากสร้าง accout สำหรับเข้าใช้งาน Konga เรียบร้อยแล้วเราก็ Login เข้า Kong ดังรูป
“Sign-in to Konga”
นำ Username และ Password ที่สร้างไว้มาทำการ Sign-in

หลังจากที่เรา Login เข้าไปหน้า Home ของ Konga จะยังไม่มีเมนูสำหรับจัดการกับ Kong อยู่เลยเนื่องจาก Konga ยังไม่ได้เชื่อมต่อกับ Kong ดังนั้นในขั้นตอนนี้เราจึงต้องสร้าง Connection โดยระบุ URL ของ Kong Admin API

“Konga Create connection to kong”
สร้าง Connection ไปที่ Kong โดยผ่านทาง Admin port คือ Port: 8001

ถ้าเราสามารถ Connect กับ Kong ได้เราก็จะเห็นหน้า Dashboard ที่จะแสดงจำนวน Connections ดังรูป

“Kanga Dashboard”
Dashboard แสดงข้อมูลของ Connection ที่ Actived อยู่

เนื่องจาก Konga เป็น Client Application ที่ีสามารถเชื่อมต่อกับ Kong Server ที่ไหนก็ได้ ไม่จำเป็นต้องอยู่ในเครื่องเดียวกับ Konga และนอกจากนี้เรายังสามารถเพิ่ม Connection เข้าไปได้เรื่อยๆ แต่ Connection ที่เราได้สร้างไว้จะเก็บไว้ใน localDisk เท่านั้น แต่ถ้าเราต้องการเก็บ Connection ไว้ใน Database เราสามารถเลือกให้ Konga เชื่อมกับ Database ที่ konga supported ดังนี้

Kong จะเชื่อมต่อกับ Database ได้โดยการกำหนดตัวแปรต่างๆเหล่านี้ ในไฟล์ .env

  • DB_ADAPTER
  • DB_URL
  • DB_PORT
  • DB_DATABASE
  • DB_USER
  • DB_PASSWORD

สร้าง Route เข้าสู่ Service ผ่านทาง Gateway

ขั้นตอนแรกของการทำงานกับ Kong คือต้องสร้าง route เข้าไปยัง upstream service โดยในตัวอย่างนี้เราจะสร้าง Route เข้าสู่ Service โดย Service ที่นำมาใช้ในตัวอย่างนี้จะ Mock ด้วย Jason server ชื่อว่า Product Service ซึ่งผมได้ใส่ไว้ใน docker compose แล้ว

หลังจาก run docker compose แล้วให้ลองเข้าไปทดสอบ api จำลองที่ได้สร้างขึ้น โดยเข้าไปดูที่ http://localhost:3000/products

“Mock Product Service”
ตัวอย่าง Products ที่ถูก Mock ขึ้นมา

หลังจากนั้นให้สร้าง Service เพื่อระบุว่าจะให้ Kong พาไปที่ไหน โดยเข้าไปที่เมนู Service > Add New Service แล้วก็ระบุค่าต่างๆ ดังนี้

เมื่อสร้างเรียบร้อยแล้ว Kong ก็จพสร้าง product-service ขึ้นมาโดยมีรายละเอียด ดังรูป

“Konga create product-service”

ต่อมาเราจะทำการสร้าง Route เข้าไปยัง product-service โดยเข้าไปที่เมนู Route > Add Route
เราจะทำการระบุข้อมูลต่างๆ ดังนี้

ข้อควระวัง คือ parameter ตัวไหนที่เป็นพหูพจน์ เช่น hosts และ paths เราต้องกด enter หลังจากกรอกข้อมูลไปแล้ว เพราะเราสามารถใส่ input ได้หลายตัว(array)

ทดสอบลองเข้าผ่าน Url ที่เราสร้างไว้ตามข้างต้น ได้ผลลัพธ์ ดังรูป จะเห็นว่าเราสามารถเข้าถึง Product Service ได้จากทุก Paths Url ที่เราสร้างไว้

“Konga Product Route Result”
“Konga Product Route Result”

ทดลองใช้ Plugins ใน Kong Gateway

Plugins เป็นหนึ่งในเหตุผลที่เราเลือกใช้ Kogn เพราะมีให้เลือกเยอะมากและครอบคลุมทุกฟังก์ชันการทำงาน นอกจากนี้เรายังสามารถขยายการใช้งานของ Kong ด้วยการเขียนโปรแกรมภาษา Lua เข้าไปใน OpenResty ที่เป็น Opensource สำหรับการเพิ่ม Module เข้าไปใน Nginx Core ซึ่งจะช่วยให้คุณสามารถเพิ่มความสามารถใหม่ๆ ให้กับ Kong Server ของคุณได้

“Konga Plugins”
ตัวอย่าง Plugins ใน Kong

โดยในบทความนี้เราจะลองนำ Plugin ง่ายๆ มาติดตั้งใช้งานให้ดูเป็นตัวอย่าง เริ่มต้นจากเข้าไปที่เมนู Plugins > Add Plugin

“Konga Plugins Menu”

Plugin ที่เราเลือกมา Demo คือ Rate Limit ซึ่งอยู่ในหัวข้อ Traffic Control
Rate Limit คือ การจำกัดจำนวนครั้งในการเข้าถึง API ในช่วงเวลาที่เรากำหนด เช่น เราสามารถเข้าใช้งาน API ได่้สูงสุด 10 requests ใน 1 นาที หรือ 3 requests ใน 1 วินาทีเป็นต้น โดยหน่วยของเวลาสามารถกำหนดเป็น วินาที(second), นาที(minute), ชั่วโมง(hour), วัน(day), เดือน(month), ปี(year)

พวก rate limit ตาม วัน, เดือน และปี จะใช้กับ Subscription Plan(ปริมาณการใช้งานขึ้นอยู่กับราคาที่จ่าย)

“Konga Add Plugin Rate limite”

ในตัวอย่างนี้เราจะกำหนด

ซึ่งหมายความว่า การเข้าถึง API ทุกๆตัวได้่ไม่เกิน 10 ครั้ง ต่อหนึ่งนาที ที่มีผลกับ API ทุกตัวเนื่องจากเราสร้าง Plugins จาก เมนู plugins ด้านนอกซึ่งจะถือว่าเป็น global plugins ที่มีผลกับ API ทุกตัวที่อยู่หลัง Kong Gatewat ตัวนี้

“Konga Setup Rate limit”

จากนั้นทำการทดสอบลองเข้าใช้งาน API ผ่านทาง Route ที่เราสร้างไว้ในขั้นตอนก่อนหน้านี้ และทำการ Reload page เกิน 10 ครั้ง จะได้ผลลัพธ์เป็น Error รหัส 429 ดังรูป

“Konga Rate limit result”
Error การเรียกใช้ API เกินจากที่กำหนดไว้ใน Rate limit

เมื่อเราส่ง request เข้าไปเกิน limit Kong จะ return HTTP status เป็น 429 ซึ่งหมายถึงคุณส่ง requests มากเกินไปแล้ว(Too many requests)

นอกจากการใช้งาน plugins โดยสร้างเป็น global plugins ตามตัวอย่างด้านบนแล้วเรายังสามารถเลือกสร้าง plugins ตาม scope ที่กำหนด ซึ่ง scope ของ plugins ทีดังนี้

เราจะสามารถ add plugins เข้าไปใน scope ไหนบ้างขึ้นอยู่กับการทำงานของ plugins แต่ละตัวซึ่งก่อนใช้งานเราต้องเข้าไปอ่านใน document เพื่อตรวจสอบว่าเราสามารใช้ plugins ในจุดที่เราต้องการได้หรือไม่

Phanupong Permpimol
Follow me

Software Engineer ที่เชื่อในเรื่องของ Process เพราะเมื่อ Process ดี Product ก็จะดีตาม ปัจจุบันเป็นอาจารย์และที่ปรึกษาด้านการออกแบบและพัฒนา Software และ Web Security