ダックタイピング¶
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
- Binding
- Channelable
- Podspecable
- Source
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
ref
と uri
両方の 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