コンテンツへスキップ

イベントレジストリ

Knative Eventingは、EventTypeオブジェクトを定義することで、コンシューマーがブローカーまたはチャネルから消費できるイベントの種類をより簡単に検出できるようにします。

イベントレジストリは、各ブローカーまたはチャネルが消費できるイベントタイプのカタログを保持します。レジストリに保存されているイベントタイプには、他の帯域外メカニズムに頼ることなく、コンシューマーがトリガーを作成するために必要なすべての情報が含まれています。

このトピックでは、イベントレジストリに追加する方法、レジストリを使用してイベントを検出する方法、およびその情報を活用して関心のあるイベントを購読する方法について説明します。

注記

イベントレジストリを使用する前に、ブローカー、トリガー、イベントソース、およびCloudEvents仕様(特にコンテキスト属性セクション)の基本的な理解をしておくことをお勧めします。

EventTypeオブジェクトについて

EventTypeオブジェクトは、Apache KafkaメッセージやGitHubプルリクエストなど、ブローカーまたはチャネルから消費できるイベントの種類を表します。EventTypeオブジェクトは、イベントレジストリに追加され、クラスタデータストアにイベントタイプの情報を永続化するために使用されます。

無関係なフィールドを省略したEventTypeのYAML例を以下に示します。

apiVersion: eventing.knative.dev/v1beta2
kind: EventType
metadata:
  name: dev.knative.source.github.push-34cnb
  namespace: default
  labels:
    eventing.knative.dev/sourceName: github-sample
spec:
  type: dev.knative.source.github.push
  source: https://github.com/knative/eventing
  schema:
  description:
  reference:
    apiVersion: eventing.knative.dev/v1
    kind: Broker
    name: default
status:
  conditions:
    - status: "True"
      type: ReferenceExists
    - status: "True"
      type: Ready

EventTypeオブジェクトの完全な仕様については、EventType APIリファレンスを参照してください。

metadata.nameフィールドは助言的であり、権威的ではありません。通常、名前の衝突を回避するためにgenerateNameを使用して生成されます。トリガーを作成する際には、metadata.nameは必要ありません。

コンシューマーにとって最も重要なフィールドはspecstatusです。これは、これらのフィールドが、イベントのソースとタイプ、およびイベントを受信するための参照が存在するかどうかなどの、トリガーを作成するために必要な情報を提供するためです。

次の表に、EventTypeオブジェクトのspecstatusフィールドに関する詳細情報を示します。

フィールド 説明 必須またはオプション
spec.type CloudEventタイプイベントメッシュに入る際の参照です。イベントコンシューマーはこの属性をフィルタリングしてトリガーを作成できます。このフィールドは権威的です。 必須
spec.source CloudEventソースイベントメッシュに入る際の参照です。イベントコンシューマーはこの属性をフィルタリングしてトリガーを作成できます。 必須
spec.schema JSONスキーマやprotobufスキーマなどの、EventTypeスキーマを含む有効なURI。 オプション
spec.description EventTypeに関する説明文字列。 オプション
spec.reference EventTypeを提供できるKResourceを参照します。 必須
status コンシューマーまたはクラスタオペレーターに、EventTypeが消費できる状態であるかどうかを伝えます。準備状況は、KReferenceが存在するかどうかを基に判断されます。 オプション

レジストリへのイベントの追加

EventTypeオブジェクトは、手動または自動でレジストリに追加できます。自動登録の方が簡単ですが、サポートされるイベントソースは一部のみです。

手動登録

手動登録の場合、クラスタコンフィグレーターは、他のKubernetesリソースと同様に、EventType YAMLファイルを適用します。

EventType YAMLファイルを手動で適用するには

  1. EventType YAMLファイルを作成します。必要なフィールドについては、「EventTypeオブジェクトについて」を参照してください。

  2. 次のコマンドを実行してYAMLを適用します。

    kubectl apply -f <event-type.yaml>
    

自動登録

手動登録は面倒でエラーが発生しやすい可能性があるため、KnativeはEventTypeを自動的に登録することもサポートしています。イベントソースがインスタンス化されると、EventTypeが自動的に作成されます。

自動登録のサポート

Knativeは、次のイベントソースのEventTypeの自動登録をサポートしています。

  • CronJobSource
  • ApiServerSource
  • GithubSource
  • GcpPubSubSource
  • KafkaSource
  • AwsSqsSource

Knativeは、Sources Duckタイプに準拠したソースのEventTypeの自動作成をサポートしています。

自動登録の手順

  • EventTypeを自動的に登録するには、次のコマンドを実行してイベントソースのYAMLファイルを適用します。

    kubectl apply -f <event-source.yaml>
    

イベントソースがインスタンス化されると、EventTypeがレジストリに追加されます。

例:KafkaSourceを使用した自動登録

レジストリに追加するためのKafkaSourceサンプルを以下に示します。

apiVersion: sources.knative.dev/v1beta1
kind: KafkaSource
metadata:
  name: kafka-sample
  namespace: default
spec:
  bootstrapServers:
   - my-cluster-kafka-bootstrap.kafka:9092
  topics:
   - knative-demo
   - news
  sink:
    apiVersion: eventing.knative.dev/v1
    kind: Broker
    name: default

上記の例では、topicsフィールドを使用してEventTypeのsourceフィールドが生成されます。

上記のYAMLを使用してkubectl applyを実行すると、KafkaSource kafka-source-sampleがインスタンス化され、トピックが2つあるため、2つのEventTypeがレジストリに追加されます。

