开源技术 * IBM 微讲堂:Kubeflow 系列(观看回放 | 下载讲义) 了解详情

IBM Developer 博客

通过 IBM Developer 关注最新动态并获取信息

链接函数、迁移程序、存储对象,以及更多关于无服务器常见问题的解答。


围绕着 Knative 和 OpenWhisk 等项目,我们收到了许多有关无服务器的问题。因此,我们将一些最常见的问题与相应的答案汇总在一起,与您分享。

1. OpenWhisk 与 Knative 的关系?

Knative 是搭建在 Kubernetes 上的新型无服务器平台,可用于无服务器工作负载的部署和管理,引发了大量关注。虽然是一个相对较新的开源项目,但 Knative 仍获得了许多参与者的帮助,他们中有来自 IBM、Red Hat、Google、Pivotal 等知名公司经验丰富的开发人员。IBM 积极参与 Knative 和 Apache OpenWhisk 这两个开源无服务器平台的建设,下面我们来看一看两者之间的关系。

作为开源无服务器平台,OpenWhisk 用于执行响应事件函数。IBM Cloud Functions 帮助用户省去设置管理平台的繁琐流程,轻松使用 OpenWhisk,并提供多种功能:

  • 支持 Node.js、Scala、PHP、Go 和 Swift 等多种编程语言。
  • 集成 Kafka、云对象存储、IBM Cloudant 和 Slack 等多种服务。
  • 实现最大化利用,不为空闲资源买单。
  • 加快交付时间,编写代码提交 IBM Cloud Functions 运行,无需管理虚拟机或基础架构资源。

Knative 搭建在 Kubernetes 集群上,扩展了 Kubernetes 的功能,创造无服务器的用户体验。相较 IBM Cloud Functions 等平台解决方案,Knative 需要在配置、维护和设置上投入更多精力,用户控制权相应也会更大。如已搭建 Kubernetes 集群管理应用程序,添加 Knative 到 stack 非常简单。以 IBM Cloud 为例,使用 Knative 附加组件,将 Knative 安装到集群即可开始使用。

OpenWhisk 和 Knative 都是开源项目,它们提供了无服务器的好处:更好的扩展性,更高的资源利用率,更快的交付时间。如对用户控制权要求不高,或想直接使用无服务器产品,可考虑使用 IBM Cloud Functions。如正在使用 Kubernetes,或希望获得更多 stack 控制权限,Knative 可能更为合适。

2. 如何在 IBM Cloud Functions 上让一个函数调用另一个函数?

用户可使用序列链接多个函数。序列是一种特殊动作类型,可将多个动作链接为一串动作。每个动作的结果作为序列中下一个动作的参数进行传递。创建序列链接 action_1action_2 的命令行界面即:

ibmcloud fn action create <sequence_name> --sequence <action_1>, <action_2>

序列被触发时,触发 action_1,并将其输出作为输入传递给 action_2。

实际情况可能更加复杂,如让 action_1 多次调用 action_2(对数组中每个值调用一遍),或需要 action_1 并行调用其他三个动作。直接用一个函数调用另一个函数,可使用 OpenWhisk SDK(包含在 JavaScript 运行时里)。需要 SDK 时,提供动作名称及参数,可直接 invoke 所需动作:可以在这个用于图像处理的 Code Pattern 中看到如何使用。

var openwhisk = require('openwhisk');
const ow = openwhisk()
await Promise.all([
    ow.actions.invoke({
      actionName: "/<namespace>/<package_name>/<action_name_1>",
      params: { bucket: params.bucket, url: params.body, key: params.key }
    }),
    ow.actions.invoke({
      actionName: "/<namespace>/<package_name>/<action_name_2>",
      params: { bucket: params.bucket, url: params.body, key: params.key }
    })]);

以上两个动作将并行运行。OpenWhisk SDK 为编写动作和触发器代码还提供了其他选择。查看 npm 模块页深入学习 SDK,还有示例说明如何运作。

链接操作还可通过访问提供的 HTTP 端点实现,端点针对 IBM Cloud Functions 中创建的每个函数生成:

