Knative 是一个基于 Kubernetes 平台的开源项目,用于构建、部署和管理在云端、本地或第三方数据中心运行的 Serverless 工作负载。Google 最初启动了这个项目,并得到了 50 多家公司的贡献。
Knative 允许您构建现代应用程序,这些应用程序是基于容器且面向源代码的。
Knative 核心项目
Knative 由两个组件组成:Serving 和 Eventing。在尝试开发 Knative 应用程序之前,了解它们如何交互很有帮助。

(Savita Ashture, CC BY-SA 4.0)
Knative Serving
Knative Serving 负责围绕您计划部署的应用程序的部署和扩展的功能。这还包括网络拓扑,以提供对给定主机名下应用程序的访问权限。
Knative Serving 关注于
- Serverless 容器的快速部署。
- 自动缩放包括将 Pod 缩减到零。
- 支持多种网络层,例如 Ambassador、Contour、Kourier、Gloo 和 Istio,以便集成到现有环境中。
- 提供已部署代码和配置的时间点快照。
Knative Eventing
Knative Eventing 涵盖了 Serverless 应用程序的 事件驱动 特性。事件驱动架构基于事件生产者(创建事件)和事件消费者或 接收器(接收事件)之间解耦关系的概念。
Knative Eventing 使用标准的 HTTP POST 请求在事件生产者和接收器之间发送和接收事件。
在本文中,我将重点介绍 Serving 项目,因为它是 Knative 最核心的项目,并且有助于部署应用程序。
Serving 项目
Knative Serving 定义了一组对象作为 Kubernetes 自定义资源定义 (CRD)。这些对象用于定义和控制您的 Serverless 工作负载在集群上的行为

(Savita Ashture, CC BY-SA 4.0)
- 服务 (Service):Knative 服务描述了路由 (route)和配置 (configuration)的组合,如上所示。它是一个更高级别的实体,不提供任何附加功能。它应该使快速部署应用程序并使其可用变得更容易。您可以定义服务始终将流量路由到最新修订版本或固定的修订版本。
(Savita Ashture, CC BY-SA 4.0)
- 路由 (Route):路由描述了如何调用特定应用程序以及如何在不同修订版本之间分配流量。在某些情况下,系统中可能同时存在多个活动修订版本。路由负责拆分流量并分配给修订版本。
- 配置 (Configuration):配置描述了应用程序的相应部署应是什么样子。它在代码和配置之间提供了清晰的分离,并遵循 十二要素 应用程序方法。修改配置会创建一个新的修订版本。
- 修订版本 (Revision):修订版本表示特定时间点配置的状态。因此,修订版本是从配置创建的。修订版本是不可变的对象,您可以根据需要保留它们。每个配置的多个修订版本可能在任何给定时间处于活动状态,您可以根据传入的流量自动向上和向下扩展。
使用 Knative Service 部署应用程序
要编写 Knative Service 示例,您必须有一个正在运行的 Kubernetes 集群。如果您没有集群,则可以使用 Minikube 运行本地 单节点集群。您的集群必须至少有两个 CPU 和 4GB 可用 RAM。
您还必须安装 Knative Serving 及其所需的依赖项,包括配置了 DNS 的网络层。
在继续之前,请按照 官方安装说明 进行操作。
这是一个简单的 YAML 文件(我称之为 article.yaml
),用于部署 Knative Service
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: knservice
namespace: default
spec:
template:
spec:
containers:
- image: docker.io/##DOCKERHUB_NAME##/demo
其中 ##DOCKERHUB_NAME##
是 dockerhub
的用户名。
例如,docker.io/savita/demo
。
这是用于创建 Knative 应用程序的最小 YAML 定义。
用户和开发人员可以通过根据其独特需求添加更多属性来调整 YAML 文件。
$ kubectl apply -f article.yaml
service.serving.knative.dev/knservice created
就这样!您现在可以使用 kubectl
查看可用的不同资源,就像对任何其他 Kubernetes 进程一样。
看看服务 (service)
$ kubectl get ksvc
NAME URL LATESTCREATED LATESTREADY READY REASON
knservice http://knservice.default.example.com knservice-00001 knservice-00001 True
您可以查看 配置 (configuration)
$ kubectl get configurations
NAME LATESTCREATED LATESTREADY READY REASON
knservice knservice-00001 knservice-00001 True
您还可以看到路由 (routes)
$ kubectl get routes
NAME URL READY REASON
knservice http://knservice.default.example.com True
您可以查看 修订版本 (revision)
$ kubectl get revision
NAME CONFIG NAME K8S SERVICE NAME GENERATION READY REASON ACTUAL REPLICAS DESIRED REPLICAS
knservice-00001 knservice 1 True 1 1
您可以看到已创建的 Pod
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
knservice-00001-deployment-57f695cdc6-pbtvj 2/2 Running 0 2m1s
缩放到零
Knative 的属性之一是在没有向应用程序发出请求时将 Pod 缩减到零。如果应用程序在五分钟内没有收到任何更多请求,则会发生这种情况。
$ kubectl get pods
No resources found in default namespace.
应用程序将被缩放到零实例,并且不再需要任何资源。这是 Serverless 的核心原则之一:如果不需要资源,则不消耗任何资源。
从零扩展
一旦再次使用该应用程序(意味着有请求发送到该应用程序),它会立即扩展到适当数量的 Pod。您可以使用 curl 命令 看到这一点
$ curl http://knservice.default.example.com
Hello Knative!
由于扩展需要首先发生,并且您必须至少创建一个 Pod,因此在大多数情况下,请求通常会持续更长时间。一旦成功完成,Pod 列表看起来就像以前一样
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
knservice-00001-deployment-57f695cdc6-5s55q 2/2 Running 0 3s
结论
Knative 具有 Serverless 框架所需的所有最佳实践。对于已经使用 Kubernetes 的开发人员来说,Knative 是一个易于访问和理解的扩展解决方案。
在本文中,我已经展示了 Knative Serving 的工作原理、它如何实现所需的快速扩展以及它如何实现 Serverless 的特性。
评论已关闭。