我在 Kubernetes 集群上尝试使用 OpenFaaS
首先
根据GitHub Star的数据,OpenFaaS在Kubernetes上作为一种可运行的FaaS(函数即服务)平台非常受欢迎。
虽然OpenFaaS可以在Docker Swarm和Kubernetes上运行,但是由于在Kubernetes上的实例不太常见,因此我进行了一次调查。
OpenFaaS是什么
运行于Docker和Kubernetes上的无服务器框架。
函数本身被封装为Docker镜像并执行。
虽然使用模板引擎创建了Dockerfile,但也可以自定义Dockerfile,因此不会束缚在特定的语言运行时上,具有非常高的可扩展性和灵活性。
(请参考:https://github.com/openfaas/faas)
faas-netes 是什么意思?
在Kubernetes上运行的功能已经实现,与Swarm版本的实现不同。
以下存储库提供了用于部署faas-netes的Kubernetes清单和Helm包。
https://github.com/openfaas/faas-netes
试着亲自实践一下
环境
-
- minikube:v0.23.0
-
- kubernetes Master:v1.8.0
- openfaas:v0.5
部署
将应用程序部署到 K8S 有两种方式。
-
- 1.Manifestによるデプロイ
- 2.Helm templateによるデプロイ
这次使用1号Manifest进行了部署,执行以下命令。
$ git clone https://github.com/openfaas/faas-netes && \
cd faas-netes
kubectl apply -f faas.yml -f monitoring.yml -f rbac.yml
我来看一下 Pod 列表。
(Wǒ Pod .)
$ kubectl get po
NAME READY STATUS RESTARTS AGE
alertmanager-77b4b476b-qdbl5 1/1 Running 0 14m
faas-netesd-64fb9b4dfb-mqss5 1/1 Running 0 14m
gateway-5cb4f64656-pltpb 1/1 Running 0 14m
prometheus-7fbfd8bfb8-kv98c 1/1 Running 0 14m
FaaS核心和API Gateway、Prometheus、AlertManager已部署完成。
我来尝试在浏览器上查看用户界面(UI)。
# Mac限定
$ open http://$(minikube ip):31112/
$ curl -sSL https://cli.openfaas.com | sudo sh
获取样品。
$ git clone https://github.com/openfaas/faas-cli && \
cd faas-cli
将示例文件中网关的IP地址替换为minikube的IP地址。
provider:
name: faas
gateway: [API Gateway の URL。今回はminikube で動作させているので、minikube ip の値(http://IP:31112)に変更します]
network: "func_functions" # this is optional and defaults to func_functions
我們將進行部署。
$ faas-cli deploy -f samples.yml
Deploying: nodejs-echo.
No existing function to remove
Deployed.
URL: http://192.168.99.100:31112/function/nodejs-echo
202 Accepted
Deploying: shrink-image.
No existing function to remove
Deployed.
URL: http://192.168.99.100:31112/function/shrink-image
202 Accepted
Deploying: ruby-echo.
No existing function to remove
Deployed.
URL: http://192.168.99.100:31112/function/ruby-echo
202 Accepted
Deploying: url-ping.
No existing function to remove
Deployed.
URL: http://192.168.99.100:31112/function/url-ping
202 Accepted
已部署了四个样本函数。
现在将在用户界面上对函数ruby-echo进行调用,尝试传入文本数据。
然后,会返回一个200的响应。
每个功能都以K8S的Pod形式注册,可以通过使用kubectl logs进行确认。
$ kubectl logs ruby-echo-8d95f97fb-4wkm7
2017/11/27 09:32:39 Writing lock-file to: /tmp/.lock
Hello from your Ruby function. Input: foo bar
如何创建Function
每个函数都接收来自标准输入的文本或JSON,并将结果返回到标准输出,这是一个简单的过程。
# 各言語ごとのtemplate を取得します
$ faas-cli template pull
# 対応言語一覧
$ faas-cli new --list
Languages available as templates:
- csharp
- go
- go-armhf
- node
- node-arm64
- node-armhf
- python
- python-armhf
- python3
- ruby
Or alternatively create a folder containing a Dockerfile, then pick
the "Dockerfile" lang type in your YAML file.
我将使用模板创建模拟对象。这次选择的语言是Python。
$ faas-cli new hello-python --lang=python3
$ vim
hello-python3/handler.py
def handle(st):
print(st)
print("End") #追加
stdin的值将作为参数传递给这个handle函数,因此我们只需对其进行某种处理即可。
接下来,我们将构建这个函数。该函数是一个Docker镜像,所以Docker build将自动进行。
$ faas-cli build -f hello-python3.yml
[0] > Building: hello-python3.
....
Image: hello-python3 built.
[0] < Builder done.
可以通过更改–image选项或hello-python3.yml文件来更改图像名称的设置。
provider:
name: faas
gateway: [API Gateway の URL。今回はminikube で動作させているので、minikube ip の値(http://IP:31112)に変更します]
functions:
hello-python3:
lang: python3
handler: ./hello-python3
image: [Customイメージ名]
可以根据需要更改镜像名称,并将其推送到Docker仓库。
也可以使用docker push命令进行推送。
$ faas-cli push -f hello-python3.yml
我将进行部署。
$ faas-cli deploy -f hello-python3.yml
Deploying: hello-python3.
No existing function to remove
Deployed.
URL: http://192.168.99.100:31112/function/hello-python3
202 Accepted
在用户界面上显示了函数,并且调用后返回了标准输出。
嗯,僅僅這樣講並不能很好地理解與Kubernetes的關聯,也沒什麼趣味。
關於在Kubernetes上如何運作的細節,我們將在接下來的Z Lab Advent Calendar 2017中繼續分享。