curl -u API-KEY -X POST https://us-east.functions.cloud.ibm.com/api/v1/namespaces/beemarie/actions/my_action?blocking=true

函数默认通过 POST 请求触发,也可通过 web 操作启用,可选择 POST、GET、PUT、PATCH、DELETE、HEAD、OPTIONS 等任一 HTTP 方法调用。Web 操作也可从任何基于 web 的应用程序中调用,并且与创建操作的用户关联(非操作调用者)。将函数转换为 web 操作后,可使用 API 网关将函数组装为完整 API,为 API 提供安全性、OAuth 协议支持、速率限制和自定义域支持。

3. 如何将应用程序迁移到无服务器工作负载?

这是我们经常听到的问题。无服务器架构带来的优点不胜枚举。如希望迁移至无服务器负载,建议采取以下步骤:

  • 调查研究。了解无服务器最佳实践案例,后端 API、移动后端、数据处理、任务计划、事件驱动应用程序等都是非常适合了解无服务器架构的案例。
  • 测试效果。 从单一微服务开始,保证其在无服务器平台上运行并达到需要的效果和目标。比如根据潜在操作的使用模式,增加自动扩展性或节约成本。
  • 部署容器。如果应用程序或微服务能被部署到容器且过程相对简单,可尝试 IBM Cloud FunctionsKnative。IBM Cloud Functions 提供 Docker 运行时,运行用户指定的 Docker 映像。Knative 部署单元是容器映像,用户可轻松将应用程序部署到容器。
  • 寻求帮助。关于 OpenWhiskKnative 有很多开源社区,每天都有人在维护建设,用户可以提问互动,促进项目建设发展。加入 OpenWhisk 的 Slack 社区频道:openwhisk.apache.org/slack.html 和 Knative 的 slack 社区频道:knative.slack.com

4. 在哪里存储文件、安装数据库?

无服务器平台上运行代码通常发生在容器中。技术上,容器环境确实有可交互的文件系统,但非永久存在;不需要无服务器操作时,运行代码的容器也会被删除。

搭建无服务器应用程序时,经常使用云提供商提供的对象存储或数据库托管服务。对象存储可根据需要上传文件,不必担心存储基础架构,非常适合无服务器模型。使用云提供商服务,省去建设基础架构、维护数据库和存储管理的烦恼。

有些对象存储或数据库服务会提供事件支持,在无服务器应用程序中启用事件驱动架构。IBM Cloud Functions 可侦听云对象存储 bucket 中添加的新项目,并触发触发器。

无服务器架构即尽可能使用托管服务,充分发挥团队核心竞争力,全面深入了解客户需求,创造贴身定制的业务逻辑!

5. 如何调试无服务器函数?

无法访问运行代码的运行时环境和基础架构,会造成在生产环境中调试无服务器应用程序上的困难,但现在仍有办法解决,相信随着技术的不断成熟,未来还会有更多工具出现:

  • 日志

    平台会接收写入 stdoutstderr 的日志。通常会有日志记录服务的集成,帮助用户收集日志。IBM Cloud Functions 支持 IBM Log Analysis with LogDNA 服务,能够收集相关日志,帮助用户调试问题。

  • 指标

    调用状态、调用错误、操作开始和结束时间、操作冷启动时间等高级别指标信息,通常自动内置于无服务器平台。大多数云提供商都会将此类指标数据发送到监控服务,用户可在 dashboard 上监视操作。IBM Cloud Functions 将指标发送到 IBM Cloud Monitoring,用户可使用 Grafana 查看,自定义 dashboard,创建基于指标事件值的警报等。

开发过程可能也需要调试。Apache OpenWhisk 社区最近引入了 wskdebug 工具,支持动作的完全调试,代码的自动重新加载,代码更改时的动作自动调用等,目前直接支持 Node.js,也可使用命令行设置其他语言。

结束语

即刻开启无服务器之旅,免费注册 IBM Cloud Lite 帐户,使用 IBM Cloud Functions,或在 IBM Cloud 上创建 Kubernetes 集群,启用 Knative 附加组件,开始探索吧!

本博客翻译自:Top five serverless questions(2019-11-04)