基於 Kubernetes 的 Serverless 框架 Kubeless

Kubeless 是一個基於 Kubernetes 的無伺服器(Serverless)框架,由 Go 語言所撰寫而成。Kubeless 利用 Kubernetes 資源提供自動擴展(auto-scaling)、API 路由、監控以及故障排除等功能。

而 Kubeless 為什麼能在如此多的無伺服器(Serverless)框架中脫穎而出呢?這是因為 Kubeless 使用 Kubernetes 的 CRD(Custom Resource Definition) 來建立 Function,而每個 Function 建立時都會是一個 Deployment,並同時暴露(expose)出一個 Service,透過 Kubernetes 的好處省去開發者開發上的麻煩。而 Kubeless 僅需執行一個in-cluster的 Controller 來監控這些 CRD,並按需求啟動與執行。

事情準備與安裝環境

本文事先準備了一個 Kubernetes 叢集,且是利用kubeadm所部署而成;環境並非實體機而為虛擬機機。

IP Address Role CPU RAM Disk
172.20.3.19 Master1 1 vCPU 2 GB 40 GB
172.20.3.14 Node1 1 vCPU 2 GB 40 GB
172.20.3.18 Node2 1 vCPU 2 GB 40 GB
  • Docker 版本為 1.18.02;
  • Kubernetes 版本為 1.10.0;Kubernetes CNI 為Calico

利用kubeadm部署 Kubernetes 叢集,可以參考 只要用 kubeadm 小朋友都能部署 Kubernetes

安裝 Kubeless

這裡官方為了不同的 Kubernetes 環境提供了不同的 Manifest,請依照自己的需求而選擇對應的檔案:

  • kubeless-$RELEASE.yaml:使用於有 RBAC 的 Kubernetes 叢集;
  • kubeless-non-rbac-$RELEASE.yaml:使用於沒有 RBAC 的 Kubernetes 叢集;
  • kubeless-openshift-$RELEASE.yaml:使用於 OpenShift (1.5+) 上。

設定 Kubeless 版本並選擇對應的檔案後,透過kubectl建立 Kubeless controller manager 與 CRD:

$ export RELEASE=$(curl -s https://api.github.com/repos/kubeless/kubeless/releases/latest | grep tag_name | cut -d '"' -f 4)
$ kubectl create ns kubeless
$ kubectl create -f https://github.com/kubeless/kubeless/releases/download/$RELEASE/kubeless-non-rbac-$RELEASE.yaml

$ kubectl get pods -n kubeless
NAME READY STATUS RESTARTS AGE
kubeless-controller-manager-6f59c58ffd-mlbpd 1/1 Running 0 6h

$ kubectl get deployment -n kubeless
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubeless-controller-manager 1 1 1 1 6h

$ kubectl get crd
NAME AGE
cronjobtriggers.kubeless.io 6h
functions.kubeless.io 6h
httptriggers.kubeless.io 6h

完成後,安裝 Kubeless 的 CLI:

$ export OS=$(uname -s| tr '[:upper:]' '[:lower:]')
$ curl -OL https://github.com/kubeless/kubeless/releases/download/$RELEASE/kubeless_$OS-amd64.zip && \
unzip kubeless_$OS-amd64.zip && \
sudo mv bundles/kubeless_$OS-amd64/kubeless /usr/local/bin/

若環境無法unzip請自行透過apt安裝zip。指令如下:

$ apt-get install -y zip

使用kubeless指令檢查 Kubeless CLI 是否安裝完成:

$ kubeless
Serverless framework for Kubernetes

Usage:
kubeless [command]

Available Commands:
autoscale manage autoscale to function on Kubeless
completion Output shell completion code for the specified shell.
function function specific operations
get-server-config Print the current configuration of the controller
help Help about any command
topic manage message topics in Kubeless
trigger trigger specific operations
version Print the version of Kubeless

Flags:
-h, --help help for kubeless

Use "kubeless [command] --help" for more information about a command.

安裝 Kubeless UI

Kubeless 提供了 Dashboard,且由 React 所撰寫而成。而安裝方式非常簡單:

$ kubectl create -f https://raw.githubusercontent.com/kubeless/kubeless-ui/master/k8s.yaml

在 Dashboard 上會遇到 RBAC 的問題,因此需要建立一個 Cluster Role:

$ cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: kubeless-ui-default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: User
name: system:serviceaccount:kubeless:ui-acct
apiGroup: rbac.authorization.k8s.io
EOF

確認 Kubeless UI 的 Service:

$ kubectl -n kubeless get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ui NodePort 10.106.89.123 <none> 3000:30619/TCP 6h

若完成後,可以透過瀏覽器存取 Kubeless UI

Kubeless UI

寫一個簡單的 Function

接下來建立一個簡單的 FUnction,以 Python 為範例。

創建一個test.py,並輸入以下內容:

def hello(event, context):
print event
return event['data']

接下來透過 Kubeless 指令建立 Function:

$ kubeless function deploy hello --runtime python2.7 \
--from-file test.py \
--handler test.hello
INFO[0000] Deploying function...
INFO[0000] Function hello submitted for deployment
INFO[0000] Check the deployment status executing 'kubeless function ls hello'

可以透過以下指令確認 Function 是否建立:

$ kubeless function ls
NAME NAMESPACE HANDLER RUNTIME DEPENDENCIES STATUS
hello default test.hello python2.7 1/1 READY

$ kubectl get functions
NAME AGE
hello 52s

$ kubectl get po
NAME READY STATUS RESTARTS AGE
hello-56d89fcd87-4hlh5 1/1 Running 0 1m

完成後,可以在 Kubeless 上看到剛剛建立的 Function。

Deploy Function

測試 Function

以下有三種方式可以測試剛剛建立的 Function 是否有作用。

Kubeless CLI

透過 Kubeless CLI 確認 Function 是否有作用:

$ kubeless function call hello --data 'Hello world!'
Hello world!

Curl

直接使用Curl指令 apiserver proxy URL

$ kubectl proxy -p 8080 &

$ curl --data '{"hello": "world"}' \
--header "Content-Type:application/json" \
localhost:8080/api/v1/namespaces/default/services/hello:8080/proxy/
{"hello": "world"}

Kubeless UI

Kubeless UI 在 Function 旁邊有提供測試。

Test Function

參考資料

  1. Kubeless Github
  2. Kubeless Docs
  3. Kubeless UI Github
Share Comments