发布时间:2025-12-09 16:26:25 浏览次数:76
目录
一、 Serverless介绍
二、Knative 介绍
2.1 Knative 的定位
2.2 Knative的组成
2.2.1 Build 构建系统
2.2.2 Serving:服务系统
2.2.3 Eventing:事件系统
补充:
三、总结:
在讲Knative之前,需要先讲一下Serverless。
对于Serverless,目前还没有形成一个比较权威的定义,最新的一个定义是这样描述的:
“无服务器架构是基于互联网的系统,其中应用开发不使用常规的服务进程。相反,它们仅依赖于第三方服务(例如AWS Lambda服务),客户端逻辑和服务托管远程过程调用的组合。”
最开始,“无服务器”架构试图帮助开发者摆脱运行后端应用程序所需的服务器设备的设置和管理工作。
这显然是不成立的,因为这项技术的目标并不是为了实现真正意义上的“无服务器”,而是指由第三方云计算供应商负责后端基础结构的维护,以服务的方式为开发者提供所需功能,例如数据库、消息,以及身份验证等。
简单地说,这个Serverless架构的目标:就是要让开发人员关注代码的运行而不需要管理任何的基础设施。
程序代码被部署在诸如AWS Lambda这样的平台之上,通过事件驱动的方法去触发对函数的调用。
也可以理解为,这是一种完全针对程序员的架构技术。为了简化开发人员的工作,提高业务实现效率而研发的一种架构。
其技术特点包括了事件驱动的调用方式,以及有一定限制的程序运行方式,例如AWS Lambda的函数的运行时间默认为3秒到5分钟。
从这种架构技术出现的两年多时间来看,这个技术已经有了非常广泛的应用,例如移动应用的后端和物联网应用等。
简而言之,无服务器架构的出现不是为了取代传统的应用。而是从具有高度灵活性的使用模式及事件驱动的特点出发,
开发人员/架构师应该重视这个新的计算范例,它可以帮助我们达到减少部署、提高扩展性并减少代码后面的基础设施的维护负担。
如下图,按照传统的方式,一个项目前端+后端+基础设施都是必须的,基本上项目都是需要有一套。
但是,对于无服务架构来说,拆分后端,比如把权限、业务应用、数据库等拆分,从而使得开发更灵活,复用性更强,也就是一直说的,缩短产品到落地的时间,从而缩短产品周期,提高整个项目实现的效率。
这个也是无服务的主要意义。感觉架构的发展也好,服务的演变也好,所有的发展,基本上为了提高效率,更快的从想法到产品的一个落地实施。
但是,传统的 Serverless 解决方案自身的问题有一些问题,目前存在以下问题:
为了解决传统的 Serverless这几个问题,Knative就出现了。
Knative 是谷歌牵头发起的 Serverless 项目。
其目标是基于 Kubernetes 的 Serverless 解决方案,旨在标准化 Serverless,简化其学习成本。
Knative 是以 Kubernetes 的一组自定义资源类型(CRD)的方式来安装的,因此只需使用几个 YAML 文件就可以轻松地开始使用 Knative 了。
这也意味着,在本地或者托管云服务上,任何可以运行 Kubernetes 的地方都可以运行 Knative 和代码。
Knative构建在Kubernetes、Istio、Container的基础上,以K8S的CRD形式存在。
为了实现 serverless 应用的管理,knative 把整个系统分成了三个部分:
build 的功能是把用户的代码自动化构建成容器镜像
与普通docker+Dockerfile 构建容器相比较
Knative优势:
它的存在,更多是为了定义标准化、可移植、可重用、性能高效的构建方法
Knative 提供了 Build CRD 对象,让用户可以通过 yaml 文件定义构建过程。一个典型的 Build 配置文件如下:
apiVersion: build.knative.dev/v1alpha1kind: Buildmetadata:name: test-buildspec:serviceAccountName: build-auth-test #认证信息source:git:url: https://github.com/your-example/build-example.git #代码地址revision: master #分支信息steps:- name: ubuntu-exampleimage: ubuntuargs: ["ubuntu-build-example", "SECRETS-example.md"]steps:- image: gcr.io/example-builders/build-exampleargs: ['echo', 'test-example', 'build']因为大部分的构建过程都是一致的,因此 knative 还提供了 Build template 的概念,
Build template 封装了预先定义好的构建过程(就是封装了上面的 steps 过程),并提供了非常简单的配置参数来使用。
使用 build template 构建容器镜像就更简单了,只需要提供代码的地址和镜像名字即可,比如下面是使用 Google kaniko 模板构建 github 源码的 yaml 文件(需要在代码根目录存在 Dockerfile 文件)
apiVersion: build.knative.dev/v1alpha1kind: Buildmetadata:name: test-kaniko-buildspec:serviceAccountName: build-auth-test #认证信息source:git:url: https://github.com/your-user/your-reporevision: mastertemplate:name: kanikoarguments:- name: IMAGEvalue: us.gcr.io/my-project/my-app基于负载自动伸缩,包括在没有负载时缩减到零。
允许为多个修订版本(revision)应用创建流量策略,从而能够通过 URL 轻松路由到目标应用程序。
knative serving 功能是基于 kubernetes 和 istio 开发的
可以认为 knative 提供了更高的抽象,自动封装掉了 kubernetes 和 istio 的实现细节。
serving 的核心功能是让应用运行起来提供服务。虽然听起来很简单,但包括了很多的事情:
使得生产和消费事件变得容易。
抽象出事件源,并允许操作人员使用自己选择的消息传递层。
serverless 最重要的是基于事件的触发机制,也就是说当某件事发生时,就触发某个特定的函数。
事件概念的出现,让函数和具体的调用方能够解耦。
函数部署出来不用关心谁会调用它,而事件源触发也不用关心谁会处理它。
为了让整个事件系统更有扩展性和通用性,knative 定义了很多事件相关的概念。简单介绍一下:
对于服务系统和事件系统,涉及到的内容比较多,后面会专门用2篇文章来讲解
knative的优势:
Knative 解决了现在Serverless 的诸多问题
如果kubernetes是容器编排的事实上的标准,那么Knative也许就是未来serverless的事实上的标准。