Knative Eventingでイベント駆動なアプリケーションを体験する

## Knativeとは
KnativeはKubernetes上でサーバーレスなアプリケーションを構築するためのプラットフォームです

https://knative.dev/docs/

## Knativeの構築
サクッと試すなら、こちらの記事を参考にしてください

https://qiita.com/ryutoyasugi/items/44d45ac265a54972c614

## Knative Eventingについて
Knativeで単純にアプリケーションをデプロイ・実行するだけであればServingのみで実現できます
Eventingを使用することで、何らかのイベントをトリガーにアプリケーションを呼び出す、いわゆるイベント駆動でアプリケーションを実行することができるようになります

https://knative.dev/docs/getting-started/getting-started-eventing/

https://www.cncf.io/online-programs/event-driven-architecture-with-knative-events/

Eventingを構築する主なコンポーネントは以下です

* Sources：イベントをBrokerに発行する（Pub/Subでいうパブリッシャー）
* Brokers：イベントのハブとなるコンポーネント
* Triggers：Brokerに入ってくるイベントのフィルタリング
* Sinks：イベントを受信する（Pub/Subでいうサブスクライバー）

https://knative.dev/docs/getting-started/first-broker/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110859/a5a5c3d7-9339-cfdd-f5fa-55d7ad5dfa25.png)
EventingはCloudEventsに準拠してます

https://cloudevents.io/

[KonK](https://github.com/csantanapr/knative-kind)でKnativeを構築すると、お試しで使えるBrokerが入っているので、これを使って試していきます

```sh
$ kn broker list
NAME             URL                                                                               AGE   CONDITIONS   READY   REASON
example-broker   http://broker-ingress.knative-eventing.svc.cluster.local/default/example-broker   33m   5 OK / 5     True
```

## Sourceの作成
ここを参考にイベントを送信するSourceを作ります

https://knative.dev/docs/getting-started/first-source/

CloudEvents PlayerというサンプルアプリケーションにBrokerのURLを指定して作成

```sh
kn service create cloudevents-player \
--image ruromero/cloudevents-player:latest \
--env BROKER_URL=http://broker-ingress.knative-eventing.svc.cluster.local/default/example-broker

$ kn service list
NAME                 URL                                                  LATEST                     AGE   CONDITIONS   READY   REASON
cloudevents-player   http://cloudevents-player.default.127.0.0.1.nip.io   cloudevents-player-00001   45s   3 OK / 3     True
```
`http://cloudevents-player.default.127.0.0.1.nip.io`にアクセスしてイベントを送信することができます
ただ、Brokerにイベントが流れているだけで特に何も起きません
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110859/aa8a70c3-f9c4-0167-d024-36cd48b3a287.png)

## Triggerの作成
Sinkに先程作成したCloudEvents Playerを指定してTriggerを作ります
KnativeのServiceがSource・Sinkの両方に指定できることがわかります

https://knative.dev/docs/getting-started/first-trigger/

```sh
$ kn trigger create cloudevents-trigger --sink cloudevents-player  --broker example-broker

$ kn trigger list
NAME                  BROKER           SINK                      AGE   CONDITIONS   READY   REASON
cloudevents-trigger   example-broker   ksvc:cloudevents-player   3s    5 OK / 5     True
```
これでイベントを流すと先程と違い、イベントの受信を確認できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110859/1bc66d54-caca-5b6f-9755-73a24c0eb525.png)
イベントの流れ

1. Source(cloudevents-player)
1. Broker(example-broker)
1. Trigger(cloudevents-trigger)
1. Sink(cloudevents-player)

また、Triggerを作成する際にfilterを指定することで、特定のイベントのみ受信することもできます

```sh
$ kn trigger create cloudevents-player-filter --sink cloudevents-player  --broker example-broker --filter type=some-type
```

## 最後に
Eventingについてより詳細なドキュメントはこちら
https://knative.dev/docs/eventing/