有几种方法来测试OpenFaaS与Kubernetes的变化。我想概述一种我认为有用的方法,以便新的和潜在的贡献者能够快速入门和实验。我也会给你一个非常简单的概述,什么是OpenFaaS,以及当你安装它的时候会部署什么。
如果你使用Kubernetes控制器或用Go编写的开源项目,欢迎继续阅读并在Twitter上向我发送评论、问题和建议。
首先,什么是OpenFaaS?
OpenFaaS是一个开源项目,我是在2016年开始的,这样我就可以使用容器在自己的基础设施上运行无服务器功能。从那时起,它已经变得更多。它的用户和贡献者社区比我想象的要大得多。
尽管有一些误解,这个项目并没有得到风险投资家(VC)或外部公司的支持。所以社区依靠志愿者(包括我自己)来完成繁重的工作。

OpenFaaS在GitHub上有超过26000个星星,分布在40个存储库和大约350个贡献者。
当你把OpenFaaS添加到Kubernetes时,你会得到一些组件安装到你的集群中,每个组件都执行不同的任务。有些组件是我们建立的,有些则是来自CNCF。到目前为止,每个OpenFaaS组件都是用Go编写的。
这些核心组件可以在openfaas组织中找到:
- 网关--UI和REST API,它使用Prometheus进行自动扩展
- basic-auth插件,或商业SSO插件
- 队列工作器,从NATS的异步请求中脱队并执行它们
然后,以下CNCF项目作为依赖项被安装:
- Prometheus用于监控每个功能和核心服务的速率、错误和持续时间(RED)指标。
- AlertManager用于监控函数的高调用率,然后触发自动扩展。当任何警报被解决时,该功能将缩减到其原来的最小副本数量。
- NATS提供了一种通过队列在后台执行任务的方法。
从那里,他们通过环境变量来配置任何非机密的配置数据,比如说:
- 超时
- 并发水平
- 多少次重试的事情
- 一个功能标志
- 日志的粗体字
秘密用于注入机密数据,如API密钥,主要的例子是用于认证网关的认证令牌。
这些配置项可以通过舵手图来改变,也可以通过arkadeKubernetes市场来改变,它抽象了图表的机制,使其看起来像一个单线安装。
OpenFaaS可以部署到Kubernetes的功能并不神奇,它们实际上与这些被称为 "核心服务 "或 "openfaas栈 "的服务非常相似
我如何部署OpenFaaS?
我部署OpenFaaS的方式往往是使用kind - Kubernetes in Docker。KinD是一个社区项目,由谷歌的Ben Elder领导。
有几十种方式来运行Kubernetes,你可以在你的本地电脑上运行它,也可以在云端运行。在本地运行往往是最便宜的选择,使用在Docker容器内运行的本地Kubernetes发行版,意味着同样的指令对Linux、MacOS和Windows用户都适用。
arkade是一个开源的Kubernetes市场--它提供应用程序,也提供CLI--大约有60个组合。
# Note: you can also run without `sudo` and move the binary yourself
curl -sLS https://dl.get-arkade.dev | sudo sh
# Windows users with Git Bash
curl -sLS https://dl.get-arkade.dev | sh
用arkade下载种类。
arkade get kind
确保你已经安装了Docker,然后创建一个集群。
kind create cluster
kubectl 的上下文将被设置为新的kind集群。它可以支持多个,但我倾向于在需要时创建/删除,而不是管理一个以上的本地kind集群。
接下来使用其舵手图安装OpenFaaS,以及所有的默认值。
arkade install openfaas
arkade应用有一些你可以使用的标志,这些标志可以转换为舵手图的选项。
--gateways 2转换为--set gateway.replicas=2--load-balancer生成--set serviceType=LoadBalancer
从这里开始,应用程序会告诉你如何将网关和UI端口转发到你的本地计算机。如果你想在任何时候再次看到这些信息,那么运行arkade info openfaas 。
访问OpenFaaS最简单的方法是通过CLI,在那里你可以发现样本函数并部署一些东西。
faas-cli store list | grep nodeinfo
faas-cli store describe nodeinfo
faas-cli store deploy nodeinfo
你会得到一个URL,可以通过http://127.0.0.1 在你的网关上访问,你可以通过curl 来调用它。
制作第一个补丁
在这个例子中,我们将为OpenFaaS的Kubernetes控制器打一个补丁。如果你只需要测试舵手图的补丁,你可以在图的README中看到说明。
Fork和分支
分叉你要修改的仓库,比如faas-netes。
克隆你的分叉项目,放入GOPATH中
mkdir -p $GOPATH/src/github.com/openfaas/
cd $GOPATH/src/github.com/openfaas/
git clone https://github.com/openfaas/faas-netes
cd faas-netes
如果你想避免拉入所有的历史,在git clone 语句中加入--depth=1 。
现在创建一个分支,开始工作。我们将使Kubernetes操作者在启动时打印文本 "Hello World"。
git checkout -b alexellis/print-hello
现在,编辑main.go ,并添加到func main() {
log.Println("Hello world")
测试新的版本
我们将建立一个新的容器镜像,将其推送到注册表,然后使用其舵手图,和新的镜像参考,再次安装openfaas。有些组件需要这样开发,由于它们引用内部组件的方式,或者作为Pod的一部分被捆绑。
这个工作流程可能不是最优化的,但对我来说已经足够好了。
检查Makefile,看看它是否有一个目标,如make local 或make docker ,如果没有,就继续构建你自己的镜像。
export USERNAME="alexellis"
docker build -t $USERNAME/faas-netes:print-hello .
docker push $USERNAME/faas-netes:print-hello
然后你可以再次使用arkade install ,将新版本部署到集群中。
export USERNAME="alexellis"
arkade install openfaas \
--set faasnetes.image=$USERNAME/faas-netes:print-hello
如果你在网关上工作,那么你应该停止端口转发并再次运行该命令,因为pod将被更新。
现在检查你所更新的组件的日志。在这个例子中,Kubernetes控制器与网关捆绑在同一个Pod中,所以你需要挑选特定的容器。
kubectl logs -n openfaas deploy/gateway \
-c faas-netes
在撰写本文时,OpenFaaS Kubernetes控制器可以以两种模式运行:作为控制器或CRD操作员。
CRD操作员允许有人使用kubectl apply 来创建函数,而不是使用faas-cli 。比如说:
# nodeinfo.yaml
apiVersion: openfaas.com/v1
kind: Function
metadata:
name: nodeinfo
namespace: openfaas-fn
spec:
name: nodeinfo
image: ghcr.io/openfaas/nodeinfo:75d61698aaaa14345c7983f5a5db91f6da80e5bb
这在未来可能会改变,但就目前而言,往往有两个代码路径需要更新。一个例子是为gVisor和kata容器添加自定义运行时支持。我们必须为控制器编辑HTTP处理程序,然后再为操作员编辑。
为了改变CRD操作者的图像,要添加:
export USERNAME="alexellis"
# Add the operator.create flag:
arkade install openfaas \
--set operator.image=$USERNAME/faas-netes:print-hello \
--set operator.create=true
# Check its logs:
kubectl logs -n openfaas deploy/gateway \
-c operator
你如何冲洗和重复这些?
每次更改后,建立一个新的图像标签,如alexellis/faas-netes:print-hello1 ,推送它,并运行arkade install 命令。
当你完成后,你可以运行kind delete cluster ,或者让集群运行以进一步测试。
发送一个拉动请求
如果你已经提出了问题,并且团队中有人已经批准了你的修改,你应该发送一个Pull Request(PR)。重要的是,我们要填写整个PR模板,以避免给每个人带来不必要的工作。
PR模板的一部分会问:"这一点是如何被测试的?"。你会惊讶于有多少人漏掉了这个字段。复制并粘贴你使用的arkade命令,以及你得到的输出。
为什么?这样,验证你的补丁的人就可以快速完成。你可能还想分享容器镜像,这样别人就可以测试你的代码,而不需要自己做本地构建。
总结
我们看了一下OpenFaaS的核心组件,以及当你把项目安装到你的集群上时,会部署什么。我们介绍了用于本地Kubernetes集群的kind 工具和arkade ,以安装OpenFaaS,而不需要深入思考头盔。使用docker ,我们构建并推送了一个测试版本的代码,并验证了它的工作。
这种方法可以用于项目中的大多数组件:fork、clone、编辑、docker build、docker push、带有--set 标志的arkade安装,然后发送PR。
构建、推送和部署容器到集群的技术原理应该是一直有效的,但有时你可以在自己的电脑上构建和运行一个控制器,并使反馈循环更加快速。
我把这两种技术用于其他针对Kubernetes的项目,比如inlets-operator。它可以通过在云提供商中创建虚拟机并在那里启动隧道服务器,为KinD和私有集群添加云式LoadBalancers。每当我们添加一个新的云,如Azure或AWS EC2,可以更容易地在我自己的电脑上测试控制器,并让它指向集群,而不是在集群内运行。