SinkBindingの作成¶
このトピックでは、SinkBindingオブジェクトを作成する方法について説明します。SinkBindingは、シンクをURIとして解決し、環境変数K_SINK
にURIを設定し、K_SINK
を使用してURIをサブジェクトに追加します。URIが変更された場合、SinkBindingはK_SINK
の値を更新します。
次の例では、シンクはKnative Serviceであり、サブジェクトはCronJobです。既存のサブジェクトとシンクがある場合は、例を自分の値に置き換えることができます。
始める前に¶
SinkBindingオブジェクトを作成する前に
- クラスタにKnative Eventingがインストールされている必要があります。
- オプション: SinkBindingで
kn
コマンドを使用する場合は、kn
CLIをインストールします。
オプション: SinkBindingの名前空間選択動作を選択する¶
SinkBindingオブジェクトは、exclusion
またはinclusion
の2つのモードのいずれかで動作します。
デフォルトモードはexclusion
です。除外モードでは、SinkBindingの動作は名前空間に対してデフォルトで有効になっています。名前空間を突然変異の評価から除外するには、ラベルbindings.knative.dev/exclude: true
を使用して除外する必要があります。
包含モードでは、SinkBindingの動作は名前空間に対して有効になっていません。名前空間を突然変異の評価対象にする前に、ラベルbindings.knative.dev/include: true
を使用して明示的に含める必要があります。
SinkBindingオブジェクトを包含モードに設定するには
-
SINK_BINDING_SELECTION_MODE
の値をexclusion
からinclusion
に変更するには、次を実行します。kubectl -n knative-eventing set env deployments eventing-webhook --containers="eventing-webhook" SINK_BINDING_SELECTION_MODE=inclusion
-
SINK_BINDING_SELECTION_MODE
が意図したとおりに設定されていることを確認するには、次を実行します。kubectl -n knative-eventing set env deployments eventing-webhook --containers="eventing-webhook" --list | grep SINK_BINDING
名前空間を作成する¶
既存の名前空間がない場合は、SinkBindingオブジェクトの名前空間を作成します
kubectl create namespace <namespace>
<namespace>
はSinkBindingで使用する名前空間です。たとえば、sinkbinding-example
です。
注意
包含モードを選択した場合は、SinkBindingの動作を有効にするために、名前空間にbindings.knative.dev/include: true
ラベルを追加する必要があります。
シンクを作成する¶
シンクは、イベントを受信できる任意のアドレス指定可能なKubernetesオブジェクトにすることができます。
SinkBindingオブジェクトに接続する既存のシンクがない場合は、Knativeサービスを作成します。
注意
Knativeサービスを作成するには、クラスタにKnative Servingがインストールされている必要があります。
Knativeサービスを作成するには、次を実行します。
kn service create <app-name> --image <image-url>
<app-name>
は、アプリケーションの名前です。<image-url>
は、イメージコンテナのURLです。
例
$ kn service create event-display --image gcr.io/knative-releases/knative.dev/eventing/cmd/event_display
-
次のテンプレートを使用して、KnativeサービスのYAMLファイルを作成します。
ここでapiVersion: serving.knative.dev/v1 kind: Service metadata: name: <app-name> spec: template: spec: containers: - image: <image-url>
<app-name>
は、アプリケーションの名前です。たとえば、event-display
です。<image-url>
は、イメージコンテナのURLです。たとえば、gcr.io/knative-releases/knative.dev/eventing/cmd/event_display
です。
-
次のコマンドを実行して、YAMLファイルを適用します。
ここで、kubectl apply -f <filename>.yaml
<filename>
は、前のステップで作成したファイルの名前です。
サブジェクトを作成する¶
サブジェクトはPodSpecableリソースである必要があります。クラスタ内の任意のPodSpecableリソースを使用できます。次に例を示します。
Deployment
Job
DaemonSet
StatefulSet
Service.serving.knative.dev
使用する既存のPodSpecableサブジェクトがない場合は、次のサンプルを使用して、サブジェクトとしてCronJobオブジェクトを作成できます。次のCronJobは、K_SINK
をターゲットとし、CE_OVERRIDES
によって指定された追加のオーバーライドを追加する単一のクラウドイベントを作成します。
-
次の例を使用して、CronJobのYAMLファイルを作成します。
apiVersion: batch/v1 kind: CronJob metadata: name: heartbeat-cron spec: # Run every minute schedule: "*/1 * * * *" jobTemplate: metadata: labels: app: heartbeat-cron spec: template: spec: restartPolicy: Never containers: - name: single-heartbeat image: gcr.io/knative-nightly/knative.dev/eventing/cmd/heartbeats args: - --period=1 env: - name: ONE_SHOT value: "true" - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace
-
次のコマンドを実行して、YAMLファイルを適用します。
ここで、kubectl apply -f <filename>.yaml
<filename>
は、前のステップで作成したファイルの名前です。
SinkBindingオブジェクトを作成する¶
サブジェクトからシンクにイベントを送信するSinkBinding
オブジェクトを作成します。
SinkBinding
オブジェクトを作成するには、次を実行します。
kn source binding create <name> \
--namespace <namespace> \
--subject "<subject>" \
--sink <sink> \
--ce-override "<cloudevent-overrides>"
<name>
は、作成するSinkBindingオブジェクトの名前です。<namespace>
は、SinkBindingで使用するために作成した名前空間です。<subject>
は、接続するサブジェクトです。例Job:batch/v1:app=heartbeat-cron
は、ラベルapp=heartbeat-cron
を持つ名前空間内のすべてのジョブに一致します。Deployment:apps/v1:myapp
は、名前空間内のmyapp
という名前のデプロイメントに一致します。Service:serving.knative.dev/v1:hello
は、hello
という名前のサービスに一致します。
<sink>
は、接続するシンクです。たとえば、http://event-display.svc.cluster.local
です。- オプション:
<cloudevent-overrides>
はkey=value
の形式です。クラウドイベントのオーバーライドは、シンクに送信されるイベントの出力形式と変更を制御し、イベントの送信前に適用されます。このフラグは複数回指定できます。
利用可能なオプションのリストについては、Knativeクライアントドキュメントを参照してください。
例
$ kn source binding create bind-heartbeat \
--namespace sinkbinding-example \
--subject "Job:batch/v1:app=heartbeat-cron" \
--sink http://event-display.svc.cluster.local \
--ce-override "sink=bound"
-
次のテンプレートを使用して、
SinkBinding
オブジェクトのYAMLファイルを作成します。ここでapiVersion: sources.knative.dev/v1 kind: SinkBinding metadata: name: <name> spec: subject: apiVersion: <api-version> kind: <kind> selector: matchLabels: <label-key>: <label-value> sink: ref: apiVersion: serving.knative.dev/v1 kind: Service name: <sink>
<name>
は、作成するSinkBindingオブジェクトの名前です。たとえば、bind-heartbeat
です。<api-version>
は、サブジェクトのAPIバージョンです。たとえば、batch/v1
です。<kind>
は、サブジェクトの種類です。たとえば、Job
です。<label-key>: <label-value>
は、一致するラベルを持つサブジェクトを選択するためのキーと値のペアのマップです。たとえば、app: heartbeat-cron
は、ラベルapp=heartbeat-cron
を持つすべてのサブジェクトを選択します。<sink>
は接続先のシンクです。例えば、event-display
などです。
SinkBinding オブジェクトで設定できるフィールドの詳細については、シンクバインディングリファレンスを参照してください。
-
次のコマンドを実行して、YAMLファイルを適用します。
ここで、kubectl apply -f <filename>.yaml
<filename>
は、前のステップで作成したファイルの名前です。
SinkBinding オブジェクトの確認¶
-
シンクのサービスログを確認して、Knative イベントシステムにメッセージが送信されたことを確認します。
ここでkubectl logs -l <sink> -c <container> --since=10m
<sink>
はシンクの名前です。<container>
はシンクが実行されているコンテナの名前です。
例
$ kubectl logs -l serving.knative.dev/service=event-display -c user-container --since=10m
-
出力から、ソースから表示関数に送信されたイベントメッセージのリクエストヘッダーと本文を示す行を確認します。例:
☁️ cloudevents.Event Validation: valid Context Attributes, specversion: 1.0 type: dev.knative.eventing.samples.heartbeat source: https://knative.dokyumento.jp/eventing-contrib/cmd/heartbeats/#default/heartbeat-cron-1582120020-75qrz id: 5f4122be-ac6f-4349-a94f-4bfc6eb3f687 time: 2020-02-19T13:47:10.41428688Z datacontenttype: application/json Extensions, beats: true heart: yes the: 42 Data, { "id": 1, "label": "" }
SinkBinding の削除¶
SinkBinding オブジェクトと名前空間内の関連リソースをすべて削除するには、次のコマンドを実行して名前空間を削除します。
kubectl delete namespace <namespace>
<namespace>
は SinkBinding オブジェクトを含む名前空間の名前です。