Knative介绍
Knative 是什么
Knative 基于Kubernetes的平台,用来构建、部署和管理现代serverless工作负载。
该框架试图将开发云原生应用在三个领域的最佳实践结合起来,这三个领域指的是构建容器(和函数)、为工作负载提供服务(和动态扩展)以及事件。
Knative是由谷歌与Pivotal、IBM、Red Hat 和SAP紧密协作开发的。
Knative组件
Build
描述:
Knative Build 扩展了 Kubernetes,并利用现有 Kubernetes 原语为你提供从源码运行集群容器构建的能力。
例如,你可以编写一个 Kubernetes-native 的 build 来从代码库获取源代码,将其构建到容器镜像中,然后运行该容器镜像。
虽然 Knative build 针对构建、测试和部署源代码进行了优化,但是您仍然需要负责开发相应的组件:
- 从代码库中检索并获取源代码;
- 在共享文件系统中运行多个顺序作业,比如:
- 安装依赖;
- 运行单元和集成测试;
- 构建容器镜像;
- 推送容器镜像到镜像仓库,或部署容器镜像到集群;
Knative Build 的目标是提高一个标准的、可移植的、可重用的、性能优化的方法,用户定义和运行集群容器镜像的构建。通过提供在 Kubernetes 上运行构建“枯燥而困难”的任务,Knative 使您不必开发和复制这些基于 Kubernetes 的开发过程。
尽管在现在,Knative build 并没有提供一套完整的 CI/CD 解决方案,但是它提供了一个较为低级的构建块,它是有意设计的,以便在更大的系统中实现基础和利用。
Build对象是Kubernetes集群的CRD(自定义资源):
1 | apiVersion: build.knative.dev/v1alpha1 |
Build对象:
- 一个Build对象可以包含多个steps,每个step指定一个Builder。(step可以近似理解为 init container)
- 一个Build对象是一种创建出来完成任何任务的容器镜像,无论这是流程中的单个步骤,还是整个流程本身。
- Build对象中的steps可以推送到repository。
- 使用BuildTemplate可定义可重用模板。
- Build对象中的source可以被定义为挂载到Kubernete volumes,source支持git repository、Google Cloud Storage、任意容器镜像。
- 使用ServiceAccount+k8s Secrets进行认证。
Serving
描述:
Knative Serving 建立在 Kubernetes 和 Istio 之上,以支持部署和服务无服务函数和应用。Knative Serving 项目提供了包含以下中间件原语的功能:
- 无服务容器的快速部署;
- 自动扩容,自动缩容乃至到0;
- 基于 Istio 组件的路由和网络编程;
- 已部署代码和配置的时间点快照;
resources:
- Service: service.serving.knative.dev
- Route: route.serving.knative.dev
- Configuration: configuration.serving.knative.dev
- Revision: revision.serving.knative.dev
resource关系图:
Eventing
设计目标:
Knative Eventing 是用来解决什么问题的?
- 在开发期间,Services 都是松耦合的,并且独立的部署在各种平台上 (Kubernetes, VMs, SaaS or FaaS)。
- 生产者能在消费者监听之前生成事件,消费者也能在生产者产生事件之前订阅感兴趣的事件。
- Services 能在以下两种场景下被连接 (be connected to) 以创建新的应用:
- 不修改生产者或消费者。
- 有能力从特定的生产者中选择特定的事件子集。
从架构上分离出三个抽象组件:
Buses
- Buses 提供了基于 Kafka 或 NATS 等消息总线的 k8s-native 的抽象。说白了就是 pubsub 机制。事件被发布到一个订阅通道,之后被路由到订阅的各方。
- Knative Eventing 目前支持三种 buses:Stub, Kafka, GCP PubSub。
Sources
- Sources 提供了一个类似的抽象层,用于从 Kubernetes外部提供数据源,并将它们路由到集群,以提要的形式表示。
- 目前提供三种源:K8sevents, GitHub, GCP PubSub。
Flows
- Flow是在事件中最顶层的用户面对的概念;它描述了从外部事件源到对事件作出反应的目的地的所需路径。
抽象架构图: