มาลองเล่น Kong ด้วย Konga กัน แล้วจะรู้ว่า Kong ไม่ได้มีดีแค่เป็น API Gateway ทั่วๆไป (ตอนที่ 1: การตั้งค่า)
ในบล็อคนี้จะเป็นการยกตัวอย่างวิธีใช้ Kong ให้ทุกคนเห็นภาพมากขึ้นว่า Kong เอามาใช้ทำ API Gateway ยังไง แล้วทำไมถึงเป็นได้มากกว่า API Gateway ทั่วๆไป คือ API Gateway ทั่วๆไปจะเป็นเหมือนหน้าด่านของ service ต่างๆ คอยรับ request จัดการเรื่องความปลอดภัย ลิมิต request ที่เข้ามา กันพวก DDos แล้วก็พวก Authentication ต่างๆ แต่ความน่าสนใจของ Kong คือมันมี plugin เสริมหลายอย่างมากซึ่งเดี๋ยวจะยกตัวอย่างให้ได้ลองทำกันในบทความนี้ แล้วก็มี Snapshot เอาไว้ restore service ที่ต้องการกลับมาใช้ใหม่ ณ จุดที่ทำการ Snapshot ไว้
ในรูปด้านบนคือ Architecture ของ Kong ที่มีทั้ง RESTful Administration API , plugin ที่สร้างขึ้นจากภาษา Lua และสามารถไปเชื่อมกับ Third party ต่างๆ ส่วน Database คือ สามารถเลือกได้ว่าจะใช้เป็น PostgreSQL หรือ Cassandra และทั้งหมดของ kong คือ based on OPENRESTY+NGINX คืออะไรที่ NGINX ทำได้ Kong ก็จะทำได้ พวก load balancing และ reverse proxy server
ทุกคนสามารถลองใช้ Kong ได้ฟรี เพราะ Kong มีให้เลือกทั้งแบบเวอร์ชั่น community(ฟรี) และแบบ Enterprise(เสียตัง) ทุกคนสามารถดู comapare feature kong ทั้งสองเวอร์ชั่นได้ที่ https://konghq.com/subscriptions/ ซึ่งจะเห็นว่าถ้า Kong enterprise มีฟีเจอร์ที่เยอะกว่า Kong community มาก เช่น Admin GUI, Security พวก OpenID connect และ Admin RBAC , Developer Portal, Vitals & Analytics, Scalability และ Customer Access แบบ 24x7
การทำงานของ Kong ก็จะเป็นประมาณนี้
สมมติเรามี Service Nginx อยู่ตัวหนึ่งรันอยู่ที่ 192.168.99.110 port 8055 เวลาเราเอา Kong มาทำ API Gateway ถ้าจะเรียกหน้าเว็บ Nginx ตัวนี้ เราก็ต้องสร้าง route ให้มันใหม่ เป็น path: /test (แล้วแต่เราจะตั้งชื่อ path) โดย service นี้ เราใช้ Kong มาทำ Basic auth คือ ให้มีการล็อคอินก่อนเข้าหน้า service นั้นได้ พอจะเรียกหน้าเว็บ Service Nginx นี้ขึ้นมา มันจะไม่ใช่การยิง request ไปที่ IP เดิมล่ะ ต้องยิง request ไปที่ IP kong แทน และใช้ port 8000 ตามด้วย path /test ที่เราตั้งค่าไว้
แต่ Kong จริงๆ รันอยู่ที่ port 8001 นะ แค่ว่าเวลาเราเรียกใช้ Kong เพื่อยิง request ไปยัง service ที่เราต้องการ เราจะไปใช้เป็น port 8000 แทน
อันนี้จะให้ดูรูปเกริ่นก่อนว่าจะทำอะไรกับ Kong บ้าง
เนื่องจากเครื่องพลอยเป็น windows ถ้าจะเล่น docker ก็เลยต้องลง virutalbox ซึ่งพลอยเคยอธิบายไปในบล็อคก่อนหน้าเรื่องการติดตั้งคำสั่ง choco, docker และ virtualbox ก็ follow คำสั่ง บล็อค นี้ถึงแค่ข้อ 4 พอแล้วก็มาสร้าง virtualbox สำหรับ kong, portainer (จะเอามาสร้าง services ไว้ใช้กับ Kong) และ Prometheus (ไว้ดูกราฟการทำงานของ service) ด้วยคำสั่ง
choco install -y docker-machine
docker-machine create -d virtualbox docker-kong
docker-machine create -d virtualbox portainer
docker-machine create -d virtualbox prometheus
แล้วก็พิมพ์คำสั่ง docker-machine.exe env ตามด้วยชื่อ virutalbox ซึ่งในที่นี้คือ docker-kong, portainer และ prometheus พอรันคำสั่งจะเห็นข้อความยาวๆ ให้ copy ตั้งแต่คำว่า @For / f “token=” …… แล้วรันคำสั่งนั้นอีกที ถ้าใครงง ให้ลองไปดูที่ บล็อค นี้ดู เพราะว่าเคยสอนอย่างละเอียดไปแล้วในบล็อคก่อนหน้า
ทีนี้เรามาลองขั้นตอนการติดตั้ง kong และ konga กัน…
เริ่มแรก ssh เข้าไปใน virtualbox เข้าเราก่อนด้วยคำสั่ง
docker-machine ssh docker-kong
จากนั้นพิมพ์คำสั่งตาม doc ของ kong จนถึงข้อ 4 และในส่วนของข้อ 2 ที่เป็น start database ให้เลือกรันเฉพาะของ PostgreSQL
ทีนี้ถ้าใครไม่ได้ใช้ window หรือไม่มีความจำเป็นต้องใช้ virtualbox ก็สามารถทำการ test ตาม doc ในข้อ 5 ที่เป็น curl -i http://localhost:8001/ ได้เลยแต่ถ้าใช้ virtualbox จะต้องใช้เป็น IP ของ Virtualbox แทน localhost
ยกตัวอย่างรูปข้างบนตัว virtualbox docker-kong ของเครื่องพลอยจะได้ IP อยู่ที่ 192.168.99.108 แต่ port ของ Kong คือ 8001 เราก็มาลองเช็คบนเบราเซอร์กัน
ทุกคนควรจะได้ json ยาวๆแบบในรูป (แต่อาจจะไม่เหมือนในรูปเป๊ะ เพราะในรูปคือมีใส่ plugin บางอย่างให้ kong ไปแล้ว)
ทีนี้พอเราได้ kong มาแล้ว เรามาติดตั้ง docker konga กันต่อ เพื่อความสบายในการเล่น เพราะ Konga เป็นเหมือนหน้า UI Management ใช้งานง่าย จะสร้าง route ทำ consumer ใส่ปลั๊กอินอะไรก็คลิ๊กๆ ไม่ต้องใช้ command ล่ะ
ทำการ pull docker konga และรันตามคำสั่งในรูป
จากรูปคำสั่ง แนะนำให้ใส่ -d เข้าไปหน้า -p เพื่อให้มันรันคำสั่งเป็น background ไปบรรทัด — network จะใส่เป็น — network kong-net ตัดปีกกาทิ้งแล้วใส่ชื่อเน็ตเวิร์คของ kong เข้าไป และบรรทัดต่อมาที่เป็น -e ทั้งสองบรรทัดจะตัดทิ้งก็ได้ เป็นแค่ option และพอมาถึง step นี้ ลองคำสั่ง docker ps -a เพื่อดู container ทั้งหมดดู
ทุกคนควรมี container อยู่ 3 ตัวตามในรูปคือ kong, konga และ postgres สถานะ Up จากนั้นลองเปิดหน้าเว็บ konga ขึ้นมา ใช้ IP virtualbox เหมือนเดิมแต่ใช้ port 1337 ยกตัวอย่าง 192.168.99.108:1337 แต่ถ้าใครรัน docker บนเครื่องตัวเองไม่ได้ใช้ virtualbox ก็ localhost:1337 ได้เลย
ก่อนจะลองเล่น Konga เรามาลองสร้าง service สัก 2 อันให้ kong ได้เรียกใช้งานกันก่อนดีกว่า โดยเราจะไปลองสร้างใน Portainer หรือก็คือตัวช่วยในการจัดการ docker
ซึ่งบนสุดของบทความสำหรับคนใช้ windows พลอยได้มีให้สร้าง virtualbox สำหรับ portainer ไว้แล้ว ทีนี้เรามา ssh เข้า virtualbox เพื่อจะ run docker กันด้วยคำสั่ง
docker-machine ssh portainer
docker pull portainer/portainerdocker volume create portainer_data
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
หลังติดตั้ง Docker portainer เสร็จและ login เราควรจะเจอหน้า Dashboard แบบนี้
ในบล็อคนี้จะให้ลองเล่นกับ Kong ด้วย Service 2 ตัว คนละ port ตัวแรกเป็น Nginx และตัวที่สองเป็น Httpd เป็น Web server ทั้งคู่ เริ่มแรกให้คลิ๊กเข้าไปที่คำว่า local ในรูปด้านบนแล้วกดที่ App Templates จาก Tab ด้านข้างแล้วคลิ๊กที่คำว่า Nginx
ตั้งชื่อ Name เลือก Network เป็น Bridge คลิ๊ก Show advance option แล้วใส่ port mapping ของ port 80 ซึ่งเป็น http ธรรมดา ในที่นี้ จะใช้เป็นport 8055 ตามรูป จากนั้นเลื่อนลงมาจะเจอคำว่า Deploy the container ให้คลิ๊กอันนั้นค่ะ
ต่อมา Service ตัวที่สองคือ Httpd ให้คลิ๊กเข้าไปที่คำว่า Httpd
จากนั้นตั้งชื่อ Name เป็น webHttpd เลือก Network เป็น Bridge แล้วใส่ port mapping เป็น 8086 จากนั้นคลิ๊กที่คำว่า Deploy the container
ทีนี้เรามาลองเช็คกันว่า Docker container ที่เราสร้างใหม่ 2 ตัวรันอยู่ปกติ ให้คลิกที่ Tab ด้านคำว่า Containers แล้วผลลัพธ์ทุกคนตอนนี้ควรจะได้แบบในรูป
พอได้ services ที่ใช้เล่นกับ kong แล้ว เรากลับมาที่หน้า Konga กันอีกที ใน Konga จะอ้างอิงตาม main หลักๆที่ต้องใช้ใน kong เช่น การทำ Kong API Gateway เราต้อง create service เป็นอันดับแรก เพื่อบอก kong ว่า request ที่ client ร้องขอเข้ามา ต้องการเรียกไปที่ปลายทางไหน จากนั้นสร้าง route เป็นเส้นทางเชื่อมกับ service ให้ client เวลาส่ง request ผ่าน kong ให้ไปเรียกที่ path นี้นะของ service นี้ เช่น kong:8001/test แล้วถ้าเกิดเรา enable plugin ให้กับ service ด้วยก็จะต้องมีการตั้งค่า plugin นั้นใน consumer ซึ่ง consumer ก็คือ ผู้เรียกใช้ service นั้น และ plugin คือส่วนเสริมการทำงานของ Kong เช่น Authentication, Security, trafic control, Servelesss, Analytic and Monitoring, Transformation , Logging เป็นต้น
รายละเอียดปลั๊กอิน kong สามารถดูได้ที่นี่ https://docs.konghq.com/hub/
แต่ว่า plugin บน Konga ไม่ได้มีทุกตัวของที่ Kong มี อย่างเช่น ในหน้าเว็บของ Kong หมวด plugin Authentication มี Plugin ชื่อ Session ที่ไม่ใช่ตัว Enterprise อยู่
แต่ใน Konga มี plugin สำหรับทำ Authentication แค่ 6 แบบนี้
พอเราเข้าใจว่า Kong คืออะไรคร่าวๆ แล้ว Konga คืออะไร ตอนนี้เรามาเริ่มทำ Kong API Gateway ด้วย Konga กัน
Step1: Create Service โดยคลิ๊กไปที่แถบ Services แล้วคลิ๊ก ADD NEW SERVICE
หลักๆคือใส่ชื่อ name service ใส่ host เป็น IP และ port ของ service นั้นที่เมื่อสักครู่เราได้สร้าง web service ขึ้นมา 2 ตัวจาก Portainer คือ
Nginx: 192.168.99.110, port 8055
Httpd: 192.168.99.110, port 8086
เราก็จะใช้ข้อมูลนี้สร้าง service ใน Konga ตามรูป
Step2: Create routes เราจะทำการ create routes จากหน้า service โดยการคลิ๊กเข้าไปที่ชื่อ service นั้นอย่างเช่น เราจะทำการสร้าง route ให้กับ webHttpd ก่อนก็คลิ๊กไปที่ชื่อ webHttpd แล้วก็คลิ๊กที่ Tab Routes เลือก ADD ROUTE
ตัวแปรหลักๆที่ต้องใส่ในการสร้าง Route จะเป็น name กับ path ซึ่งแล้วแต่ทุกคนจะตั้งชื่อ path ของตัวเองเลยว่าจะให้ชื่ออะไร ซึ่งในตัวอย่างอันนี้ จะให้ service webHttpd อยู่ที่ path: /users ส่วน service nginx อยู่ที่ path: /test
Step3: Create consumer กรณีว่าเราต้องการใช้ plugin กับ service ของเรา โดยคลิ๊กไปที่ Tab consumers แล้วคลิ๊ก CREATE CONSUMER ตั้งชื่อ name แล้วแต่เราเลย
จากนั้นคลิ๊กเข้าไปที่ชื่อ consumer ของเราในที่นี้ขอตั้งชื่อว่า wisdomgoody
จากนั้นคลิ๊กที่คำว่า credentials จะเป็นเมนูเกี่ยวกับการตั้งค่าให้กับ plugin แนว Authentication อย่างตัวแรก Tab Basic คือ Basic Auth แนว login ด้วย username, password เมื่อเปิดหน้าเว็บ service นั้น ซึ่งพอเรากด CREATE CREDENTIALS
ตัว password ที่เราตั้งจะถูก hash ให้อัตโนมัติเมื่อกด create ตามรูป
แล้ว API KEYS คืออะไรล่ะ API KEYS มักใช้ในการส่ง request ไปร้องขอข้อมูลโดยการแนบ header ที่มี parameter เป็น key ไปหา server ปลายทาง ถ้าไม่มี key ก็จะไม่ได้รับข้อมูล response กลับ มักใช้กับ method ที่ต้องการความเป็น private สูง เช่น request ด้วย POST method ระหว่าง server A ไปตัดบัตรเครดิต ที่ server bank ก็ต้องมีการยืนยันข้อมูลผู้ใช้งานด้วย key ตัวนี้ก่อนถึงจะอนุญาตให้ API ตัวนี้ตัดเงินจากบัตรของลูกค้าได้ ซึ่งตอนกด CREATE API KEY เราสามารถปล่อยช่อง key เว้นว่างแล้วกด submit ได้เลย Kong จะทำการ generate key ที่มีความปลอดภัยให้อัตโนมัติ
ในรูปจะเห็นว่ามันไม่ได้จำกัดจำนวน Api Keys คือเราจะสร้างเพิ่มอีกกี่ตัวก็ได้ เหมือนกับว่าเราเป็นผู้ provide key ให้กับคนที่ต้องการใช้ service นั้นว่าจะให้ใช้อันไหน
ตอนนี้เหมือนบทความจะเริ่มยาว จะขอยกไปต่อในบทความตอนที่ 2 เรื่องตัวอย่างการใช้ปลั๊กอินต่างๆให้ลองเล่นตาม