快速上手云原生FaaS平台-OpenFunction

经过超过三年的开发,Knative近期发布了1.0版本,标致着它的核心组件(Serving,Eventing)已经可用。这说明了整个Kubernetes社区内包括 OpenFaas,OpenWhisk,Kubeless,Fn等等在内的无服务器框架生态的成熟度。这些框架仅仅专注提供函数的容器化打包,但并不提供完整功能的函数即服务(FaaS)平台。

OpenFunction是(KubeSphere)[https://kubesphere.io/]团队支持的一个开源项目,2021年三月发布了第一个版本。它旨在增强现有的框架,在Kubernetes上构建并运行事件驱动的函数,提供一个端到端的FaaS平台。

OpenFunction组件

目前,OpenFunction分为四个自定义的资源类型(CRDs):

  • Function: 通过协调BuilderServing组件来控制整个函数的生命周期
  • Builder: 将函数编译、构建、发布到镜像仓库
  • Serving: 运行函数并控制扩缩容事件
  • Domain: 为函数提供一个服务入口

OpenFunction

OpenFunction在引擎内使用以下几个开源项目来实现每个CRD

  • Builder 使用了 (Shipwright)[https://shipwright.io/] 和 (Cloud Navite Build Packs)[https://buildpacks.io/] 来编译和构建函数代码到容器内
  • Serving 支持 (Knative)[https://knative.dev/docs/]和 OpenFuncAsyns,运行时基于(KEDA)[https://keda.sh/]和(Dapr)[https://dapr.io/]
  • Domain 默认使用nginx-ingress
  • 另外,(cert manager)[https://cert-manager.io/] 和 (Tekton Pipeline)[https://tekton.dev/] 用来将所有的组件组合起来

OpenFunction 提供了一个便捷的命令行工具用来安装所有的组件,但在这个演示中,我们会使用原始的安装脚本在Minikube中安装和运行一些示例。

启动Minikube

OpenFunction 被设计可以运行在任何Kubernetes发行版内,在这个演示中,我们使用Minikube作为Kubernetes演示环境。由于OpenFunction的组件依赖,Minikube至少需要2个CPU和4GB的内存:

$ minikube start -cpus 2 -memory 4096

备注: minikube需要运行1.19或更高版本的Kubernetes

接下来,我们需要为Builder组件提供一个用来推送镜像的凭据。这里我会使用Docker,理论上任何镜像仓库都可以使用。

$ kubectl create secret docker-registry regcred -docker -server=https://index.docker.io/v1/ -docker-username=<myUsername> -docker-password=<myPassword>

安装OpenFunction

现在我们做好了安装OpenFunction的准备工作。克隆(OpenFunction)[https://github.com/OpenFunction/OpenFunction]的代码仓库并检查hack/deploy.sh脚本。

作为一个基础的演示,我们只需要Shipwright,Knative,cert-manager作为依赖。

$ sh hack/deploy.sh -with-shipwright -with-knative -with-cert-manager

下一步,安装OpenFunction:

$ kubectl create -f https://github.com/OpenFunction/OpenFunction/releases/download/v0.4.0/bundle.yaml

等待controller manager的状态变为Running且健康状态为正常.

$ kubectl get pods -namespace openfunction -w
NAME READY STATUS RESTARTS AGE
openfunction-controller-manager-6955498c9b-hjql7 2/2 Running 0 2m2s

部署第一个函数

示例中所有的应用都在samples仓库中提供,但是当前只有golang版本有完整的文档。我也使用golang作为示例,如果使用其他支持的语言,只需要修改以下yaml文件的必要字段。(openfunction.yaml):

apiVersion: core.openfunction.io/v1alpha2
kind: Function
metadata:
  name: function-sample
spec:
  version: "v1.0.0"
  image: "<your-docker-registry>/sample-go-func:latest"
  imageCredentials:
    name: regcred
  port: 8080 # default to 8080
  build:
    builder: openfunction/builder:v1
    env:
      FUNC_NAME: "HelloWorld"
      FUNC_TYPE: "http"
    srcRepo:
      url: "https://github.com/OpenFunction/samples.git"
      sourceSubPath: "latest/functions/Knative/hello-world-go"
  serving:
    runtime: "Knative" # default to Knative
    template:
      containers:
        - name: function
          imagePullPolicy: Always

创建函数:

$ kubectl create -f openfunction.yaml

如果发生错误,检查创建出来的Pod或者检查Pod的日志。

$ kubectl get functions.core.openfunction.io
$ kubectl get servings.core.openfunction.io

测试示例函数

当函数工作负载成为运行状态并且健康状态是正常时,我们可以将服务进行暴露来触发事件。

新建一个终端,创建一个可以访问minikube内部服务的tunnel

$ minikube tunnel

使用如下命令获取我们的函数URL:

$ kubectl get svc

访问服务(替换为你环境中的URL):

$ curl http://serving-rjgqg-ksvc-zf8j2.default.127.0.0.1.sslip.io

正常情况下我们会看到 “Hello,World!”

未来的工作

由于OpenFunction 使用 Knative 实现自身的运行时组件,所以可以兼容所有的Knative examples 。从个人经验来看,对于已经使用Kubernetes集群的团队,无服务器框架可以让开发人员快速运行任意的业务函数(例如:当事件X发生时发送邮件、当webhoo被k触发时执行一个数据转换任务)。在本文的第二部分中,我们将探索一个更现实的无服务器场景。

原文地址