レジストリを使用したイベントの検出

レジストリを使用して、ブローカーイベントメッシュが消費できるさまざまな種類のイベントを検出できます。

注記

EventType自動作成機能を使用すると、レジストリでより多くのイベントタイプを確認できます。この機能の有効化方法はこちらを参照してください。

購読可能なすべてのイベントタイプの表示

  • レジストリにある購読可能なイベントタイプのリストを表示するには、次のコマンドを実行します。

    kubectl get eventtypes -n <namespace>
    

    テストクラスタのdefault名前空間を使用した出力例

    NAME                                         TYPE                                    SOURCE                                                               SCHEMA        BROKER     DESCRIPTION     READY     REASON
    dev.knative.source.github.push-34cnb         dev.knative.source.github.push          https://github.com/knative/eventing                                                default                    True
    dev.knative.source.github.push-44svn         dev.knative.source.github.push          https://github.com/knative/serving                                                 default                    True
    dev.knative.source.github.pullrequest-86jhv  dev.knative.source.github.pull_request  https://github.com/knative/eventing                                                default                    True
    dev.knative.source.github.pullrequest-97shf  dev.knative.source.github.pull_request  https://github.com/knative/serving                                                 default                    True
    dev.knative.kafka.event-cjvcr                dev.knative.kafka.event                 /apis/v1/namespaces/default/kafkasources/kafka-sample#news                         default                    True
    dev.knative.kafka.event-tdt48                dev.knative.kafka.event                 /apis/v1/namespaces/default/kafkasources/kafka-sample#knative-demo                 default                    True
    google.pubsub.topic.publish-hrxhh            google.pubsub.topic.publish             //pubsub.googleapis.com/knative/topics/testing                                     dev                        False     BrokerIsNotReady
    

    この出力例は、default名前空間のレジストリに7つの異なるEventTypeオブジェクトがあることを示しています。これは、イベントを生成するイベントソースがシンクとしてブローカーを参照していることを前提としています。

EventTypeオブジェクトのYAMLの表示

  • EventTypeオブジェクトのYAMLを表示するには、次のコマンドを実行します。

    kubectl get eventtype <name> -o yaml
    
    ここで、<name>はEventTypeオブジェクトの名前であり、レジストリの出力のNAME列で見つけることができます。例:dev.knative.source.github.push-34cnb

EventType YAMLの例については、このページ上部の「EventTypeオブジェクトについて」を参照してください。

イベントの購読について

ブローカーのイベントメッシュから消費できるイベントがわかったら、トリガーを作成して特定のイベントを購読できます。

以下は、前に述べたレジストリの出力に基づいて、typeまたはsourceの完全一致を使用してイベントを購読するトリガーの例です。

  • 任意のソースからのGitHub *プッシュ*を購読します。

    apiVersion: eventing.knative.dev/v1
    kind: Trigger
    metadata:
     name: push-trigger
     namespace: default
    spec:
     broker: default
     filter:
       attributes:
         type: dev.knative.source.github.push
     subscriber:
       ref:
         apiVersion: serving.knative.dev/v1
         kind: Service
         name: push-service
    

    注記

    レジストリの出力例で述べたように、その特定の種類のイベントについては、knative/eventingknative/servingのGitHubリポジトリの2つのソースのみが存在します。後でGitHubプッシュの新しいソースが登録された場合、このトリガーはそれらを消費できます。

  • knative/eventingGitHubリポジトリからのGitHub *プルリクエスト*を購読します。

    apiVersion: eventing.knative.dev/v1
    kind: Trigger
    metadata:
     name: gh-knative-eventing-pull-trigger
     namespace: default
    spec:
     broker: default
     filter:
       attributes:
         type: dev.knative.source.github.pull_request
         source: https://github.com/knative/eventing
     subscriber:
       ref:
         apiVersion: serving.knative.dev/v1
         kind: Service
         name: gh-knative-eventing-pull-service
    
  • *knative-demo*トピックに送信されたKafkaメッセージを購読します。

    apiVersion: eventing.knative.dev/v1
    kind: Trigger
    metadata:
     name: kafka-knative-demo-trigger
     namespace: default
    spec:
     broker: default
     filter:
       attributes:
         type: dev.knative.kafka.event
         source: /apis/v1/namespaces/default/kafkasources/kafka-sample#knative-demo
     subscriber:
       ref:
         apiVersion: serving.knative.dev/v1
         kind: Service
         name: kafka-knative-demo-service
    
  • GCPのknativeプロジェクトからtestingトピックに送信されたPubSubメッセージを購読します。

    apiVersion: eventing.knative.dev/v1
    kind: Trigger
    metadata:
     name: gcp-pubsub-knative-testing-trigger
     namespace: default
    spec:
     broker: dev
     filter:
       attributes:
         source: //pubsub.googleapis.com/knative/topics/testing
     subscriber:
       ref:
         apiVersion: serving.knative.dev/v1
         kind: Service
         name: gcp-pubsub-knative-testing-service
    

    注記

    前述のレジストリの出力例では、このBrokerの準備状況がfalseと表示されています。このTriggerのサブスクライバは、Brokerの準備が完了するまでイベントを消費できません。

次のステップ

Knativeコードサンプルは、いくつかのイベントソースをより深く理解するための有用なリソースです。レジストリへのEventTypeの自動登録を希望する場合は、ソースをBrokerに接続する必要があることを忘れないでください。

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