コンテンツにスキップ

ContainerSourceの作成

API version v1

ContainerSourceオブジェクトは、イベントを生成し、シンクURIにメッセージを送信するコンテナイメージを起動します。ContainerSourceを使用して、Knativeで独自のイベントソースをサポートすることもできます。

ContainerSourceを使用してカスタムイベントソースを作成するには、コンテナイメージと、イメージURIを使用するContainerSourceを作成する必要があります。

始める前に

ContainerSourceオブジェクトを作成する前に、クラスターにKnative Eventingがインストールされている必要があります。

コンテナイメージの開発、ビルド、公開

任意の言語を使用してコンテナイメージを開発でき、任意のツールを使用してイメージをビルドおよび公開できます。以下に基本的なガイドラインを示します。

  • ContainerSourceコントローラーによって、K_SINKK_CE_OVERRIDESの2つの環境変数が注入されます。これらはそれぞれspec.sinkspec.ceOverridesから解決されます。
  • イベントメッセージは、K_SINKで指定されたシンクURIに送信されます。メッセージはCloudEvents HTTP形式でPOSTとして送信する必要があります。

ContainerSourceオブジェクトの作成

  1. イベントソースのイメージをビルドし、イメージリポジトリに公開します。イメージは環境変数K_SINKを読み取り、K_SINKで指定されたURLにメッセージをPOSTする必要があります。

    次のYAMLを使用して、デモのheartbeatsイベントソースをデプロイできます。

    apiVersion: sources.knative.dev/v1
    kind: ContainerSource
    metadata:
      name: heartbeat-source
    spec:
      template:
        spec:
          containers:
            - image: gcr.io/knative-nightly/knative.dev/eventing/cmd/heartbeats:latest
              name: heartbeats
      sink:
        ref:
          apiVersion: serving.knative.dev/v1
          kind: Service
          name: event-display
    
  2. 次のコマンドを実行して、ContainerSourceの名前空間を作成します

    kubectl create namespace <namespace>
    

    ここで、<namespace>は、ContainerSourceで使用する名前空間です。たとえば、heartbeat-sourceです。

  3. シンクを作成します。まだシンクがない場合は、次のKnative Serviceを使用できます。これは受信メッセージをログにダンプします。

    Knativeサービスを作成するには、クラスターにKnative Servingがインストールされている必要があります。

    • シンクを作成するには、次のコマンドを実行します

      kn service create event-display --port 8080 --image gcr.io/knative-releases/knative.dev/eventing/cmd/event_display
      
    1. 次の例を使用してYAMLファイルを作成します

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: event-display
      spec:
        replicas: 1
        selector:
          matchLabels: &labels
            app: event-display
        template:
          metadata:
            labels: *labels
          spec:
            containers:
              - name: event-display
                image: gcr.io/knative-releases/knative.dev/eventing/cmd/event_display
      
      ---
      
      kind: Service
      apiVersion: v1
      metadata:
        name: event-display
      spec:
        selector:
          app: event-display
        ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
      
    2. 次のコマンドを実行してYAMLファイルを適用します

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

  4. 特定の引数と環境設定を使用して具体的なContainerSourceを作成します。

    • ContainerSourceを作成するには、次のコマンドを実行します

      kn source container create <name> --image <image-uri> --sink <sink> -e POD_NAME=<pod-name> -e POD_NAMESPACE=<pod-namespace>
      
      ここで

      • <name>は、ContainerSourceオブジェクトに使用する名前です。たとえば、test-heartbeatsです。
      • <image-uri>は、手順1でビルドおよび公開したイメージURIに対応します。たとえば、gcr.io/knative-nightly/knative.dev/eventing/cmd/heartbeatsです。
      • <pod-name>は、コンテナが実行されるPodの名前です。たとえば、mypodです。
      • <pod-namespace>は、Podが実行される名前空間です。たとえば、event-testです。
      • <sink>は、シンクの名前です。たとえば、event-displayです。利用可能なオプションの一覧については、Knativeクライアントドキュメントを参照してください。
    1. 次のテンプレートを使用してYAMLファイルを作成します

      apiVersion: sources.knative.dev/v1
      kind: ContainerSource
      metadata:
        name: <containersource-name>
      spec:
        template:
          spec:
            containers:
              - image: <event-source-image-uri>
                name: <container-name>
                env:
                  - name: POD_NAME
                    value: "<pod-name>"
                  - name: POD_NAMESPACE
                    value: "<pod-namespace>"
        sink:
          ref:
            apiVersion: v1
            kind: Service
            name: <sink>
      
      ここで

      • <namespace>は、ContainerSource用に作成した名前空間です。たとえば、containersource-exampleです。
      • <containersource-name>は、ContainerSourceに使用する名前です。たとえば、test-heartbeatsです。
      • <event-source-image-uri>は、手順1でビルドおよび公開したイメージURIに対応します。たとえば、gcr.io/knative-nightly/knative.dev/eventing/cmd/heartbeatsです。
      • <container-name>は、イベントソースの名前です。たとえば、heartbeatsです。
      • <pod-name>は、コンテナが実行されるPodの名前です。たとえば、mypodです。
      • <pod-namespace>は、Podが実行される名前空間です。たとえば、event-testです。
      • <sink>は、シンクの名前です。たとえば、event-displayです。

      ContainerSourceオブジェクトで構成できるフィールドの詳細については、ContainerSourceリファレンスを参照してください。

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

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

    引数と環境変数が設定され、コンテナに渡されます。

ContainerSourceオブジェクトの検証

  1. 次のコマンドを実行して、イベントコンシューマーのログを表示します

    kubectl -n <namespace> logs -l <pod-name> --tail=200
    
    ここで

    • <namespace>は、ContainerSourceオブジェクトが含まれている名前空間です。
    • <pod-name>は、コンテナが実行されるPodの名前です。

    $ kubectl -n containersource-example logs -l app=event-display --tail=200
    
  2. ContainerSourceがシンクに送信したイベントのプロパティが出力に返されることを確認します。次の例では、コマンドは、ContainerSourceがevent-displayサービスに送信したイベントのAttributesプロパティとDataプロパティを返しました。

    ☁️  cloudevents.Event
    Validation: valid
    Context Attributes,
      specversion: 1.0
      type: dev.knative.eventing.samples.heartbeat
      source: https://knative.dokyumento.jp/eventing/cmd/heartbeats/#event-test/mypod
      id: 2b72d7bf-c38f-4a98-a433-608fbcdd2596
      time: 2019-10-18T15:23:20.809775386Z
      contenttype: application/json
    Extensions,
      beats: true
      heart: yes
      the: 42
    Data,
      {
        "id": 2,
        "label": ""
      }
    

ContainerSourceオブジェクトの削除

ContainerSourceオブジェクトと名前空間内のすべての関連リソースを削除するには

  • 次のコマンドを実行して名前空間を削除します

    kubectl delete namespace <namespace>
    

    ここで、<namespace>は、ContainerSourceオブジェクトが含まれている名前空間です。

リファレンスドキュメント

ContainerSourceリファレンスを参照してください。

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