翻译:
Nuclio 是一个高性能“无服务器”框架,专注于数据、I/O 和计算密集型工作负载。它与流行的数据科学工具很好地集成,例如Jupyter和Kubeflow;支持多种数据和流媒体源;并支持通过 CPU 和 GPU 执行。Nuclio项目于2017年启动,并不断快速发展;许多初创企业和企业现在都在生产中使用 Nuclio。
您可以将 Nuclio 用作独立的 Docker 容器或在现有Kubernetes集群之上使用;请参阅 Nuclio 文档中的部署说明。您还可以通过Iguazio 数据科学平台中完全托管的应用程序服务(在云端或本地)使用 Nuclio ,您可以免费试用。
如果您希望通过代码创建和管理 Nuclio 函数(例如,从 Jupyter Notebook 中),请参阅Nuclio Jupyter 项目,该项目提供一个 Python 包和 SDK,用于从 Jupyter Notebook 创建和部署 Nuclio 函数。Nuclio 也是用于数据科学自动化和跟踪的新开源MLRun库以及用于构建和部署可移植、可扩展的 ML 工作流程的开源Kubeflow Pipelines框架的组成部分。
Nuclio 速度极快:单个函数实例每秒可以处理数十万个 HTTP 请求或数据记录。这比其他一些框架快 10-100 倍。要了解有关 Nuclio 工作原理的更多信息,请参阅 Nuclio架构文档、阅读Nuclio 与 AWS Lambda的评论,或观看Nuclio 无服务器和 AI 网络研讨会。您可以在Nuclio 网站上找到其他文章和教程的链接。
Nuclio 是安全的:Nuclio 与Kaniko集成,允许在运行时以安全且可用于生产的方式构建 Docker 映像。
如需更多问题和支持,请单击加入Nuclio Slack工作区。
现有的云和开源无服务器解决方案都无法满足无服务器框架的所有所需功能:
- 以最小的 CPU/GPU 和 I/O 开销以及最大的并行度进行实时处理
- 与各种数据源、触发器、处理模型和 ML 框架的本机集成
- 具有数据路径加速功能的有状态函数
- 跨低功耗设备、笔记本电脑、边缘和本地集群以及公共云的可移植性
- 开源但专为企业设计(包括日志记录、监控、安全性和可用性)
Nuclio 的创建就是为了满足这些要求。它被有意设计为一个可扩展的开源框架,使用模块化和分层的方法,支持不断添加触发器和运行时,希望许多人能够加入到为 Nuclio 开发新模块、开发人员工具和平台的努力中。
探索 Nuclio 最简单的方法是运行 Nuclio 仪表板的图形用户界面 (GUI)。运行仪表板所需的只是 Docker:
docker run -p 8070:8070 -v /var/run/docker.sock:/var/run/docker.sock --name nuclio-dashboard quay.io/nuclio/dashboard:stable-amd64
浏览到http://localhost:8070,创建一个项目并添加一个函数。当在编排平台(例如 Kubernetes)外部运行时,仪表板将简单地部署到本地 Docker 守护进程。
假设您正在使用 Docker 运行 Nuclio,作为示例,创建一个项目并部署预先存在的模板“dates (nodejs)”。使用docker ps
,您应该看到该函数已部署在其自己的容器中。然后您可以使用curl调用您的函数;docker ps
(使用Nuclio 仪表板检查端口号是否正确):
curl -X POST -H "Content-Type: application/text" -d '{"value":2,"unit":"hours"}' http://localhost:37975
如需通过仪表板 UI 或 Nuclio 命令行界面 ( ) 在 Kubernetes 上使用 Nuclio 的完整分步指南nuctl
,请探索以下学习途径:
- Kubernetes 上的 Nuclio 入门
- Google Kubernetes Engine (GKE) 上的 Nuclio 入门
- Azure 容器服务 (AKS) 上的 Nuclio 入门
- 实际操作 Kubernetes 沙箱和 Nuclio 指导说明,在 Katacoda 上免费
“当这种情况发生时,就这样做”。Nuclio 试图抽象出围绕发生的事件(例如,一条记录写入 Kafka、发出 HTTP 请求、计时器到期)的所有支架,并将该信息传递给一段代码进行处理。为此,Nuclio 希望用户(至少)提供有关什么可以触发事件以及此类事件发生时要运行的代码的信息。用户通过命令行实用程序 ( nuctl
)、REST API 或通过 Web 应用程序直观地向 Nuclio 提供此信息。
Nuclio 获取此信息(即 functionhandler
和 function configuration
)并将其发送给构建器。该构建器将制作函数的容器映像,其中包含用户的处理程序和一个软件,该软件可以在收到事件时执行该处理程序(稍后会详细介绍)。然后,构建器将通过将其推送到容器注册表来“发布”该容器映像。
发布后,即可部署功能容器镜像。部署者将从功能的配置中制作编排器特定的配置。例如,如果部署到 Kubernetes,部署程序将获取配置参数,例如副本数量、自动缩放计时参数、函数请求的 GPU 数量,并将其转换为 Kubernetes 资源配置(即部署、服务、入口等)。
注意:部署者不会直接创建 Kubernetes 本机资源,而是创建“NuclioFunction”自定义资源 (CRD)。称为“控制器”的 Nuclio 服务侦听 NuclioFunction CRD 上的更改,并创建/修改/销毁适用的 Kubernetes 本机资源(部署、服务等)。这遵循标准 Kubernetes 运算符模式
然后,编排器将从已发布的容器映像中启动容器并执行它们,为它们提供功能配置。这些容器的入口点是“处理器”,负责读取配置、监听事件触发器(例如连接到Kafka、监听HTTP)、在事件发生时读取事件并调用用户的处理程序。处理器负责许多其他事情,包括处理指标、整理响应、优雅地处理崩溃等。
一旦构建并部署到 Kubernetes 这样的编排器,Nuclio 函数(即处理器)就可以处理事件、根据性能指标进行扩展和缩减、发送日志和指标 - 所有这些都无需任何外部实体的帮助。部署后,您可以终止 Nuclio 仪表板和控制器服务,Nuclio 功能仍将完美运行和扩展。
然而,缩放到零并不是他们自己能够做到的。相反,一旦缩放到零,当新事件到达时,Nuclio 函数就无法自行扩展。为此,Nuclio 提供了“Scaler”服务。这处理了缩放到零,更重要的是从零缩放的所有问题。
以下示例函数实现使用Event
和Context
接口来处理输入和日志,返回结构化 HTTP 响应;(也可以使用简单的字符串作为返回值)。
在围棋中
package handlerimport ( "github.com/nuclio/nuclio-sdk-go" )
func Handler(context *nuclio.Context, event nuclio.Event) (interface{}, error) { context.Logger.Info("Request received: %s", event.GetPath())
<span class="pl-k">return</span> nuclio.<span class="pl-smi">Response</span>{ <span class="pl-c1">StatusCode</span>: <span class="pl-c1">200</span>, <span class="pl-c1">ContentType</span>: <span class="pl-s">"application/text"</span>, <span class="pl-c1">Body</span>: []<span class="pl-smi">byte</span>(<span class="pl-s">"Response from handler"</span>), }, <span class="pl-c1">nil</span>
}
import ( "github.com/nuclio/nuclio-sdk-go" )
func Handler(context *nuclio.Context, event nuclio.Event) (interface{}, error) { context.Logger.Info("Request received: %s", event.GetPath())
return nuclio.Response{
StatusCode: 200,
ContentType: "application/text",
Body: []byte("Response from handler"),
}, nil
}" tabindex="0" role="button">
在Python中
def handler(context, event): response_body = f'Got {event.method} to {event.path} with "{event.body}"'<span class="pl-c"># log with debug severity</span> <span class="pl-s1">context</span>.<span class="pl-s1">logger</span>.<span class="pl-en">debug</span>(<span class="pl-s">'This is a debug level message'</span>) <span class="pl-c"># just return a response instance</span> <span class="pl-k">return</span> <span class="pl-s1">context</span>.<span class="pl-v">Response</span>(<span class="pl-s1">body</span><span class="pl-c1">=</span><span class="pl-s1">response_body</span>, <span class="pl-s1">headers</span><span class="pl-c1">=</span><span class="pl-c1">None</span>, <span class="pl-s1">content_type</span><span class="pl-c1">=</span><span class="pl-s">'text/plain'</span>, <span class="pl-s1">status_code</span><span class="pl-c1">=</span><span class="pl-c1">201</span>)</pre><div class="zeroclipboard-container"> <clipboard-copy aria-label="Copy" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 tooltipped-no-delay d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w" value="def handler(context, event): response_body = f'Got {event.method} to {event.path} with "{event.body}"' # log with debug severity context.logger.debug('This is a debug level message') # just return a response instance return context.Response(body=response_body, headers=None, content_type='text/plain', status_code=201)" tabindex="0" role="button"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon"> <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
更多示例可以在示例页面中找到。
- 设置
- Docker 上的 Nuclio 入门
- Minikube 上的 Nuclio 入门
- Kubernetes 上的 Nuclio 入门
- Azure Kubernetes 服务 (AKS) 上的 Nuclio 入门
- Google Kubernetes Engine (GKE) 上的 Nuclio 入门
- 在 Raspberry Pi 上开始使用 Nuclio(即将推出)
- 任务
- 概念
- 参考
- 例子
- 沙盒
- 贡献
- 媒体
如需支持和其他产品信息,请加入活动的Nuclio Slack工作区。