コンテンツへスキップ

ダックタイピング

Knativeは、疎結合 を実現するために、ダックタイピングを使用しています。

ダックタイピングとは、Knativeシステムでリソースを使用するための互換性が、リソースのコントロールプレーンの形状と動作を識別するために使用される特定のプロパティによって決定されることを意味します。これらのプロパティは、ダックタイプと呼ばれるさまざまなタイプのリソースの共通定義セットに基づいています。

Knativeは、リソースが次の条件を満たしている場合、リソースの種類に関する特定の知識がなくても、汎用的なダックタイプであるかのようにリソースを使用できます。

  • リソースが、共通定義で指定されたものと同じスキーマの場所に同じフィールドを持っている場合
  • 共通定義で指定されたものと同じコントロールまたはデータプレーンの動作である場合

一部のリソースは、複数のダックタイプを選択できます。

Knativeにおけるダックタイピングの基本的な使用法は、リソースspecs内でオブジェクト参照を使用して、他のリソースを指すことです。参照を含むオブジェクトの定義は、参照されるリソースの期待されるダックタイプを規定します。

次の例では、pointerという名前のKnative Exampleリソースが、そのspec内でpointeeという名前のDogリソースを参照しています。

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

Sizableダックタイプの期待される形状が、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

Exampleリソースが機能する場合、Sizableダックタイプの形状の情報のみに基づいて動作し、Dogの実装は、そのリソースにとって最も意味のある情報を自由に持つことができます。ダックタイピングの力が明らかになるのは、新しいタイプ(たとえば、Human)でシステムを拡張する場合で、新しいリソースがSizableによって設定された契約を遵守している場合です。

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

Exampleリソースは、HumanまたはDogに関する明示的な知識がなくても、構成されたロジックを適用できます。

Knative ダックタイプ

Knativeは、プロジェクト全体で使用されているいくつかのダックタイプコントラクトを定義しています。

Addressable

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 Sink の場合、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 Sink の場合、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 両方の Sink の場合、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

当サイトでは、サイトのトラフィックを把握するために、アナリティクスとクッキーを使用しています。当サイトの利用に関する情報は、その目的のためにGoogleと共有されます。詳細はこちら。