٩( ᐛ )و 什么是 Knative Serving?友好的指南
尽管 Knative 自 2018 年以来一直由社区维护,但最近该项目引起了轰动,因为谷歌最近将 Knative 提交给云原生计算基金会(CNCF) 以考虑作为孵化项目。
凉爽的!但究竟什么是 Knative?
简而言之,Knative 是一种简化和增强应用程序在 Kubernetes 上运行的方式的技术。 Knative 本身在 Kubernetes 上运行,主要有两个方面:Knative Serving 和 Knative Eventing。这篇文章是关于 Knative Serving 的。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--T0ER7_jd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads .s3.amazonaws.com/uploads/articles/2egl13zn35nybn4jonz9.png)
Vanilla Kubernetes 很复杂
Knative 如何简化在 Kubernetes 上运行应用程序的过程?要理解这一点,您必须首先了解这一点:在 vanilla Kubernetes 上部署应用程序很复杂。您首先创建一个_deployment_,它最终管理许多_ReplicaSet_(每个版本的应用程序一个),每个ReplicaSet 运行一个或多个_pods_,这是您的应用程序容器运行的地方,通常每个pod 一个工作负载容器。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--1DSsaste--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads .s3.amazonaws.com/uploads/articles/i4f04m2rczb2xy7qwr4o.png)
但是您还需要创建一个 service 以在集群内部公开您的应用程序(以便应用程序的其他部分可以访问它),并创建一个 ingress 以使您的应用程序在集群外部可用(以便最终用户可以访问它)。如果要自动缩放,则需要制作 HorizontalPodAutoscaler (HPA)。您还需要与您的应用程序分开管理您的配置和机密。
[Image3]! https://res.cloudinary.com/practicaldev/image/fetch/s---4KVHACEU---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads .s3.amazonaws.com/uploads/articles/zou81yts471jhw4nv0s3.png)
这是很多需要考虑的。对于开发人员来说,这可能是一个很高的进入门槛——无论如何,开发人员都应该花时间编写应用程序代码。
输入 Knative。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--Wg7KUyzz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads .s3.amazonaws.com/uploads/articles/d3alcm3sl4zakgc7l4b2.png)
使用 Knative,您只需要创建一个资源 - Knative 服务 - 然后 Knative 会为您协调一组资源,以完成我们在上面的 Kubernetes 示例中介绍的所有内容!此外,默认设置的方式是您可以运行您的应用程序并使用一个开箱即用的命令(或一个应用的 YAML)从外部访问它。
Knative 简化应用部署
它是如何工作的?
kn service create sunshine –image=rainbows
运行 kn service create 命令*,提供您的应用程序名称、应用程序映像和任何配置(环境变量、首选端口等),Knative 将为您创建一个 Knative 服务** .
[](https://res.cloudinary.com/practicaldev/image/fetch/s--VVsHjJ_Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads .s3.amazonaws.com/uploads/articles/10fzzzzr7smbdmh5620c6.png)
Knative Service 会自动为您的 Service 创建一个 configuration 和一个 route。配置管理一个 revisions 流,每个版本都与一个 Kubernetes 部署和一个 Knative Pod Autoscaler (KPA) 相关联。
[Image7]!https://res.cloudinary.com/practicaldev/image/fetch/s--Z-M7NpjV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to - uploads.s3.amazonaws.com/uploads/articles/9fsnnin7b2o0rxmu3pia.png)
我将暂时解释这些组件中的每一个。但现在我想让你知道两件事:
-
当您运行 kn service create 命令时,所有这些对象都会为您创建,并且该命令会向您返回一个 URL,您可以在其中访问正在运行的应用程序。就这么容易。
-
除了支持 Knative 资源的 Kubernetes 资源外,您还可以查看、访问和操作 Kubernetes 集群中的所有这些 Knative 资源。 Knative 构建在 Kubernetes 之上,但它并没有掩盖它。
Knative 缩放为零
流量如何通过这些 Knative 抽象到达 Kubernetes 部署中正在运行的应用程序?
在这一点上,我们的系统只有一个修订版,所以它像这样移动:
[](https://res.cloudinary.com/practicaldev/image/fetch/s--kLUJ0ENy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads .s3.amazonaws.com/uploads/articles/hxmhpvzdiyj2e6azdai1.png)
流量通过 Knative Route 进入集群。默认情况下,路由将 100% 的流量发送到最新版本,但这是可配置的,我们将在本文后面讨论。
Knative Pod Autoscaler (KPA) 正在监视 Revision 收到的请求数量,并将根据需要自动扩展 Kubernetes 部署中的 pod 数量。 (再次,我将深入研究一下这里有哪些修订)。
[Image9]! https://res.cloudinary.com/practicaldev/image/fetch/s--27O_M-m---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to -uploads.s3.amazonaws.com/uploads/articles/snlucjcje503yxc3mu8i.png)
然后检查一下:当没有流量流向您的应用程序时,Knative 会将 pod 的数量缩放为零。这是正确的!与 Kubernetes 不同,您需要始终启动并运行至少一个 pod 实例才能为应用程序提供服务,而 Knative 可以缩放到零***。然后,当客户端请求访问您的应用程序时,这就是 Knative 开始实际运行应用程序 Pod 的时候。感人的!这可以节省大量浪费在保持很少使用的应用程序 pod 每小时、每天、每年运行一次的资金。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--UwibvKxI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads .s3.amazonaws.com/uploads/articles/2ic2qww6qwhyl27fg97u.png)
带有 Knative 修订的 Titier 发布管理
正如我之前提到的,Knative Configuration 对象管理着一个修订流。什么是 Knative 修订版?修订版是您当前代码和配置的及时快照,包含运行该特定版本应用程序所需的所有信息。这与 Kubernetes 管理配置的方式不同(在我看来,这是优越的),与源代码分开管理。
您想升级您的应用程序以使用最新的容器映像吗?砰! Knative 进行了新的修订。现在您想更新应用程序的配置吗?砰!新修订。这些修订是有序的、不可变的,并且可以无限期地持续存在。
分流
使用修订管理您的版本有两个主要好处。首先,您可以轻松地在修订之间拆分流量。这在推出新版本时特别有用。假设您目前有 100% 的流量流向修订版 2,并且您准备升级到更新版本,修订版 3。首先,您可以将少量流量发送到修订版 3,例如 10%。然后您运行一些用户测试,感觉更有信心,现在将 20% 的流量发送到新应用程序。您可以以这种方式继续,直到 100% 的流量流向修订版 3,而 0% 的流量流向修订版 2。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--Y-Eqsk_T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/uploads/articles/hjwn3cv55ka7csojkp11.png)
回滚
修订的第二个主要好处是回滚。由于 Knative 版本代表时间快照,因此您可以跳回您喜欢的任何版本的应用程序。如果您发现您的某个应用程序依赖项存在漏洞,您可以将流量引导回不使用该依赖项的最新版本——即使该漏洞是去年引入的,并且自那时以来已经发布了 20 个版本。当然,使用 Kubernetes,您也可以回滚,但使用 Kubernetes,回滚可能会很复杂。跟踪与每个版本相关的配置是一个难题,回滚超过一两个周期可能特别困难。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--YkiQfatR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads .s3.amazonaws.com/uploads/articles/yodh8ncrnc0vvja42r3p.png)
Knative 提供对路由和访问的细粒度控制
更重要的是,使用 Knative 的 Route 抽象,您可以设置路由以提供对完全实验性且不打算向公众公开的修订的内部访问。您可以设置一个站点和一个内部路径来对不同的 UI 模式进行测试,或者评估一个激进的新想法的可行性。 Knative Route 组件使您可以对路由和访问进行细粒度控制。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--ZQlldsU1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads .s3.amazonaws.com/uploads/articles/i1n4rxq769vqgjk47n5v.png)
总之,以下是 Knative Serving 的诸多好处:
-
易于部署
-
缩放为零
-
分流
-
回滚
-
路线和访问
想了解更多?在本地计算机上的Knative 快速入门环境中动手玩 Knative Serving!或者从 Jacques Chester 的书《Knative in Action_》中学习Knative Fundamentals!或两者!
(◠‿·)——☆
* 或者您可以通过使用 kubectl apply 命令向集群提供 Knative 服务定义 YAML 文件以声明方式执行此操作。
** Knative Service 是与 Kubernetes Service 完全不同的抽象。个人不理解这种区别让我很兴奋。
*** 这个概念也可以称为 serverless,这是一个加载且令人困惑的术语,以及为什么我将其降级为低级脚注。
这篇文章首先出现在这里在 VMware Tanzu 开发者中心。
更多推荐
所有评论(0)