11.4.1 Knative Serving的设计

图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的路由和配置组成,充当了一个顶级容器,用于管理实现网络服务的路由和配置集。