OpenFaaS - 以自己的方式运行容器化函数
译者注: 本文篇幅较长,有助于了解 FaaS 和 OpenFaaS。作者分别从开发人员和运维人员的视角来了解 OpenFaaS,对了解新的技术是个很好的方式。
本文翻译自 Ivan Velichko 的 OpenFaaS - Run Containerized Functions On Your Own Terms。
长期以来,无服务器(serverless) 对我来说无非就是 AWS Lambda 的代名词。Lambda 提供了一种方便的途径,可以将任意代码附加到平台事件(云实例的状态变更、DynamoDB 记录的更新或新的 SNS 消息)中。但是,我时不时会想到某个逻辑,但其又没大到足以有自己的服务,同时有不适合任何现有服务的范围。因此,我经常将其放入函数中,以便日后使用 CLI 命令或者 HTTP 调用来调用它。
几年前,我来开了 AWS,自那以后,我一直怀念部署无服务器功能的便利性。因此,当我得知 OpenFaaS 项目时惊喜万分。它将在 Kubernetes 集群上部署函数变得简单,甚至仅需要 Containerd 就可以部署到虚拟机上。
有兴趣?那么继续!
无服务器与 FaaS
无服务器 已成为一个流行词,目前其实际含义扔不够清晰。
许多现代平台被视为 无服务器 平台。在 AWS Fargate 或 GCP Cloud Run 上部署容器化服务?无服务器!在 Heroku 上运行应用程序?也可能是无服务器的。
同时,我更喜欢将 FaaS 视为一种具体的设计模式。按照 FaaS 范式,可以部署代码片段(响应某些外部时间执行的函数)。这些函数与事件驱动程序中的回调类似,但是是运行在其他人的的服务器上。由于操作的是函数而不是服务器,顾名思义 FaaS 是无服务器的。
source
OpenFaaS 项目旨在将 Kubernetes 集群或者独立的虚拟机等低级基础设施转化为管理无服务器函数的高级平台。
站在开发人员的角度,这样一个平台看起来是真的无服务器的 -- 你只需要知道特定的 CLI/UI/API 来处理 函数 抽象。但站在运维的角度,需要了解 OpenFaaS 如何使用 服务器 来运行这些函数。
就我而言,我经常既是开发又是运维,下面我将尝试从二者展开说明。然而,我认为在评估 UX 时,我们应该明确区分它们。
开发人员眼中的 OpenFaaS
OpenFaaS 创建于 2016 年,现在网上也有大量的教程。这里不会重复介绍,但可以通过以下链接了解:
- How to deploy OpenFaaS
- Create Functions
- Build Functions
- Writing a Node.js function - step-by-step guide
相反,我将描述我所理解的 OpenFaaS。我希望有助于一些需要评估该技术是否解决其问题的人,以及那些希望更有效地使用该技术的人。
函数运行时
在进入正式编码之前,有必要了解下其未来的执行环境(又名运行时)。或者,简单说:
- 如何启动函数
- 如何组织 I/O 操作
- 如何重置 / 终止函数
- 如何隔离函数和调用
OpenFaaS 自带多个运行时模式,这些模式针对不同的场景定制。因此,不同的场景下上述问题的答案会略有不同。
OpenFaaS 函数在容器中运行,并且每个容器必须遵守简单的约定 :它作为监听在预设端口(默认为 8080)上的 HTTP 服务器,临时存储并且是无状态的。
然而,OpenFaaS 通过 函数 watchdog(译者注:watchdog 不做翻译)模式避免了用户编写此类服务器。函数 watchdog 是一种轻量级 HTTP 服务器,可以感知如何执行实际函数业务逻辑。因此,安装在容器中的所有内容加上作为入口点的 watchdog,就构成了函数的运行时环境。
经典 watchdog
从最简单的开始,或者又是被称为经典 watchdog:
这种模式下,watchdog 启动了监听在 8080 端口的轻量级 HTTP 服务器,每个进来的请求都会:
- 读取请求头和请求体
- fork 或者 exec 包含实际函数的可执行文件
- 将请求头和请求体写入到函数进程的 stdin
- 等待函数进程的退出(或者超市)
- 读取函数进程的 stdout 和 stderr
- 在 HTTP 响应中将去读的字节发送回调用方
上述逻辑类似于传统的 通用网关接口(CGI)。一方面,每次函数调用都启动单独的进程看起来不够高效,而另一方面,它确实超级方便,因为 任何使用 stdio 流进行 I/O 处理的程序(包括最喜欢的 CLI 工具)都可以部署为 OpenFaaS 函数。
提起隔离,我们有必要区分下函数和调用:
- OpenFaaS 中的不同函数始终分布在不同的容器中
- 一个函数可以有一个或多个容器 —— 取决于缩放选项
- 同一函数的独立调用可能会最终进入同一个容器
- 同一函数的独立调用将始终使用不同的进程进行
反向代理 watchdog
注意:使用 OpenFaaS 官方术语,本节讨论在 HTTP 模式下运行的 of-watchdog。但我个人认为称之为反向代理 watchdog 更加形象。
如果 经典 运行时类似于 CGI,那么这个运行时模式类似于后来的 FastCGI。运行时希望在 watchdog 后面有一个长期运行的 HTTP 服务器,而不是每次函数调用时创建新的进程。这本质上是 将 watchdog 组件变成反向代理:
当容器启动时,反向代理 watchdog 也会创建一个监听在 8080 端口的轻量级 HTTP 服务器。然而,与 经典 watchdog 不同的是反向代理watchdog 只创建一次函数的进程,并将其当成(长期运行的)上游服务器。然后,函数调用转变成到该上游的 HTTP 请求。
然而,反向代理模式并不为了取代经典模式。经典模式的强项在于其函数的编写非常简单。这也是没有 HTTP 服务器的代码的唯一选择。比如使用 Cobol、bash 或者 PowerShell 脚本等等编写的函数。
何时该使用反向代理运行时模式:
- 函数需要在两次调用之间保持状态:
- 缓存
- 持久连接(例如,保持从函数到数据库的连接打开)
- 有状态函数
OpenFaaS - 以自己的方式运行容器化函数相关推荐
- 容器安全 - 以只读方式运行容器
<OpenShift 4.x HOL教程汇总> 以只读的方式运行镜像 $ podman run --rm -it --name readonly --read-only --tmpfs=/ ...
- 容器化单页面应用中RESTful API的访问
最近在工作中,需要让运行在容器中的单页面应用程序能够访问外部的RESTful API.这个需求看起来并不困难,不过实现起来还是有些曲折的.在此,我就将这部分内容总结一下. 在入正题之前,有个一问题,就 ...
- Docker容器化实战第二课 镜像、容器、仓库详解
03 镜像使用:Docker 环境下如何配置你的镜像? 今天我将围绕 Docker 核心概念镜像展开,首先重点讲解一下镜像的基本操作,然后介绍一下镜像的实现原理.首先说明,咱们本课时的镜像均指 Doc ...
- 学习笔记:云原生容器化技术——Docker
Docker学习笔记 前言 一.Docker概述 1.1 Docker为什么会出现? 1.2 Docker的历史 1.3 Docker为什么这么火爆? 1.4 虚拟机技术与容器化技术的区别 二.Doc ...
- Intel Developer Cloud - 开放的容器化部署平台
目录 概况介绍 示例演示 申请注册 概况介绍 Intel® DevCloud平台为每个注册用户提供独立的沙箱运行环境,并构建了完整的软件栈,开发者登录后不需要对环境做任何配置,不用担心软件之间的兼容问 ...
- 【容器技术】在裸机与虚拟机上运行容器:性能和优点
根据最近的研究,Docker正在像野火一样蔓延,特别是在企业中,它的采用率从2015年的13%上升到了65%以上;另有35%的公司计划使用Docker.根据这些报告,容器采用的主要驱动因素是需要提高研 ...
- 访问页面升级访问_容器化单页面应用中RESTful API的访问
最近在工作中,需要让运行在容器中的单页面应用程序能够访问外部的RESTful API.这个需求看起来并不困难,不过实现起来还是有些曲折的.在此,我就将这部分内容总结一下. 在入正题之前,有个一问题,就 ...
- 容器安全 - 非特权/非root用户运行容器,提升容器的运行安全
<OpenShift 4.x HOL教程汇总> 文章目录 以非特权方式运行容器 以非root用户运行容器 以非特权方式运行容器 以特权的方式运行容器,确认可以执行"fdisk&q ...
- 行业elasticsearch容器化存储分离调研报告
一.行业es容器化&存储分离架构行业调研 1.1 行业es容器化调研概述 目前通过联系各个公司的同学&前同事.结合网上公开资料&官方云服务使用文档,共统计10家公司,基本覆盖头 ...
最新文章
- mkdir函数linux,linux--access函数与mkdir函数
- 笔记合并_.NET Core开发实战(第23课:静态文件中间件:前后端分离开发合并部署骚操作)学习笔记(上)...
- 打开mobilenet——ssd的demo.py显示这样的错误解决方法:Intel MKL FATAL ERROR: Cannot load libmkl_avx.so or libmkl_def.s
- 小姐姐笔记:我是如何学习简单源码拓展视野的
- SpringBoot2.6.1 elasticsearch7.1.5 Vue
- unicode ascii
- PyTorc 1.0 中文文档:扩展PyTorch
- 终于找全啦!一二线城市知名互联网公司名单!对着找就对了...
- java支付宝提现发请求没反应_支付宝调用页面无法显示
- 苹果手机微信语音没声音怎么回事_iPhone XS Max相机、普通照片模式下拍照没声音怎么办?...
- Variable is already assigned to this value JAVA什么意思
- 编写类A2, 定义方法find, 实现查找某字符串数组中的元素查找,并返回索引,如果找不到,返回-1
- 机械秒表的使用方法_秒表的使用方法!
- AlertManager实现企业微信报警(十三)
- Proteus仿真过程中External model DLL “***.DLL” not found
- C# VS2017中Windows窗体更改图标
- linux 僵尸进程deffunc,多进程-开启子进程的两种方式,查看进程的pid与ppid,僵尸进程与孤儿进程...
- 一个程序员的自白:我为什么写博客
- 数学:矩估计和最大似然估计
- EPR测试常见问题解答
热门文章
- 函数式编程——python为例
- 《荒漠甘泉》4月19日
- Word很大,你要忍一下 (不看必后悔系列)
- 基于SSM移动计费管理系统
- Linux 中ln 命令-n 参数的含义
- 字节跳动前端实习一面二面HR面面经
- 浅析锂电池保护板(BMS)系统设计思路(二)
- NetBeans 常用快捷键
- 前端工程化、模块化、组件化
- Caused by: java.lang.NoSuchMethodError:No virtual method isSuccess()Z in class Lretrofit2/Response;
- 容器安全 - 以只读方式运行容器