Knative 如何释放 Serverless 的力量

详细探索 Knative Serving 的工作原理、它如何实现所需快速扩展以及它如何实现 Serverless 的特性。
39 位读者喜欢这篇文章。
Ship captain sailing the Kubernetes seas

Knative 是一个基于 Kubernetes 平台的开源项目,用于构建、部署和管理在云端、本地或第三方数据中心运行的 Serverless 工作负载。Google 最初启动了这个项目,并得到了 50 多家公司的贡献。

Knative 允许您构建现代应用程序,这些应用程序是基于容器且面向源代码的。

Knative 核心项目

Knative 由两个组件组成:Serving 和 Eventing。在尝试开发 Knative 应用程序之前,了解它们如何交互很有帮助。

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 工作负载在集群上的行为

  • 服务 (Service):Knative 服务描述了路由 (route)配置 (configuration)的组合,如上所示。它是一个更高级别的实体,不提供任何附加功能。它应该使快速部署应用程序并使其可用变得更容易。您可以定义服务始终将流量路由到最新修订版本或固定的修订版本。

  • 路由 (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 的特性。

接下来阅读什么

评论已关闭。

Creative Commons License本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.