Introduce Knative

Gao
### 什么是 Knative? 基于`Kubernetes`的平台,用于构建,部署和管理现代无服务器工作负载。 knative 于 2018 年 7 月 24 日对外发布,是谷歌开源的 `serverless`架构方案,旨在提 供一套简单易用的 `serverless`方案,把 `serverless` 标准化。目前参与的公司主要是 Google、Pivotal、IBM、Red Hat,。 `Knative`让开发人员更高效 `Knative`组件构建于`Kubernetes`之上,抽象出复杂的细节 ,使开发人员能够专注于重要的事情。通过编写成功的实际实现共享的最佳实践 ,`Knative`解决了构建,部署和管理云本机服务的“无聊但困难”的部分。 ##### 亮点: - 针对常见应用程序用例提供更高级别抽象 API - 在几秒钟内即可提供可扩展,安全,无状态的服务 - 松散耦合的特性,可以只使用需要的部分 - 可插拔组件,可以使用自定的日志、监控、网络和 service mesh - Knative 可以在任何 k8s 运行的平台运行 - 一致的开发体验,支持通用模式:GitOps, DockerOps, ManualOps. - Knative 可以与常见的工具和框架一起使用,例如 Django,Ruby on Rails,Spring 等 等。 ### knative 核心概念和原理 为了实现 serverless 应用的管理,knative 把整个系统分成了三个部分: - Build:构建系统,把用户定义的函数和应用 build 成容器镜像 - Serving:服务系统,用来配置应用的路由、升级策略、自动扩缩容等功能 - Eventing:事件系统,用来自动完成事件的绑定和触发 ##### Build 构建系统 build 的功能是把用户的代码自动化构建成容器镜像 Knative 的特别之处在于两点:一是它的构建完成是在 kubernetes 中进行的,和整个 kubernetes 生态结合更紧密;另外,它旨在提供一个通用的标准化的构建组件,可以作为 其他更大系统中的一部分。 根据官方文档中的说的,是为了定义标准化、可移植、可重用、性能高效的构建方法. ##### Serving:服务系统 serving 的核心功能是让应用运行起来提供服务。虽然听起来很简单,但这里包括了很多的 事情: 自动化启动和销毁容器根据名字生成网络访问相关的 service、ingress 等对象监控应用的 请求,并自动扩缩容支持蓝绿发布、回滚功能,方便应用方法流程 knative serving 功能是基于 kubernetes 和 istio 开发的,它使用 kubernetes 来管理 容器(deployment、pod),istio 来管理网络路由(VirtualService、DestinationRule) 。 因为 kubernetes 和 istio 本身的概念非常多,理解和管理起来比较困难,knative 在此 之上提供了更高一层的抽象(这些对应是基于 kubernetes 的 CRD 实现的)。这些抽象出 来的概念对应的关系如下图: ![62aa0d8d20401b05c4f6a51aada04eed](knative/3AFC8398-99AD-4331-B9D6-44EF8F58F2C2.png) - Configuration:应用的最新配置,也就是应用目前期望的状态,对应了 kubernetes 的 容器管理(deployment)。每次应用升级都会更新 configuration,而 knative 也会保 留历史版本的记录(图中的 revision),结合流量管理,knative 可以让多个不同的版 本共同提供服务,方便蓝绿发布和滚动升级 - Route:应用的路由规则,也就是进来的流量如何访问应用,对应了 istio 的流量管理 (VirtualService) - Service:注意这里不是 kubernetes 中提供服务发现的那个 service,而是 knative 自 定义的 CRD,它的全称目前是 services.serving.knative.dev 。单独控制 route 和 configuration 就能实现 serving 的所有功能,但 knative 更推荐使用 Service 来管 理,因为它会自动帮你管理 route 和 configuration **knative serving 各组件之间的关系:** ![0c2feb4ec772cd689fc9945fb8770985](knative/02553623-4A8C-4195-86CA-8E158C61C2EE.png) 可以看到,每个 revision 对应了一组 deployment 管理的 pod pod 会自动汇报 metrics 数据到 autoscaler,autoscaler 会根据请求量和资源使用情况修改 deployment 的 replicas 数量,从而实现自动扩缩容。serverless 一个重要的特定是它会 scale to 0 的 ,也就是当应用没有流量访问时,它会自动销毁所有的 pod activator 比较有趣,它是为 了处理 scale to 0 而出现的。当某个 revision 后面的 pod 缩容到 0 时,route 的流量 会指向 activator,activator 接收到请求之后会自动拉起 pod,然后把流量转发过去 route 对象对应了 istio 的 DestinationRoute 和 VirtualService,决定了访问应用的流 量如何路由 ##### Eventing:事件系统 serving 系统实现的功能是让应用/函数能够运行起来,并且自动伸缩,那什么时候才会调 用应用呢?除了我们熟悉的正常应用调用之外,serverless 最重要的是基于事件的触发机 制,也就是说当某件事发生时,就触发某个特定的函数。 事件概念的出现,让函数和具体的调用方能够解耦。函数部署出来不用关心谁会调用它,而 事件源触发也不用关心谁会处理它。 Knative Eventing 是一个旨在满足云原生开发的常见需求的系统,并提供可组合的原语以 支持后期绑定事件源和事件使用者。 Knative Eventing 围绕以下目标设计: 1. Knative Eventing 服务松散耦合。这些服务可以在各种平台上独立开发和部署(例如 Kubernetes,VM,SaaS 或 FaaS)。 2. Event 的生产者和消费者是独立的。任何生产者(或源)都可以在有正在侦听的 Event 事件使用者之前生成 Event。在有创建这些 Event 的生产者之前,任何 Event 消费者 都可以选择侦听的事件或事件类别。 3. 其他服务可以连接到 Eventing 系统。这些服务可以执行以下功能: - 创建新的应用不需要修改事件的生产者何消费者 - 从生产者选择和标记指定的时间集合 4. 确保跨服务互操作性。 Knative Eventing 与 CNCF 无服务器工作组开发的 CloudEvents 规范一致。 ### 安装 Knative Knative 依赖于 Ingress/Gateway,它能够将请求路由到 Knative Services。 目前,存在 两种提供此功能的选项: - Istio,基于 Envoy 的 Service Mesh - Gloo,基于 Envoy 的 API Gateway。 安装过程: 1. 安装 istio 2. 安装 Knative #### 首先安装 CRD label knative.dev/crd-install=true,可以防止安装过程中的竞争条件,而导致间歇性错 误 ```shell kubectl apply --selector knative.dev/crd-install=true \ --filename https://github.com/knative/serving/releases/download/v0.7.0/serving.yaml \ --filename https://github.com/knative/build/releases/download/v0.7.0/build.yaml \ --filename https://github.com/knative/eventing/releases/download/v0.7.0/release.yaml \ --filename https://github.com/knative/serving/releases/download/v0.7.0/monitoring.yaml ``` 要完成 Knative 及其依赖项的安装,请再次运行 kubectl apply 命令,这次没有 --selector 标志,以完成 Knative 及其依赖项的安装 ```shell kubectl apply --filename https://github.com/knative/serving/releases/download/v0.7.0/serving.yaml --selector networking.knative.dev/certificate-provider!=cert-manager \ --filename https://github.com/knative/build/releases/download/v0.7.0/build.yaml \ --filename https://github.com/knative/eventing/releases/download/v0.7.0/release.yaml \ --filename https://github.com/knative/serving/releases/download/v0.7.0/monitoring.yaml ``` 如果所有组件状态为你 running,确认安装成功 ```shell kubectl get pods --namespace knative-serving kubectl get pods --namespace knative-build kubectl get pods --namespace knative-eventing kubectl get pods --namespace knative-monitoring ```