ContainerSourceの作成¶
ContainerSourceオブジェクトは、イベントを生成し、シンクURIにメッセージを送信するコンテナイメージを起動します。ContainerSourceを使用して、Knativeで独自のイベントソースをサポートすることもできます。
ContainerSourceを使用してカスタムイベントソースを作成するには、コンテナイメージと、イメージURIを使用するContainerSourceを作成する必要があります。
始める前に¶
ContainerSourceオブジェクトを作成する前に、クラスターにKnative Eventingがインストールされている必要があります。
コンテナイメージの開発、ビルド、公開¶
任意の言語を使用してコンテナイメージを開発でき、任意のツールを使用してイメージをビルドおよび公開できます。以下に基本的なガイドラインを示します。
- ContainerSourceコントローラーによって、
K_SINK
とK_CE_OVERRIDES
の2つの環境変数が注入されます。これらはそれぞれspec.sink
とspec.ceOverrides
から解決されます。 - イベントメッセージは、
K_SINK
で指定されたシンクURIに送信されます。メッセージはCloudEvents HTTP形式でPOSTとして送信する必要があります。
ContainerSourceオブジェクトの作成¶
-
イベントソースのイメージをビルドし、イメージリポジトリに公開します。イメージは環境変数
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
-
次のコマンドを実行して、ContainerSourceの名前空間を作成します
kubectl create namespace <namespace>
ここで、
<namespace>
は、ContainerSourceで使用する名前空間です。たとえば、heartbeat-source
です。 -
シンクを作成します。まだシンクがない場合は、次のKnative Serviceを使用できます。これは受信メッセージをログにダンプします。
注
Knativeサービスを作成するには、クラスターにKnative Servingがインストールされている必要があります。
-
シンクを作成するには、次のコマンドを実行します
kn service create event-display --port 8080 --image gcr.io/knative-releases/knative.dev/eventing/cmd/event_display
-
次の例を使用して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
-
次のコマンドを実行してYAMLファイルを適用します
ここで、kubectl apply -f <filename>.yaml
<filename>
は、前の手順で作成したファイルの名前です。
-
-
特定の引数と環境設定を使用して具体的な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クライアントドキュメントを参照してください。
-
次のテンプレートを使用して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リファレンスを参照してください。
-
次のコマンドを実行してYAMLファイルを適用します
ここで、kubectl apply -f <filename>.yaml
<filename>
は、前の手順で作成したファイルの名前です。
注
引数と環境変数が設定され、コンテナに渡されます。
-
ContainerSourceオブジェクトの検証¶
-
次のコマンドを実行して、イベントコンシューマーのログを表示します
ここで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
-
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リファレンスを参照してください。