OpenFaaS是一款广受欢迎的无服务(Serverless/Faas)部署框架,为开发者提供了一种简单而高效的方式来构建和部署无服务器函数。它旨在降低构建和管理无服务器应用程序的复杂性,同时提供可扩展性和高可用性。
Serverless/faas由于其开发速度快,完全屏蔽底层基础设施细节,低成本、自动扩缩容等优势,广受欢迎。但是如何在企业内独立实现一个serverless架构则是一件不容易的事情。
OpenFaas的出现解决了这个问题,它使得serverless架构的部署变得简便。
一、OpenFaas是什么?
OpenFaaS(Function as a Service)是一个开源项目,建立在容器技术之上,利用Docker和Kubernetes等容器编排工具,为开发人员提供了无服务器函数的构建、部署和管理功能。它提供了一个轻量级的、可扩展的函数编程平台,使开发者能够专注于业务逻辑而无需关注底层基础设施的细节。
OpenFaas是目前serverless/Function as a service领域最火爆的项目之一,如果你有志于发展serverless服务,但是又担忧和某个云厂商绑定,那么OpenFaas将是你最好的选择,至少目前来看是如此。
OpenFaas可以直接在Kubernetes上运行,也可以基于Swarm或容器运行,利用OpenFaas提供的faasd,甚至可以直接在Windows、MacOS和Linux主机上直接运行。
OpenFaaS 项目旨在将 Kubernetes 集群或者独立的虚拟机等低级基础设施转化为管理无服务器函数的高级平台。
站在开发人员的角度上,你只需要了解特定的API函数,就可以轻松编写并部署应用,很大程度上降低开发人员技能要求上对于底层基础设施的了解,实现快速实现应用,按量付费。
二、OpenFaas的功能
OpenFaaS作为一个Serverless/Faas框架,其最主要的功能是以下几点:
- 无服务器函数部署:开发人员可以使用OpenFaaS轻松地构建、部署和管理无服务器函数,无需关注底层的基础设施。
- 可扩展性:OpenFaaS利用Kubernetes等容器编排工具的强大功能,可以自动扩展函数实例以应对不同的负载需求。
- 事件驱动:开发人员可以使用OpenFaaS将函数与各种事件进行关联,从而实现事件驱动的应用程序开发。
- 多语言支持:OpenFaaS支持多种编程语言,包括Python、Go、Java等,使开发人员能够使用自己熟悉的语言编写函数。
- 监控和日志:OpenFaaS提供了丰富的监控和日志功能,开发人员可以实时监控函数的性能和行为,并及时发现和解决问题。
它还有很多亮点特性,也正是这些特性让openfaas广受欢迎,听我一一道来。
- OpenFaas拥有简易的UI门户,清爽简洁,操作方便。
- 通过Template Store和Dockerfile,可以支持各类语言编写函数服务,支持面广。
- 支持将代码打包成Docker或者支持OCI标准的镜像,向云而生,扩展方便。
- 借助kubernetes和Faasd,支持共有云、私有云、虚拟机本地环境等多平台运行,可移植性强。
- 借助kubernetes,能够快速弹性伸缩
- 提供faas-cli命令行客户端,方便进行函数定义和创建
OpenFaas的核心架构如下:
其中Application Layer是Openfaas的核心,其中OpenFaas Gateway负责所有function的注册和路由,Prometheus负责监控、NATS提供异步执行和排队机制。
Infrastructure Layer负责function容器镜像的编排调度,CI/GitOps Layer顾名思义就无需赘言了。通过这个架构,能够支持快速从代码仓库中构建function镜像,并通过kubernetes等进行编排部署,实现灵活弹性伸缩。
所以我们会发现当我们安装OpenFaas的时候,默认还会安装prometheus、OpenFaas Gateway、安装nats-queue-worker和nats。
整体流程:使用faas-cli或者faas UI和Rest API访问OpenFaas Gateway,OpenFaas Gateway通过调用faas-netes进行function编排部署,所有通过openfaas部署的function都会暴露一个路由进行访问。(faas-netes是OpenFaaS最受欢迎的编排提供商,但是注意还有其他的编排提供商,例如Docker Swarm、Hashcorp Nomad等。)
Prometheus从OpenFaas Gateway处收集相关的度量数据,使用AlertManager进行告警。
通过这个架构,从函数部署、调度、监控就全面覆盖了。
三、从0到1部署OpenFaas
OpenFaaS 可以部署到各种容器系统,例如 Kubernetes、K3s、OpenShift,也可以使用faasd部署到单个主机上。一般情况下建议部署到kubernetes和openshift上,可以支持更加弹性的调度,而faasd则更加适合本地环境部署测试和学习。
OpenFaas分为了OpenFaas CE和OpenFaas Pro两个版本,一个是社区版,一个是企业版,官方建议内部使用、测试和学习使用社区版,生产和商业应用则使用Pro版本。
下面我们分别展示将OpenFaas CE安装到kubernetes以及使用faasd安装到Linux主机上两种不同的方式。
3.1、安装到kubernetes
将OpenFaaS CE安装到Kubernetes 集群的方法有以下三种:
- 使用OpenFaas提供的安装程序 arkade(推荐)
- 使用 Helm 图表、Flux 或 ArgoCD(通过GitOps 工作流程)
- 或者使用静态生成的 YAML 文件(不推荐)
这里我们使用官方推荐的方式,用arkade进行安装部署,可以支持各种kubernetes集群,例如KinD、k3d、k3s、microk8s、minikube、各类云厂商提供的kubernetes托管集群等,这里笔者采用的是minikube部署的本地集群,这里你本地如果还没有部署minikube集群,可以参考笔者过往文章进行部署。
1、安装arkade
首先安装arkade,使用以下命令:
curl -sSL https://get.arkade.dev | sudo -E sh
你会发现,get.arkade.dev
会重定向到https://raw.githubusercontent.com/alexellis/arkade/master/get.sh
,这是一个arkade的安装脚本,如果发现无法访问raw.githubusercontent.com
,可以在/etc/hosts中添加对应域名映射,以下是一个参考,实际的请查询对应的IP
151.101.76.133 raw.githubusercontent.com
如果仍然无法自动正常安装,可以手工安装:
先下载对应的安装包,地址:https://github.com/alexellis/arkade/releases
执行chmod +x arkade
添加可执行权限
执行以下命令,添加到PATH路径
mv ./arkade /usr/local/bin
2、安装faas-cli
可以使用以下命令进行安装
arkade get faas-cli
如果安装失败,对于MacOS系统还可以尝试使用brew
brew install faas-cli
对于Linux系统则可以使用curl命令进行安装
curl -sSL https://cli.openfaas.com | sudo -E sh
如果还是无法成功安装,则进行手动安装,到对应网站https://github.com/openfaas/faas-cli/releases
下载安装包,执行以下命令。
mv ./faas-cli /usr/local/bin
ln -sf /usr/local/bin/faas-cli /usr/local/bin/faas
3、安装OpenFaas CE
创建OpenFaas安装需要的namespace,使用以下命令:
kubectl create namespace openfaas-fn
kubectl create namespace openfaas
使用arkade进行安装,默认将使用官方的Helm Chart进行OpenFaas的安装,执行以下命令:
arkade install openfaas
Using Kubeconfig: /home/docker/.kube/config
[Warning] unable to create secret basic-auth, may already exist: error: failed to create secret secrets "basic-auth" already exists
Client: x86_64, Linux
2023/06/14 19:01:46 User dir established as: /home/docker/.arkade/
"openfaas" already exists with the same configuration, skipping
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "openfaas" chart repository
Update Complete. ⎈Happy Helming!⎈
VALUES values.yaml
Command: /home/docker/.arkade/bin/helm [upgrade --install openfaas openfaas/openfaas --namespace openfaas --values /tmp/charts/openfaas/values.yaml --set operator.create=false --set openfaasImagePullPolicy=IfNotPresent --set faasnetes.imagePullPolicy=Always --set dashboard.enabled=false --set queueWorker.replicas=1 --set queueWorker.maxInflight=1 --set autoscaler.enabled=false --set basic_auth=true --set serviceType=NodePort --set basicAuthPlugin.replicas=1 --set gateway.replicas=1 --set ingressOperator.create=false --set clusterRole=false --set gateway.directFunctions=false --set dashboard.publicURL=http://127.0.0.1:8080]
Release "openfaas" has been upgraded. Happy Helming!
NAME: openfaas
LAST DEPLOYED: Wed Jun 14 19:01:53 2023
NAMESPACE: openfaas
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
To verify that openfaas has started, run:
kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"
To retrieve the admin password, run:
echo $(kubectl -n openfaas get secret basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode)
=======================================================================
= OpenFaaS has been installed. =
=======================================================================
# Get the faas-cli
curl -SLsf https://cli.openfaas.com | sudo sh
# Forward the gateway to your machine
kubectl rollout status -n openfaas deploy/gateway
kubectl port-forward -n openfaas svc/gateway 8080:8080 &
# If basic auth is enabled, you can now log into your gateway:
PASSWORD=$(kubectl get secret -n openfaas basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode; echo)
echo -n $PASSWORD | faas-cli login --username admin --password-stdin
faas-cli store deploy figlet
faas-cli list
# For Raspberry Pi
faas-cli store list \
--platform armhf
faas-cli store deploy figlet \
--platform armhf
# Find out more at:
# https://github.com/openfaas/faas
🐳 arkade needs your support: https://github.com/sponsors/alexellis
到了此时,安装成功!!!
如果想查看admin用户的密码,可以使用以下命令:
echo $(kubectl -n openfaas get secret basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode)
部署成功以后,通过kubernetes UI可以查看到被部署到kubernetes上的服务:
openfaas提供了UI访问,可以通过以下命令暴露访问端口:
kubectl rollout status -n openfaas deploy/gateway kubectl port-forward -n openfaas svc/gateway 8080:8080 &
执行以后可以使用http://127.0.0.1:8080可以访问faas ui,如下图所示:
openfaas还自带了一个函数商店,里面提供了一些默认的函数,你可以直接将这个函数进行部署,使用以下命令可以查看有哪些默认函数:
faas-cli store list
使用以下命令进行部署和查看部署情况
faas-cli store deploy figlet
faas-cli list
界面上点击"Deploy NEW Function"也可以进行部署,如下图所示,选择figlet进行部署,秒级完成。
部署完成以后在openfaas界面上可以看到已经部署的函数,figlet是函数商店中存在的一个函数,用于将输入转化为ASCII之后输出,下图展示了我们部署成功以后的界面,我们输入"HelloWorld"点击INVOKE可以看到结果。
3.2、安装到Linux主机上
如果你是本地部署,且不希望引入Kubernetes从而导致本地环境复杂,那么可以选择使用faasd。faasd 是OpenFaas提供的用于在单个主机上运行的服务,无需kubernetes,使其快速且易于管理。在底层,它使用containerd和容器网络接口CNI以及来自主项目的相同核心 OpenFaaS 组件。
faasd 本质是一个静态的 Golang 二进制文件,可以运行在Intelx86_64
和 ARM 等多架构之上,是本地实验非常方便的一个选择。
在Linux上部署faasd,这个安装完成以后实际上不止安装了faasd,还安装了OpenFaas Gateway(OpenFaas网关,内置UI界面)、Prometheus(Prometheus是最受欢迎的开源可观测平台框架)、NATS(NATS是一个开源、轻量级、高性能的云原生消息系统)。
$ git clone https://github.com/openfaas/faasd --depth=1
$ cd faasd
$ ./hack/install.sh
注意faasd不要和docker安装在同一台主机上,因为两者可能使用不同版本的contianerd造成冲突。
为了方便操作,还需要安装faas-cli,可以通过github地址https://github.com/openfaas/faas-cli/releases下载对应的版本进行安装。
注意,如果出现网络问题,部分环节安装可能不成功,届时需要手工接入,例如arkade的安装,如果不成功,会受到提示进行手工安装,手工安装完成以后可以修改install.sh
,注释掉已经完成的部分。
[openfaas@localhost hack]$ curl -sLS https://get.arkade.dev | sudo sh
Failed while attempting to install arkade. Please manually install:
1. Open your web browser and go to https://github.com/alexellis/arkade/releases
2. Download the latest release for your platform. Call it 'arkade'.
3. chmod +x ./arkade
4. mv ./arkade /usr/local/bin
5. ln -sf /usr/local/bin/arkade /usr/local/bin/ark
四、使用faas-cli部署函数
在完成了openfaas的部署以后就可以尝试创建属于自己的function并进行部署了,这个步骤也是比较简单的。
下面我们以创建一个用python写的函数为例,展示创建并使用openfaas部署函数,这个函数的作用是返回一个水果列表,包含水果的名称和水果的描述。
这里,我们使用python3-http项目模板,首先使用以下命令拉取对应的模板,命令执行后会拉取5个模板,如下代码所示:
[lucas@localhost openfaas-project]$ faas-cli template store pull python3-http
Fetch templates from repository: https://github.com/openfaas/python-flask-template at
2023/06/26 16:52:02 Attempting to expand templates from https://github.com/openfaas/python-flask-template
2023/06/26 16:52:04 Fetched 5 template(s) : [python27-flask python3-flask python3-flask-debian python3-http python3-http-debian] from https://github.com/openfaas/python-flask-template
[lucas@localhost template]$ ls
python27-flask python3-flask python3-flask-debian python3-http python3-http-debian
首先运行以下命令,创建一个fruits项目
[lucas@localhost openfaas-project]$ faas-cli new --lang python3-http fruits
Folder: fruits created.
___ _____ ____
/ _ \ _ __ ___ _ __ | ___|_ _ __ _/ ___|
| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
| |_| | |_) | __/ | | | _| (_| | (_| |___) |
\___/| .__/ \___|_| |_|_| \__,_|\__,_|____/
|_|
Function created in folder: fruits
Stack file written: fruits.yml
会生成一个fruits目录和一个fruits.yml配置文件,在fruits目录中有一个handler.py文件,这里就是函数的处理逻辑,默认如下内容:
def handle(event, context):
return {
"statusCode": 200,
"body": "Hello from OpenFaaS!"
}
我们将其修改为我们自己的业务逻辑:
data = {
"apple": {
"desc": "甜甜的苹果!"
},
"watermelon": {
"desc": "大大的西瓜!"
},
"litchi": {
"desc": "美味的荔枝!"
},
"grape": {
"desc": "又酸又甜的葡萄!"
}
}
def handle(event, context):
if event.path != "/":
path = event.path.strip("/")
fruit = data.get(name, None)
if details is not None:
res = {
"statusCode": 200,
"body": fruit
}
else:
res = {
"statusCode": 200,
"body": data
}
return res
接着,使用faas-cli命令行工具构建和部署函数:
$ faas-cli build -f fruits.yml
$ faas-cli push -f fruits.yml
$ faas-cli deploy -f fruits.yml
这将会将函数打包为Docker镜像,并将其推送到Kubernetes集群中,并进行部署,部署将是毫秒级(秒级)的,非常快,这也是serverless的优势所在。
顺利的话,部署完成以后,你将可以看到以下信息:
Deploying: fruits.
Deployed. 202 Accepted.
URL: http://127.0.0.1:8080/function/fruits
可以使用faas-cli命令行工具调用函数:
$ echo | faas-cli invoke fruits
你将能够在命令行中看到函数的响应,也可以通过界面进行操作,如下图所示:
通过以上演示,我们可以看到OpenFaaS的简单部署和使用过程。它提供了一个快速而高效的方式来构建和部署无服务器函数,让开发者能够专注于业务逻辑的实现而无需关注底层的基础设施,无论是构建小型应用还是复杂的企业级应用,OpenFaaS都是一个强大而可靠的选择,可以帮助开发者更好地利用无服务器架构的优势,提高开发效率和应用性能。
还在等什么,玩转serverless,就是OpenFaas!