June 15, 2019

Kong API Gateway ฉบับรวบรัด

Kong API Gateway ฉบับรวบรัด

หลายๆคน ที่ผ่านมาอ่านบล็อกนี้ ผมคิดว่า น่าจะเคยอ่านบล็อกนี้ "ชีวิตดีเพราะมี Kong ช่วยทำ API Gateway" ซึ่งเขียนไว้ได้ดีมาก เห็นภาพรวม และการใช้งาน Kong ได้อย่างเข้าใจง่าย ผมแนะนำให้อ่านประกอบกับบล็อกนี้ไปด้วย

ในบล็อกนี้ ผมจะมาสรุปสั้นๆ เพื่อให้เห็นภาพว่า Kong คืออะไร ทำอะไรได้บ้าง และจะใช้มันทำอะไร

จากภาพบน (ด้านซ้าย) แสดงให้เห็นว่า การทำ API แบบเก่าเวลาที่ API เริ่มเยอะขึ้น ฟังก์ชั่นหรือฟีเจอร์ที่ใช้ จะมีซ้ำๆกัน เช่น การ Authentication ก่อนการเรียกใช้ API, การ Limit Request สำหรับการเรียกใช้ API และอื่นๆ ซึ่งแต่ละ API อาจจะมาจากคนละทีมที่เขียนมา แล้วใช้ Reverse Proxy ในการ Route Request ไปยัง API ต่างๆด้านหลัง

ภาพด้านขวาคือ Kong API Gateway จะแสดงให้เห็นว่าจะยุบรวมฟีเจอร์หรือฟังก์ชั่น ที่มีการเรียกใช้งานร่วมกันของ API ต่างๆ ไปอยู่ที่ตัว Kong ทำให้ API ที่เขียนขึ้นมา ไม่ต้องเขียนฟังก์ชั่นเหล่านั้นเอง เช่น Authentication, Rate Limit,  ACL และอื่นๆ

สิ่งที่ทำให้ Kong เป็น API Gateway ที่ได้รับความนิยมมากคือ

  • ใช้ง่ายผ่าน RESTful API
  • Open Source
  • Scale ได้ง่าย
  • ประสิทธิภาพสูง
  • มี Plugin ให้ใช้

Deploy Kong  ในเวลาน้อยกว่า 2 นาที!

ถ้าในเครื่องมี Docker, Docker Compose แล้วนะ :D
git clone https://github.com/narate/kong-docker.git
git checkout pg
time ./start.sh
ถ้าไม่มี docker image ในเครื่อง จะขึ้นอยู่กับความเร็วของอินเตอร์เน็ต

จากคำสั่งด้านบน จะได้ Kong API Gateway ที่พร้อมใช้งาน แต่ก่อนจะเริ่มใช้งาน Kong มาทำความเข้าใจพื้นฐานของ Kong ก่อน

หลังจากที่ Deploy Kong ไปแล้วจะได้ 2 Port ที่เปิดเพิ่มมา

  • Kong Admin Port 8001
  • Kong Proxy Port 8000 (แต่ใน docker-compose map port ออกมาเป็น 80 ที่เครื่องโฮสต์)

Kong Admin Port 8001

Kong Admin Port ใช้สำหรับคอนฟิก Kong

Kong Proxy Port 8000

Kong Proxy Port ใช้สำหรับเป็นทางเข้า หรือให้เรียกไปยัง Service ด้านหลัง Kong

Object พื้นฐาน ที่ต้องใช้ใน Kong

  • Services
  • Routes

Kong Services

Kong Services คือ การประกาศไว้ว่า API หรือ Microservice ของเราอยู่ที่ไหน

Kong Routes

Kong Routes คือ ทางเข้าไปยัง Services ที่ประกาศไว้

สร้าง Service แรก


ใช้ cURL ในการสร้าง Service ชื่อ httpbin โดยมี url ของ service เป็น http://httpbin/org

curl 127.0.0.1:8001/services -d 'name=httpbin' -d 'url=http://httpbin.org'

หลังจากรันคำสั่ง จะได้ Respose เป็น JSON กลับมา

{
  "host": "httpbin.org",
  "created_at": 1560595421,
  "connect_timeout": 60000,
  "id": "02fd187e-7976-44ce-88a6-604a707cdc9a",
  "protocol": "http",
  "name": "httpbin",
  "read_timeout": 60000,
  "port": 80,
  "path": null,
  "updated_at": 1560595421,
  "retries": 5,
  "write_timeout": 60000,
  "tags": null
}

หลังจากที่สร้าง Service แล้ว จะยังเข้าถึง Service ไม่ได้ เพราะยังไม่มี Routes หรือทางเข้าไปยัง Services ถ้าเข้าไปยัง Proxy Port  http://127.0.0.1/

curl 127.0.0.1

จะได้ error

{
  "message": "no Route matched with those values"
}

สร้าง Routes เพื่อให้เรียกหา Service ได้

curl 127.0.0.1:8001/services/httpbin/routes -d 'paths[]=/'

จะได้ JSON Response

