category
探索Knative Serving是如何详细工作的,它如何实现所需的快速扩展,以及它如何实现无服务器的功能。
Knative是一个基于Kubernetes平台的开源项目,用于构建、部署和管理在云中、本地或第三方数据中心运行的无服务器工作负载。谷歌最初是由50多家公司出资创办的。
Knative允许您构建基于容器和面向源代码的现代应用程序。
Knative核心项目
Knative由两个部分组成:服务和事件。在尝试开发Knative应用程序之前,了解这些应用程序是如何交互的是很有帮助的。
Knative Serving
Knative Serving负责围绕部署和计划部署的应用程序扩展的功能。这还包括网络拓扑,以提供对给定主机名下的应用程序的访问。
Knative Serving专注于:
- 快速部署无服务器容器。
- 自动缩放包括将pods 缩小到零。
- 支持Ambassador、Contour、Kourier、Gloo和Istio等多个网络层,以集成到现有环境中。
- 提供已部署代码和配置的时间点快照。
Knative Eventing
Knative Eventing涵盖了无服务器应用程序的事件驱动特性。事件驱动的体系结构基于创建事件的事件生产者和接收事件的事件消费者(或接收器)之间解耦关系的概念。
KnativeEventing使用标准HTTPPOST请求在事件生产者和接收器之间发送和接收事件。
在本文中,我将重点介绍Serving项目,因为它是Knative最核心的项目,有助于部署应用程序。
服务项目
Knative Serving将一组对象定义为Kubernetes自定义资源定义(CRD)。这些对象用于定义和控制无服务器工作负载在集群上的行为:
- 服务:Knative Service描述了如上所示的路线和配置的组合。它是一个更高级别的实体,不提供任何附加功能。它应该更容易快速部署应用程序并使其可用。您可以将服务定义为始终将流量路由到最新修订版或固定修订版。
- Route:Route描述了如何调用特定的应用程序,以及流量如何在不同的修订中分布。根据这些场景中的用例,在任何给定时间,系统中都有可能激活多个修订。路线的责任是划分交通并分配给修订。
- 配置:配置描述了应用程序的相应部署应该是什么样子。它提供了代码和配置之间的清晰分离,并遵循十二因素应用程序方法。修改配置会创建新的修订版。
- 修订:修订表示配置在特定时间点的状态。因此,将从配置中创建修订。修订是不可变的对象,只要有用,就可以保留它们。每个配置的几个修订可能在任何给定时间处于活动状态,您可以根据传入流量自动放大和缩小。
使用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
就是这样!现在,您可以像对待任何其他Kubernetes进程一样,通过使用kubectl来观察不同的可用资源。
看看服务:
$ kubectl get ksvc
NAME URL LATESTCREATED LATESTREADY READY REASON
knservice http://knservice.default.example.com knservice-00001 knservice-00001 True
您可以查看配置:
$ 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
您可以查看修订:
$ 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拥有无服务器框架所需的所有最佳实践。对于已经使用Kubernetes的开发人员来说,Knative是一个易于访问和理解的扩展解决方案。
在这篇文章中,我详细展示了Knative Serving是如何工作的,它是如何实现所需的快速扩展的,以及它如何实现无服务器的功能。
- 登录 发表评论
- 8 次浏览
最新内容
- 1 week 5 days ago
- 2 weeks 6 days ago
- 3 weeks 2 days ago
- 3 weeks 2 days ago
- 3 weeks 5 days ago
- 3 weeks 6 days ago
- 4 weeks ago
- 4 weeks 1 day ago
- 4 weeks 1 day ago
- 4 weeks 1 day ago