Stefan Stoll: How Serverless Was Revolutionized by Kube
作者:禅与计算机程序设计艺术
1.简介
该模型已成为各大企业关注的焦点。众多企业争相采用该技术,并包括像Facebook、亚马逊等公司也纷纷表态尝试。这项技术旨在解决开发者的两个主要挑战是部署复杂性以及运营成本高昂。由此可见,在初创阶段或成熟期 serverless 技术均展现出强劲的发展势头。
那么 Serverless 计算模型到底是什么呢?简单而言,Serverless 计算模型是一种客户端委托云提供商委派执行后台运行的服务。其优势体现在以下几点:
1.减少了云计算服务的成本。 2.降低了硬件成本。 3.提高了效率,并让更多的研发时间和创新资源投入到业务和产品开发中。 4.减少了云供应商的风险,并减少了安全隐患。
此外,在Serverless架构下不仅可以提升开发效率还能让开发者专注于应用本身的构建与优化无需再关注底层基础设施或服务器配置等问题。同时基于函数编程模型的FaaS模式不仅能够帮助开发者脱离繁琐的部署管理和运维压力还能够使其能够迅速进行功能迭代从而降低运营成本并提升整体工作效率
今日我准备与大家分享Serverless技术的发展历程及由Kubernetes和OpenFaas引发的革命性变化。
2.背景介绍
该模型的发展历史可追溯至数十年前。在那个时期,大多数传统应用程序都是通过中央 server 机制运行的。这意味著每台服务器都需要投入硬件维护、软件升级以及网络配置等各项基础工作。而云计算平台的出现使得资源能够按需分配,并且大大降低了部署和运维的复杂性与资源消耗。尽管如此,在资源利用率不高、部署过程较为繁琐以及开发效率相对较低的问题上。迫使许多企业不得不依赖专业的IT团队来进行应用开发与运维。
后来,在云计算的发展和普及下
如图所示,在云平台上提供的函数即服务(FaaS)能够辅助开发者完成功能开发、错误排查以及应用部署工作。该技术通过整合事件触发机制或基于HTTP协议的服务调用方式将用户自定义代码整合到零物理服务器环境当中,从而实现了应用弹性伸缩的能力。FaaS借助自动化配置实现了无需手动管理物理服务器的功能,这种做法显著提升了开发效率
然而,在当时缺乏容器技术的支持时,默认情况下开发者只能利用虚拟机(VM)提供的隔离功能来实现应用间的隔离与分部署署。这种情况下直接运用容器技术存在明显的限制——导致了Serverless计算模型在应用部署效率上存在显著的问题——启动速度较慢。随后,在2016年左右时针指向科技发展的一个重要节点时,《OpenFaaS》项目应运而生并正式推出。该框架巧妙地整合了Docker容器技术到现有的Serverless计算框架中,并通过构建独立的镜像系统实现了应用服务快速部署的能力——这种创新性设计使得整个系统的启动效率得到了显著提升。
历经几年发展历程后,在云计算领域 Serverless 计算模型已经成为各大企业关注的焦点之一。如今愈来愈多的公司纷纷采用这一技术方案,在 GitHub、Netflix、Airbnb 和 Reddit 等平台上都可以看到其身影。然而尽管取得了显著成效但 Serverless 计算模型仍然面临诸多亟待解决的问题当中最突出的就是弹性伸缩机制这一难题尚未得到彻底突破目前仍处于发展的初期阶段并未取得突破性进展。
Kubernetes与OpenFaas促使Serverless计算模型发生根本性转变。它是一款开源的分布式系统管理工具,并支持简便部署与运行容器集群的能力,并提供可扩展性、故障恢复与弹性伸缩功能;该系统操作简单且具备高度可靠性和弹性伸缩能力;并显著降低了云平台的操作复杂度的同时显著提升了运维效率与可靠性
3.基本概念术语说明
3.1 FaaS(Function as a Service)
Function-as-a-Service (FaaS) refers to a model where developers can deploy applications as individual functions or function bundles. It aims to provide a hosting model that abstracts the complexities of server management, enabling developers to focus on coding without worrying about underlying infrastructure. This abstraction allows developers to concentrate on coding without worrying about the complexities of server management, such as deployment, maintenance, and monitoring. The primary advantage is that it eliminates the need for developers to manage servers, which can be complex and time-consuming. The following are some popular FaaS platforms: AWS Lambda, Google Cloud Functions, and Azure Functions.
3.2 Function
该程序是一个自成体系的功能模块,在不影响其他系统组件的前提下能够独立运行。在进行操作时会接受必要的输入参数,并按照预设的算法进行计算处理后生成相应的结果。该功能模块既可以作为一个完整的实体单独部署使用,在不影响其他系统的前提下还能与其他模块协同工作形成复杂的系统架构。此外它还具备灵活性能够在不同的应用场景下灵活配置适应不同的需求同时也能通过日志记录追踪操作过程中的异常情况并及时反馈相关信息供相关人员进行排查维护与优化
3.3 Container
容器是一种规范化的形式,并且是简洁高效的标准软件打包方案。它不仅能够整合并运行应用程序及其所需的组件,并且支持各种类型的程序。该技术提供了精细级别的资源隔离能力,并且能够实现弹性伸缩配置。通过这种设计安排,在确保了一致性和高可用性的核心特性的同时,在处理大规模负载时也能够有效避免潜在的安全冲突。
3.4 Docker
Docker被视为一个开放源代码驱动的平台,在软件开发中扮演着重要角色。它不仅支持快速部署和运行容器化应用,还提供了高度可配置的环境以满足不同需求。作为基于Linux内核开发的一个开源平台,Docker通过资源隔离机制实现对应用及其依赖项的有效分离管理。该技术实现了对软件组件与相关库文件的良好隔离状态,在一定程度上避免了它们之间的潜在干扰或影响。
3.5 Kubernetes
Kubernetes是一个基于开放源代码的平台,主要用于自动化部署.扩展以及对容器化应用程序进行管理和调度.它支持创建声明式的API系统,用于生成容器集群并对其进行调度.Kubenetes帮助DevOps工程师以及运维团队高效完成复杂应用的交付与管理,并推动了敏捷开发环境下的部署与操作流程.
3.6 Prometheus
Prometheus是一个开源的实时监控与告警解决方案。它能够实时采集并处理多维度的时间序列数据集,涵盖系统指标、服务实例的日志以及各种关键性能参数。该工具在云服务监控领域表现突出,并可无缝集成多个主流云平台的API资源以实现统一管理
3.7 Kubeless
该框架属于serverless架构,在实际应用中允许开发者编写基于Kubernetes生态的服务函数代码。通过调用CRD接口,在内部实现了新的资源类型Function,并支持开发者轻松创建并管理这些服务函数实例。该服务在后台持续监控并维护 Kubernetes 集群的状态实时跟踪服务函数的状态变化,并保证集群始终保持在线可用;利用 serverlessness 技术带来的优势特性(如事件驱动、自动扩容缩容以及性能优化等),确保系统具备高扩展性和低延迟的特点。
4.核心算法原理和具体操作步骤以及数学公式讲解
4.1 概念阐述
Serverless计算模型由两个主要组件构成:函数即服务(FaaS)和Kubernetes。其中FaaS通过封装事件触发或HTTP请求的方式,在服务器less环境中运行用户的自定义代码,并减少了对物理服务器的依赖。同时实现了弹性伸缩能力。而Kubelet与其它组件共同构成了Kubernetes系统的一部分
其主要特点如下:
1.降低了云计算服务的使用成本。
2.节省了硬件成本。
3.提升了效率,让更多时间用于业务创新和产品研发。
4.降低了云供应商的风险,降低了安全隐患。
4.2 函数的调用流程
-
用户提交代码到云函数平台,平台会把代码编译成 Docker 镜像。
-
当用户调用函数时,平台会创建Pod,Pod 中会包含用户的 Docker 镜像。
平台会将Pod分配到一个Node上,在Docker Engine中执行容器启动操作并处理函数逻辑。
-
函数代码执行完毕之后,容器就会停止,相应的资源也会释放掉。
-
如果有其他用户调用函数,平台会调度 Pod 到另一个 Node 上。
-
重复以上步骤,直到所有调用都结束。
4.3 Kubernetes
4.3.1 Kubernetes的角色
Kubernetes包含三个主要组件:Master、Node、Container runtime。
Master
Controller Node serves as the centralised control node in Kubernetes architecture, responsible for overseeing the allocation and distribution of resources and data across the cluster. It assumes several key responsibilities, including resource management and data coordination.
- 持续监控集群的整体运行状态;
- 实现API请求授权与身份认证;
- 接收并处理来自其他组件的指令,并根据实际状态作出相应的决策;
- 将集群当前运行状态反馈给API server。
Master 分为两种角色:
- kube-apiserver:集群中的API服务,在接收HTTP请求时会进行解析并相应处理,并通过RESTful方式实现Kubernetes API的暴露供客户端使用调用。
- kube-controller-manager:基于集群当前状态的控制器管理器,在定期执行控制器时会实现对集群的调度与管理功能。
Node
Kubernetes的工作节点Node负责运行集群内的容器化应用程序。每个Node都配备一个kubelet代理,在维护容器生命周期方面发挥重要作用。该代理可执行操作包括但不限于启动和停止容器。通过RESTful API接口与集群中的资源交互服务系统进行通信。kubelet根据实时反馈信息触发相应的操作指令。
Node 分为两种角色:
- kubelet:Kubernetes 的一个节点代理功能,在其操作中负责监听 apiserver,并接收来自客户端的控制命令后将其转发至 Kubernetes 控制平面的 api-server 实施操作。
- kube-proxy:Kubernetes 的一个网络流量路由代理组件,在每个 Node 上运行时会负责将 pod 内部的网络流量路由至相应的服务位置。
Container Runtime
Container runtime 用于 Kubernetes 执行和管理容器的组件。当下广泛使用的主流容器运行时包括 Docker 和 Rocket 作为其标准选项。
总结
根据角色划分的分析可知,在 Kubernetes 网络中 master 节点的主要职责是负责调度与管理资源的分配与任务的协调。实际上 master 节点的主要职责是负责调度与管理资源的分配与任务的协调。而 node 节点则主要承担运行应用容器的任务。真正的执行者自然是 kubelet 这个进程。需要注意的是 node 可以存在于物理机或者虚拟机环境中,在 Kubernetes 的底层实现中会通过容器运行时来完成资源分配与调度任务。
4.3.2 节点管理
Kubernetes 提供了节点管理的功能,包括注册、注销、健康检查、Label 等。
注册
当集群中的一个节点在接入或重新接入集群时,在完成与主节点建立连接后,则需通过注册过程通知主节点其存在
当一个节点成功接入 master 后会向 master 提交一个包含自己元数据的注册请求 如果 master 对该节点进行有效性验证后 会赋予该节点一个唯一标识符(即 NodeID)并将其加入集群列表中 当节点运行中发生故障时 master 也会收到相关信息并将其状态设置为异常。
注销
在集群中移除一个节点时,随后必须通知 master 节点已退出.接着, master 将所有运行在该节点上的 Pod 迁移到其他可用的主节点上.当所有Pod被成功迁移至其他主节点后系统将终止该节点.
健康检查
为了维持集群系统的稳定运行,kubernetes 系统必须持续关注各个node的工作状态.一旦发现某一个node出现故障,系统会自动将该node上的Pod任务切换至其他 healthy 的node.但是一些特殊的状况,比如某个node陷入 hang 或者其 associated disk出现故障等情形,系统必须及时监测node的状态,否则可能导致不可预见的问题.
Kubernetes借助探针(Probe)机制执行节点健康检查。探针会定期运行特定脚本以评估当前节点的运行状态。当某探针连续失败次数超过预设阈值时,则 master 判断该节点出现故障,并将其状态标记为故障状态。
Label
kubernetes能够实现节点分类,并通过标签和选择器两种机制完成这一功能。label采用key-value格式的键值对,在实际应用中用于对节点进行分类。当创建服务对象时可通过选择器指定目标pod的label以实现负载均衡
在创建一个 Deployment 对象的过程中,在该 deployment对象上施加标记信息(即添加标签),以便标识不同的 deployment 版本。每个独特的 label 将与相应的 replica set相关联。
4.4 OpenFaas
OpenFaaS是一款开源的Serverless框架软件包,它能够让你方便地创建、运行和管理 serverless 函数服务。你可以将你的业务逻辑打包为Docker镜像文件,并通过FaaS插件将其上传至FaaS平台,该平台将自动完成这些镜像文件的部署与管理工作。你可以通过RESTful API或Webhooks来访问你的函数服务,并设定具体的触发条件,比如HTTP请求触发、事件触发或者定时任务触发等。
OpenFaas 的主要优点如下:
- 该方案有助于减少云计算服务的成本。
- 通过 Docker 镜像技术能够实现秒级启动时间,并显著提升了运行效率。
- 支持通过 RESTful API 和 Webhooks 接口访问函数,并具备高度的灵活性以满足扩展需求。
- 通过定义运行环境Dockerfile, 系统允许你自由组合第三方组件。
- 系统配备了丰富的扩展插件和模板配置选项, 能够充分满足需求的增长。
- 在良好的社区氛围下提供成熟的解决方案。
5.具体代码实例和解释说明
随后, 我会向大家演示几个实例案例来解释Serverless技术的工作流程
5.1 GCF (Google Cloud Functions)
GCF 是由 Google Cloud Platform 提供的一种 serverless 函数计算服务。根据以下步骤进行操作,请创建第一个函数。
-
点击左侧导航栏中的“创建函数”,进入函数创建页面。
在名称框中输入函数名称并指定运行环境(如Python 3.7),同时指定项目和空白函数模板
- 在函数代码编辑框中,输入以下 Python 代码:
def hello_world(request):
"""Responds to any HTTP request."""
return 'Hello, World!'
代码解读
-
保存函数。
-
执行测试。在右侧的 Logs 选项卡中可以查看函数的输出。
GCF 的优点如下:
- 免费。
- 简单易用。
- 可编程。
- 按需计费。
5.2 AWS Lambda
AWS Lambda 由 Amazon Web Services 提供作为 serverless computing service。通过 AWS Lambda 创建第一个函数,请按照以下步骤操作:
请进入 AWS 控制台,在 Services 菜单栏中选择 Lambda 服务,并单击 Lambda 服务的开始按钮。
-
点击创建 Lambda 函数。
-
配置函数名称,选择运行环境,创建 IAM 角色。
-
选择现有的函数层,或者选择 “Author from scratch”。
-
配置 triggers ,选择触发器类型,比如 API Gateway。
-
在编辑器中输入函数代码,比如:
import json
def lambda_handler(event, context):
# parse the incoming event into a python dict
data = json.loads(event['body'])
# extract fields from the payload
name = data.get('name', None)
if not name:
raise Exception("Validation Failed")
response = {
"statusCode": 200,
"headers": {"Content-Type": "application/json"},
"body": f"Hello, {name}!"
}
return response
代码解读
-
测试函数。
-
配置超时时间,保存函数。
请将 API Gateway 的端点URL配置到您的函数触发器中,请参考以下示例:API Gateway 触发器
AWS Lambda 的优点如下:
- 强大的计算能力。
- 按使用计费。
- 多语言支持。
- 精准计费。
5.3 Azure Functions
Azure Functions 是 Microsoft Azure 支持的一种无服务器函数计算服务。按照以下步骤操作即可快速搭建并运行第一个 Azure Functions 函数。
-
登录 Azure 门户,在左侧菜单中选择新建资源,搜索并选择“函数应用”。
-
设置函数应用名称、订阅、资源组、应用服务计划和存储位置。
-
配置 Application Insights 来记录函数的性能。
-
创建第一个函数,选择开发环境。
-
选择 HTTP trigger,在右侧函数编辑器中输入函数代码,保存并测试函数。
-
配置触发器,例如访问密钥、触发模式等。
-
查看函数日志。
Azure Functions 的优点如下:
- 自动扩容。
- 免费套餐。
- 按需计费。
5.4 Kubernetes + OpenFaas
Kubernetes与OpenFaas结合在一起能够让你迅速地构建、部署并管理 serverless 函数;如果你已经有一个 Kubernetes 集群,在配置好后只需编写一个简单的 YAML 文件配置即可实现对 OpenFaas 的集成与扩展功能;通过这种方式不仅简化了服务器函数的部署流程还能显著提升系统的可扩展性
在本项目中,我们将通过Python开发一个简单的函数,并将其部署至Kubernetes+OpenFaas平台生态系统
- 请安装 Kubernetes 命令行工具
kubectl。 - 请克隆 OpenFaas GitHub 仓库。
- 更新
yaml文件内容。 - 使用命令
kubectl apply -f <yaml文件路径>运行部署。 - 确认 deployment 是否成功完成。
- 创建一个新的函数工作目录。
- 完成函数目录初始化并生成
requirements.txt文件。 - 制作 Docker 镜像源代码。
- 在容器模板中编写功能代码。
- 执行 Docker 镜像构建操作。
- 将 Docker 镜像推送到镜像存储位置。
- 更新镜像配置参数(包括名称和标签)。
- 执行 Faas CLI 部署命令:
faas-cli deploy - 查询服务状态并确认部署结果
- 执行函数测试流程
Kubernetes + OpenFaas 的优点如下:
- 零运维成本。
- 便携性。
- 快速部署。
- 弹性伸缩。
6.未来发展趋势与挑战
Serverless 技术得到了充分的发展,并仍处于发展初期阶段,在众多企业中仍有许多尚未确定其广泛应用前景的情况存在。Kubernetes 和 OpenFaas 两个开源平台近期正式推出,并在功能上进行了全面升级和优化改进;相较于之前流行的其他 Serverless 框架而言;它们在性能和稳定性等方面仍有较大的提升空间。随着开源社区的不断发展和完善;Serverless 技术逐渐展现出其强大的潜力,并吸引了越来越多的关注
未来,Serverless 技术的发展将面临以下四个方向:
-
大规模自动化部署。
-
更加便利的 CI/CD 机制。
-
更加可观察的监控和运行状态。
-
更加智能的预测和优化。
下面是未来 Serverless 发展方向的预测:
数据处理工作面临着日益增长的数据量需求。在面对海量数据量的增长背景下,Serverless计算模型正逐渐成为各行业的主要选择之一。基于容器技术的数据分析、数据分析与处理以及数据分析与科学方法的应用将成为Serverless技术的关键领域之一。
-
深度学习技术。考虑到Serverless计算模型能够在短时间内即可完成任务,在这一特性下,或许能够发展成深度学习领域的一个重要计算平台。
-
IoT。IoT技术正逐渐广泛应用于Serverless计算模型中。物联网设备的处理将是巨大的挑战,并且是Serverless技术的重要应用领域。
-
更加广泛的采用。越来越多的企业和社会将采纳Serverless计算模式,并期待其能够充分发挥应有的作用。当越来越多的企业开始应用Serverless技术时,则会促使该模式趋于普及和广泛应用。
最后, Serverless 技术仍需不断进化, 这也意味着云供应商与开源社区需持续推进 Serverless 技术的发展. 随着 Serverless 计算模型的持续优化与进化, 它终将展现出越来越强大的性能, 成为一项成熟的技术.