{
  "id": "4eaef1d0-b0e1-49d6-a160-81f9456933e7",
  "tags": null,
  "paths": [
    "/"
  ],
  "destinations": null,
  "protocols": [
    "http",
    "https"
  ],
  "created_at": 1560595643,
  "snis": null,
  "hosts": null,
  "name": null,
  "preserve_host": false,
  "regex_priority": 0,
  "strip_path": true,
  "sources": null,
  "updated_at": 1560595643,
  "https_redirect_status_code": 426,
  "service": {
    "id": "02fd187e-7976-44ce-88a6-604a707cdc9a"
  },
  "methods": null
}

ถ้าเรียกหน้าเว็บ http://127.0.0.1 จะได้หน้าเว็บเดียวกับ  http://httpbin.org

หรือว่าทดลองเรียกใช้ด้วย cURL เพื่อเช็ค IP ของเครื่องเรา

curl 127.0.0.1/ip

จะได้ IP ของเครื่องเรา

{
  "origin": "192.168.32.99, 184.22.153.99, 192.168.32.99"
}

จะเห็นว่า เราสามารถสร้าง API Gateway ได้ใน 2 คำสั่ง ซึ่งใช้เวลาในไม่กี่นาที เราก็ได้ API Gateway ที่เรียกไปยัง Microservice ข้างหลังได้ ถ้าจะเพิ่ม Services, Routes ใหม่ ก็จะเพิ่มได้ในไม่กี่นาที

Konga Kong Admin GUI Dashboard

Kong ไม่ได้ให้ระบบ Admin GUI Dashboard มาให้ในเวอร์ชั่น CE หรือ Community Edition แต่ก็มีคนสร้าง Admin GUI Dashboard เวอร์ชั่น Open source มาให้ใช้ https://github.com/pantsel/konga

ในไฟล์ docker-compose ที่ clone ลงมา จะมี service ให้อยู่แล้ว แต่ยังไม่ได้รันขึ้นมา ต้องรันขึ้นมาก่อน โดยต้องรัน 2 service คือ mongo, konga

docker-compose up -d mongo konga

หลังจาก run เสร็จแล้ว konga จะรันอยู่ที่ Port 1337 การเข้าใช้งานครั้งแรก จะต้องสร้าง username/password ก่อนเข้าใช้งาน

หลังจากที่สร้าง username/password แล้ว และ Login เข้าไปในระบบของ Konga จะได้หน้าให้ config admin url

  • Name ตั้งชื่ออะไรก็ได้
  • Kong Admin URL ให้ใช้ http://kong:8001/ เพราะรันอยู่ใน docker-compose สามารถเรียกด้วยชื่อ service ใน docker-compose ได้

จะได้หน้า Admin GUI

Kong Plugin

สิ่งที่ทำให้ Kong มีความยืดหยุ่นคือ มีระบบ Plugin (แต่ ยังไม่มี plugin market) ตัวอย่าง คือ จะเพิ่มระบบ Authentication ให้กับ API ที่สร้างขึ้นมา โดยจะใช้ Basic Auth ที่ต้องใส่ username/password ก่อน ถึงจะสามารถเรียก API ได้

เมนู Service

ในเมนู Service จะเห็นว่า มี Service ที่เราสร้างไว้ก่อนหน้านี้ผ่าน command line

กดเข้าไปใน httpbin จะเห็นรายละเอียดของ Service ที่สร้างไว้

จากนั้นให้ไปที่เมนู Plugins

กด Add Plugin ให้เลือก Basic Auth ไม่ต้องใส่ค่าอะไร

หลังจากที่เพิ่ม Plugin ไปแล้ว เวลาเรียกใช้ API จะต้องใส่ username/password

แต่ เรายังไม่มี username/password

สร้าง Kong Consumer

Consumer คือ คนที่จะมาเรียกใช้ API เวลาเรา Enable Plugin ที่เกี่ยวกับการ Authentication แล้ว จำเป็นที่จะต้องสร้าง Consumer ก่อน

ไปที่เมนู Consumers และสร้าง Consumer

จากนั้นสร้าง Credentials Basic Auth ให้กับ Consumer

หลังจากสร้าง Credentials แล้ว จะเข้าใช้เว็บหรือ API ได้

จบ

เดี๋ยวๆๆ ลืมขายของ

ที่เขียนมาทั้งหมด สามารถหาอ่านได้จากที่อื่นๆได้ ไม่ได้เป็นเรื่องยากมากสำหรับ Dev/Sys Admin  เท่าไหร่ แต่ สิ่งที่ Kong มีความยืดหยุ่นมากกว่านี้คือ เราสามารถที่จะเขียน Plugin ขึ้นมาได้เอง โดยใช้ภาษา Lua ที่เขียนอยู่บน OpenResty สำหรับบริษัทที่สนใจ อยากใช้ Kong ซึ่ง Kong มี 2 เวอร์ชั่นคือ EE (Enterprise Edition) และ CE (Community Edition) ทางบริษัท DomeCloud เป็น Partner กับ Kong Inc. ในการขาย Kong EE และนอกจากนี้ DomeCloud ยังรับ Implement Kong CE Plugin ด้วยติดต่อได้ทาง Fcebook page DomeCloud