我在 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/
aaaa.png
$ 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
aaaa.png

已部署了四个样本函数。
现在将在用户界面上对函数ruby-echo进行调用,尝试传入文本数据。

aaaa.png

然后,会返回一个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

在用户界面上显示了函数,并且调用后返回了标准输出。

aaaa.png

嗯,僅僅這樣講並不能很好地理解與Kubernetes的關聯,也沒什麼趣味。
關於在Kubernetes上如何運作的細節,我們將在接下來的Z Lab Advent Calendar 2017中繼續分享。

广告
将在 10 秒后关闭
bannerAds