สร้าง Serverless บน Kubernetes ด้วย OpenFaaS

Serverless คือ รูปแบบการพัฒนารูปแบบหนึ่งที่เราไม่ต้องมี Server ในการให้บริการเลยก็ได้ โดยที่เรามีแค่โค้ดที่เป็นฟังก์ชั่นเพื่อใช้งานก็พอ แล้วเราก็โยนโค้ดเราขึ้นไปยังผู้ให้บริการ serverless ซึ่งในปัจจุบันอาจจะเป็น AWS Lambda เมื่อโค้ดเราพร้อมให้บริการแล้ว ในการใช้งานฟังก์ชั่นนี้ก็จะทำงานเมื่อมี Event เรียกเข้ามาเท่านั้น เราก็ไม่ต้องไปสนใจในเรื่องของ server กันเลยทีเดียว ซึ่ง Serverless จะเป็นส่วนที่เล็กกว่า Microservice เสียอีก

ถ้าหากเราไม่อยากจะเสียค่าใช้จ่ายในการลองใช้งาน AWS Lambda ก็มีวิธีการที่เราจะสร้าง Serverless ขึ้นมาใช้เองด้วย ซึ่ง OpenFaaS เป็น Framework ตัวนึงที่ใช้ในการสร้าง serverless ด้วย Docker และรองรับทั้ง (Docker Swarm)[https://docs.docker.com/engine/swarm/] และ Kubernetes เดี๋ยวเราจะมาลองเล่น OpenFaaS กับ Kubernetes กัน

ในที่นี้ผมจะใช้ minikube ในการสร้าง Kubernetes แบบเล็กๆ ขึ้นมาใช้งานกันนะ

** เริ่มการทำงานของ minikube และ openfaas**

$ minikube start

รอจนกว่า Kubernetes พร้อมใช้งาน

$ kubectl get nodes

เมื่อ Kubernetes พร้อมใช้งานแล้ว ให้ทำการ apply ค่า ของ Docker

$ eval $(minikube docker-env)

เริ่มทำการ Deploy OpenFaaS

$ git clone https://github.com/alexellis/faas-netes
$ cd faas-netes
$ kubectl apply -f ./faas.yml,monitoring.yml,rbac.yml

รอจนกว่าทุกอย่างจะ deploy เสร็จ

$ kubectl get deployments,pods

เมื่อทุกอย่างพร้อมใช้งานแล้ว สิ่งที่เราต้องการจาก OpenFaaS ใน Kubernetes ก็คือส่วนของ API Gateway ซึ่งเราจะนำมาประกอบในส่วนของการ Deploy code

$ kubectl get nodes -o json | jq '.items[] | .status.addresses[0].address'

จากที่สร้างจะได้ IP ออกมาเป็น 192.168.99.100

หลังจากนั้น ดู service ที่โดน expose ออกมาจาก Kubernetes

$ kubectl get svc

จะเห็นว่าตัว gateway โดน expose มาด้วย port เลข 31112 ดังนั้น API Gateway ของ OpenFaaS ของเราคือ http://192.168.99.100:31112

สามารถเข้าไปดูที่หน้า UI ได้ที่ http://192.168.99.100:31112/ui/

ถ้ามาถึงตรงนี้แสดงว่าส่วนของ OpenFaaS ของเราพร้อมใช้งานแล้วครับ

** มาเริ่มในส่วนของ Code กันดีกว่า **
ซึ่งเจ้า OpenFaaS ตอนนี้ก็รองรับการทำงานได้หลายๆ ภาษา ไม่ว่าจะเป็น Python, .NET, C#, Ruby, NodeJS เดี๋ยวเราจะมาลองเขียน Function ด้วย Python ขึ้นไปทำงานบน Serverless กัน ในที่นี่ผมจะให้บริการ Fibonacci-as-a-Service ด้วย python

ก่อนอื่นให้ทำการติดตั้งเครื่องมีที่มีชื่อว่า faas-cli ก่อน

$ curl -sSL https://cli.openfaas.com | sudo sh

สร้าง folder ที่มีชื่อว่า functions

$ mkdir -p ~/sample-faas/functions
$ cd $_
$ mkdir fib

ภายใน folder fib ให้สร้างไฟล์ที่มีชื่อว่า handler.py มีเนื้อไฟล์ดังนี้

def fib(n):
    if n <= 1: return n
    else: return fib(n-1) + fib(n-2)

def handle(st):
    n = int(st)

    output = []
    for i in range(n):
        output.append(str(fib(i)))
    print(', '.join(output))

หลังจากนั้น ให้ออกมาข้างนอก folder

$ cd ~/sample-faas/functions/

สร้างไฟล์ที่มีชื่อว่า stack.yml มีเนื้อไฟล์ดังนี้

provider:
  name: faas
  gateway: http://192.168.99.100:31112

functions:
  fib:
    lang: python
    handler: ./fib/
    image: engineerball/faas-python-fib

โดยที่ค่า gateway คือสิ่งที่เราได้จากการ deploy openFaaS ใน Kubernetes

functions จะเป็นการบอกว่าเราจะสร้าง Function อะไร และอยู่ที่ path ไหน ซึ่งการสร้างของมันจะทำการสร้างเป็น Docker Image และอัพโหลดขึ้นไปยัง Docker Hub

ทำการ Build Function

$ faas-cli -action build -f ./stack.yml

เมื่อเสร็จแล้ว ให้ทำการ Push image ขึ้น Registry

$ faas-cli -action push -f ./stack.yml

เสร็จแล้ว Deploy เข้าสู่ใน OpenFaaS ภายใน Kubernetes

$ faas-cli -action deploy -f ./stack.yml

เมื่อ deploy เสร็จแล้วจะได้ URL ที่ได้จากการ Deploy มาให้เราได้ใช้งาน
ทำการทดสอบเรียกใช้งาน Fibonancci-as-a-Service

$ curl http://192.168.99.100:31112/function/fib -d "17" 
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987

หรือจะเรียกที่หน้า ui ของ openfaas

** สุดท้าย **
นี่ก็เป็นตัวอย่างหนึ่งในการใช้งาน Serverless ผมว่าจะเป็นเทรนด์ใหม่แน่นอนกับการพัฒนารูปแบบเช่นนี้ หากใครสนใจก็สามารถติดตามได้ที่ github ที่ https://github.com/alexellis/faas ได้เลยครับ

ball Written by:

Teerapat Khunpech Live, Tech, Beers, Bike, Cafe Racer, Docker, Devops, Eco-System