0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Knative Event経由でKnative Serviceを呼び出す

Last updated at Posted at 2024-12-13

概要

以前、Knative上でトラフィック管理する記事オートスケーリングする記事を執筆しました。

今回は、Knative Eventingについて取り上げます。
Knative Eventingは、Knative上でイベント駆動型のシステムを実現するメカニズムです。

この記事では、Knative Eventingを利用して、Knative Serviceを呼び出す方法について説明します。具体的には、Flaskを使ったシンプルなWebアプリケーションをコンテナ化し、Knative Serviceとしてデプロイします。その後、PingSourceを利用して定期的にこのサービスを呼び出す仕組みを構築します。

1. Flaskを使った簡単なWebアプリケーションの作成

まず、Flaskを使ったシンプルなWebアプリケーションを作成します。このアプリケーションは、HTTPリクエストのペイロードをログに記録し、同じ内容をレスポンスとして返します。

以下のPythonコードは、そのアプリケーションの内容です。

from flask import Flask, request
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def index():
    logger.info(request.get_json())
    return f"echo: {request.get_json()}"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80)

このコードでは、/エンドポイントに対してGETまたはPOSTリクエストを受け付け、リクエストボディをログに記録し、その内容を"echo"という形式で返します。

2. Dockerコンテナの作成

次に、このアプリケーションをコンテナ化します。以下のDockerfileを使用して、Flaskアプリケーションをコンテナイメージとしてビルドします。

FROM python:3.12-slim

WORKDIR /app
RUN pip install flask

COPY web-echo.py /app

ENTRYPOINT python web-echo.py

このDockerfileは、Python 3.12の軽量イメージをベースに、Flaskをインストールし、web-echo.pyをアプリケーションとして実行するものです。

コンテナイメージのビルドは以下のコマンドで行います。

docker build . -t yoshikit/web-echo:latest

こちらのイメージはDocker Hubで利用可能です:
https://hub.docker.com/r/yoshikit/web-echo

3. Knative Serviceのデプロイ

次に、このコンテナイメージをKnative Serviceとしてデプロイします。以下のKnativeService.yamlファイルを使用します。

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: web-echo
spec:
  template:
    spec:
      containers:
      - image: yoshikit/web-echo:latest
        imagePullPolicy: Always
        ports:
            - containerPort: 80

このYAMLファイルは、yoshikit/web-echo:latestイメージを使用してKnative Serviceをデプロイする設定です。containerPortは80に設定されており、HTTPリクエストを受け付けます。

このファイルを適用するには、以下のコマンドを使用します。

kubectl apply -f KnativeService.yaml

これで、Knative Serviceがクラスタにデプロイされます。

4. PingSourceを使ったイベントの送信

最後に、Knative Eventingの機能を利用して、定期的にこのサービスを呼び出すためにPingSourceを設定します。以下のPingSource.yamlファイルを使用します。

apiVersion: sources.knative.dev/v1
kind: PingSource
metadata:
  name: ping-source
spec:
  schedule: "*/1 * * * *"
  data: '{"message": "Hello world!"}'
  contentType: application/json
  sink:
    ref:
      apiVersion: serving.knative.dev/v1
      kind: Service
      name: web-echo

このPingSourceは、毎分{"message": "Hello world!"}というJSONデータをweb-echoという名前のKnative Serviceに送信します。

この設定を適用するには、以下のコマンドを使用します。

kubectl apply -f PingSource.yaml

5. 動作確認

全ての設定が完了したら、Knative Serviceが正常にイベントを受信し、レスポンスを返すことを確認します。Kubernetesのログを確認して、web-echoサービスのログに"Hello world!"というメッセージが記録されていることを確認します。

kubectl logs -l serving.knative.dev/service=web-echo

上記コマンドでログを確認し、定期的に"echo: {'message': 'Hello world!'}"というメッセージが出力されていれば成功です。

実際に出力されたログ:

Defaulted container "user-container" out of: user-container, queue-proxy
INFO:__main__:{'message': 'Hello world!'}
INFO:werkzeug:127.0.0.1 - - [03/Sep/2024 12:25:00] "POST / HTTP/1.1" 200 -
INFO:__main__:{'message': 'Hello world!'}
INFO:werkzeug:127.0.0.1 - - [03/Sep/2024 12:26:00] "POST / HTTP/1.1" 200 -
INFO:__main__:{'message': 'Hello world!'}
INFO:werkzeug:127.0.0.1 - - [03/Sep/2024 12:27:00] "POST / HTTP/1.1" 200 -
INFO:__main__:{'message': 'Hello world!'}
INFO:werkzeug:127.0.0.1 - - [03/Sep/2024 12:28:00] "POST / HTTP/1.1" 200 -
INFO:__main__:{'message': 'Hello world!'}
INFO:werkzeug:127.0.0.1 - - [03/Sep/2024 12:29:00] "POST / HTTP/1.1" 200 -

まとめ

この記事では、Knative Eventingを利用して、PingSourceからKnative Serviceを呼び出す方法を説明しました!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?