
图11-5 Knative Serving的设计
Knative Serving设计思路参见图11-5。
从图中可以看到Knative Serving利用Kubernetes自定义资源定义(CRD)新增了一组API来定义与控制在Kubernetes上的无服务器工作负载的行为,包括以下定义:
1)服务:service.serving.knative.dev资源
自动管理工作负载的整个生命周期。它控制其他对象的创建,以确保你的应用程序具有每次服务更新的路由、配置和新修订。可以将服务定义为始终将流量路由到最新修订版本或固定修订版本。如下是一个Knative服务的示例代码:
apiVersion: serving.knative.dev/v1alpha1 # Current version of Knative
kind: Service
metadata:
name: helloworld-go # The name of the app
namespace: default # The namespace the app will use
spec:
runLatest:
configuration:
revisionTemplate:
spec:
container:
image: registry.cn-hangzhou.aliyuncs.com/knative-mirror/samples-helloworld-go # The URL to the image of the app
env:
- name: TARGET # The environment variable printed out by the sample app
value: "Go Sample v1"
2)路由:route.serving.knative.dev资源将网络端点映射到一个或多个修订,并且可以通过多种方式管理流量,包括基于比例的流量拆分(fractional traff ic)和命名路由(named routes)。如下是一个Knative路由的示例代码:
apiVersion: serving.knative.dev/v1alpha1
kind: Route
metadata:
name: route-example
spec:
traffic:
- configurationName: helloworld-configuration-example
percent: 100
3)配置:conf iguration.serving.knative.dev资源维护部署所需的状态。它提供了代码和配置之间的清晰分离,并遵循The Twelve-Factor App方法,修改配置会创建新修订版本。(备注:12-Factor由Heroku创始人Adam Wiggins首次提出并开源,并由众多经验丰富的开发者共同完善,综合了关于SaaS应用几乎所有的经验和智慧,是开发此类应用的理想实践标准。)如下是一个Knative配置的示例代码:
apiVersion: serving.knative.dev/v1alpha1
kind: Configuration
metadata:
name: configuration-example
spec:
revisionTemplate:
metadata:
labels:
knative.dev/type: container
spec:
container:
image: github.com/knative/docs/serving/samples/rest-api-go
env:
- name: RESOURCE
value: stock
readinessProbe:
httpGet:
path: /
initialDelaySeconds: 3
periodSeconds: 3
4)修订:revision.serving.knative.dev资源是每次对工作负载进行修改的代码和配置的时间点快照。Revision是不可变对象,只要有用就可以保留。如下是一个Knative修订的示例代码:
apiVersion: serving.knative.dev/v1alpha1
kind: Revision
metadata:
labels:
serving.knative.dev/configuration: helloworld-go
name: revision-example
namespace: default
spec:
concurrencyModel: Multi
container:
env:
- name: TARGET
value: Go Sample v1
image: registry.cn-hangzhou.aliyuncs.com/knative-mirror/samples-helloworld-go
generation: 1
servingState: Active
总之,Knative Serving API中的主要资源是由路由、配置、修订和服务构成的,其中:
·配置就是指一个服务所需的状态,包括代码和配置内容。
·修订则是由代码和配置的不可变快照。
·路由提供了一个端点和路由流量的机制;默认情况下,会创建一个让你的应用可访问的路由。
·服务是由Knative的路由和配置组成,充当了一个顶级容器,用于管理实现网络服务的路由和配置集。