云原生-Knative
云计算
https://murphy.blog.csdn.net/article/details/127846026
Serverless
Knative
Knative 是谷歌牵头发起的 Serverless 项目。
其目标是基于 Kubernetes 的 Serverless 解决方案,旨在标准化 Serverless,简化其学习成本。
Knative 是以 Kubernetes 的一组自定义资源类型(CRD)的方式来安装的,因此只需使用几个 YAML 文件就可以轻松地开始使用 Knative 了。
这也意味着,在本地或者托管云服务上,任何可以运行 Kubernetes 的地方都可以运行 Knative 和代码。
Knative的定位
Knative构建在Kubernetes、Istio、Container的基础上,以K8S的CRD形式存在。
- 基础设施:Kubernetes作为基础设施进行容器编排,解决应用编排和运行环境
- 通信设施:Isito作为通信基础设施层,保证服务的运行可检测、可配置、可追踪
- 模板+环境:Knative使用应用模板和统一的运行环境来标准化服务的构建、部署和管理
Knative 解决了现在Serverless 的诸多问题。
如果kubernetes是容器编排的事实上的标准,那么Knative也许就是未来serverless的事实上的标准。
Knative的优势:
- 便利性:Knative 以 Kubernetes 作为其底层框架,因此无论是线上还是线下,任何 Kubernetes 集群,无论是云上 Kubernetes 服务还是自建 Kubernetes 集群,都可通过安装 knative 插件快速的搭建 serverless 平台。
- 标准化:Knative 联合 CNCF,把所有事件标准化,统一为 CloudEvent,提供事件的跨平台,同时让函数和具体的调用方能够解耦。
- 服务间解耦:使用 Knative 使得应用不在与底层依赖服务强绑定,可以跨云实现业务互通。
- 成熟的生态:Knative 基于 Kubernetes 体系构建,与 kubernetes 生态结合更紧密。
- 自动伸缩:监控应用的请求,并自动扩缩容, 借助于istio(ambassador,gloo等)天生支持蓝绿发布、回滚功能,方便应用发布流程。
- 应用监控:支持日志的收集、查找和分析,并支持 VAmetrics 数据展示、调用关系 tracing。
Knative的组成
为了实现 serverless 应用的管理,knative 把整个系统分成了三个部分:
- Build:构建模块,把用户定义的函数和应用 build 成容器镜像,提供云原生“从源代码到容器”的镜像构建能力。
- Serving:服务模块,用来配置应用的路由、升级策略、自动扩缩容等功能,通过 Serving 部署容器并提供通用的服务模型。
- Eventing:事件模块,用来自动完成事件的绑定和触发,提供事件全局订阅、传递和管理能力,实现事件驱动。
Build 构建模块
Serving 服务模块
基于负载自动伸缩,包括在没有负载时缩减到零。
允许为多个修订版本(revision)应用创建流量策略,从而能够通过 URL 轻松路由到目标应用程序。
knative serving 功能是基于 kubernetes 和 istio 开发的。可以认为 knative 提供了更高的抽象,自动封装掉了 kubernetes 和 istio 的实现细节。
- kubernetes 来管理容器(deployment、pod)
- istio 来管理网络路由(VirtualService、DestinationRule)
serving 的核心功能是让应用运行起来提供服务。
虽然听起来很简单,但包括了很多的事情:
- 自动化启动和销毁容器
- 根据名字生成网络访问相关的 service、ingress 等对象
- 监控应用的请求,并自动扩缩容
- 支持蓝绿发布、回滚功能,方便应用方法流程
Eventing 事件模块
使得生产和消费事件变得容易。
抽象出事件源,并允许操作人员使用自己选择的消息传递层。
serverless 最重要的是基于事件的触发机制,也就是说当某件事发生时,就触发某个特定的函数。
事件概念的出现,让函数和具体的调用方能够解耦。
函数部署出来不用关心谁会调用它,而事件源触发也不用关心谁会处理它。
为了让整个事件系统更有扩展性和通用性,knative 定义了很多事件相关的概念。简单介绍一下:
- EventSource:事件源,能够产生事件的外部系统。
- Feed:把某种类型的 EventType 和 EventSource 和对应的 Channel 绑定到一起。
- Channel:对消息实现的一层抽象,后端可以使用 kafka、RabbitMQ、Google PubSub 作为具体的实现。
- Subscription:把 channel 和后端的函数绑定到一起,一个 channel 可以绑定到多个knative service。
https://skyao.io/learning-knative/introduction/motivation.html
https://www.bookstack.cn/read/getting-started-with-knative/eventing.md
Knative - Eventing
Kubernetes 用户在实现开发和部署阶段服务之间松耦合的同时,服务间常要通过不同的事件机制来进行事件传递,为了解决大部分的云原生消息通信需求,Knative 提供了 Eventing 组件。
Eventing 主要由事件源(Event Source)、事件处理(Flow)、事件消费者(Event Consumer)三部分构成。
- 事件源 Event Source
- 事件处理 Flow
- Source to Service,直接事件接收
通过事件源直接转发到单一事件消费者。支持直接调用 Knative Service 或者 Kubernetes Service 进行消费处理。这样的场景下,如果调用的服务不可用,事件源负责重试机制处理。 - Channels & Subscriptions,通过事件通道(Channel)以及事件订阅(Subscriptions)转发事件处理
这样的情况下,可以通过 Channel 保证事件不丢失并进行缓冲处理,通过 Subscriptions 订阅事件以满足多个消费端处理。 - Brokers & Triggers,通过 brokers 和 triggers 支持事件消费及过滤机制
从 v0.5 开始,Knative Eventing 定义 Broker 和 Trigger 对象,实现了对事件进行过滤(亦如通过 ingress 和 ingress controller 对网络流量的过滤一样)。
通过定义 Broker 创建 Channel,通过 Trigger 创建 Channel 的订阅(subscription),并产生事件过滤规则。
- Source to Service,直接事件接收
- 事件消费者 Event Consumer
Event Source
事件源是 Kubernetes 自定义资源,它提供了一种机制用于注册特定软件系统对某一类事件的兴趣。
Event Registry
Event Registry 维护着一个事件类型目录,这些事件可以从不同Broker中消费。
Event Registry 引入了一个新的 EventType CRD,以便将事件类型的信息持久化在集群的数据存储中。
利用Registry发现事件:使用Registry,可以发现能够从Broker的事件网格中消费的不同类型的事件。该Registry是为与Broker/Trigger模型一起使用而设计的,旨在帮助创建Triggers。
Broker & Trigger
- Broker
Broker代表了 “Event Mesh”。事件被发送到Broker的入口(Ingress),然后被发送到对该事件感兴趣的任何订阅者。一旦进入Broker,除CloudEvent之外的所有元数据都会被剥离(例如,除非设置为CloudEvent属性,否则没有该事件如何进入Broker的概念)。 - Trigger
Trigger 代表了从特定的Broker订阅事件的愿望。
Channel
Channels是Kubernetes Custom Resources(k8s自定义资源),它定义了一个单一的事件转发和持久层。
消息实现可以通过Kubernetes Custom Resource提供Channel的实现,支持不同的技术,如Apache Kafka或NATS Streaming。