Skip to content

鸭子类型

Knative通过使用鸭子类型支持其组件的松散耦合

鸭子类型意味着在Knative系统中使用的资源的兼容性由用于识别资源控制平面形状和行为的某些属性决定。 这些属性基于一组针对不同类型资源的公共定义,称为鸭子类型。

Knative可以像使用泛型鸭类型一样使用资源,而不需要对资源类型有具体的了解,如果:

  • 资源在公共定义指定的相同模式位置中具有相同的字段
  • 与公共定义指定的相同的控件或数据平面行为

有些资源可以选择加入多种鸭子类型。

Knative中鸭子类型的一个基本用途是在资源 规范 中使用对象引用来指向其他资源。

包含引用的对象的定义规定了被引用资源的预期鸭子类型。

例子

在下面的例子中,一个名为 pointer 的Knative示例资源在其规范中引用了一个名为 pointeeDog 资源:

apiVersion: sample.knative.dev/v1
kind: Example
metadata:
  name: pointer
spec:
  size:
    apiVersion: extension.example.com/v1
    kind: Dog
    name: pointee

如果一个可观的鸭子类型的期望形状是,在status中,模式形状如下:

status:
  height: <in centimetres>
  weight: <in kilograms>

现在pointee的实例看起来像这样:

apiVersion: extension.example.com/v1
kind: Dog
metadata:
  name: pointee
spec:
  owner: Smith Family
  etc: more here
status:
  lastFeeding: 2 hours ago
  hungry: true
  age: 2
  height: 60
  weight: 20

示例资源起作用时,它只作用于大尺寸鸭子类型形状的信息,而Dog实现可以自由地拥有对该资源最有意义的信息。

当我们用一种新类型扩展系统时,鸭子类型的威力是显而易见的,例如, Human, 如果新资源符合大公司设定的合同。

apiVersion: sample.knative.dev/v1
kind: Example
metadata:
  name: pointer
spec:
  size:
    apiVersion: people.example.com/v1
    kind: human
    name: pointee
---
apiVersion: people.example.com/v1
kind: Human
metadata:
  name: pointee
spec:
  etc: even more here
status:
  college: true
  hungry: true
  age: 22
  height: 170
  weight: 50

示例资源能够应用为其配置的逻辑,而无需显式地了解HumanDog

Knative 鸭子类型

Knative定义了几个在整个项目中使用的鸭子类型的契约:

Addressable(可寻址)

可寻址的形状预期如下:

apiVersion: group/version
kind: Kind
status:
  address:
    url: http://host/path?query

Binding(绑定)

有了直接的subject, Binding 应该是以下形状:

apiVersion: group/version
kind: Kind
spec:
  subject:
    apiVersion: group/version
    kind: SomeKind
    namespace: the-namespace
    name: a-name

使用间接subject时, Binding 应该是以下形状:

apiVersion: group/version
kind: Kind
spec:
  subject:
    apiVersion: group/version
    kind: SomeKind
    namespace: the-namespace
    selector:
      matchLabels:
        key: value

Source(源)

使用ref接收器,Source 应该是以下形状:

apiVersion: group/version
kind: Kind
spec:
  sink:
    ref:
      apiVersion: group/version
      kind: AnAddressableKind
      name: a-name
  ceOverrides:
    extensions:
      key: value
status:
  observedGeneration: 1
  conditions:
    - type: Ready
      status: "True"
  sinkUri: http://host

使用uri接收器时,Source 应该是以下形状:

apiVersion: group/version
kind: Kind
spec:
  sink:
    uri: http://host/path?query
  ceOverrides:
    extensions:
      key: value
status:
  observedGeneration: 1
  conditions:
    - type: Ready
      status: "True"
  sinkUri: http://host/path?query

对于refuri接收器,Source 应该是以下形状:

apiVersion: group/version
kind: Kind
spec:
  sink:
    ref:
      apiVersion: group/version
      kind: AnAddressableKind
      name: a-name
    uri: /path?query
  ceOverrides:
    extensions:
      key: value
status:
  observedGeneration: 1
  conditions:
    - type: Ready
      status: "True"
  sinkUri: http://host/path?query
Back to top

We use analytics and cookies to understand site traffic. Information about your use of our site is shared with Google for that purpose. Learn more.

× OK