コンテンツへスキップ

SinkBindingの作成

API version v1

このトピックでは、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オブジェクトを包含モードに設定するには

  1. SINK_BINDING_SELECTION_MODEの値をexclusionからinclusionに変更するには、次を実行します。

    kubectl -n knative-eventing set env deployments eventing-webhook --containers="eventing-webhook" SINK_BINDING_SELECTION_MODE=inclusion
    
  2. 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
  1. 次のテンプレートを使用して、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です。
  2. 次のコマンドを実行して、YAMLファイルを適用します。

    kubectl apply -f <filename>.yaml
    
    ここで、<filename>は、前のステップで作成したファイルの名前です。

サブジェクトを作成する

サブジェクトはPodSpecableリソースである必要があります。クラスタ内の任意のPodSpecableリソースを使用できます。次に例を示します。

  • Deployment
  • Job
  • DaemonSet
  • StatefulSet
  • Service.serving.knative.dev

使用する既存のPodSpecableサブジェクトがない場合は、次のサンプルを使用して、サブジェクトとしてCronJobオブジェクトを作成できます。次のCronJobは、K_SINKをターゲットとし、CE_OVERRIDESによって指定された追加のオーバーライドを追加する単一のクラウドイベントを作成します。

  1. 次の例を使用して、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
    
  2. 次のコマンドを実行して、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"

  1. 次のテンプレートを使用して、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 オブジェクトで設定できるフィールドの詳細については、シンクバインディングリファレンスを参照してください。

  2. 次のコマンドを実行して、YAMLファイルを適用します。

    kubectl apply -f <filename>.yaml
    
    ここで、<filename>は、前のステップで作成したファイルの名前です。

SinkBinding オブジェクトの確認

  1. シンクのサービスログを確認して、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
    

  2. 出力から、ソースから表示関数に送信されたイベントメッセージのリクエストヘッダーと本文を示す行を確認します。例:

      ☁️  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 オブジェクトを含む名前空間の名前です。

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