ラズパイ×KEDAでサーバーレス入門
今回はサーバーレスの学習を兼ねて、KEDAをラズベリーパイ上で構築し、イベント駆動型サービスを開発/構築しました。
サーバーレスを支える技術
イベント駆動(Event-driven)とは、例えばボタンが押される(イベントが発生する)と処理が実行される(駆動する)という事象のことで、このような仕組み全般をイベント駆動型アーキテクチャとかいいます。
近日のキーワードになっているサーバーレス・コンピューティングですが、これを実現する手段として、インフラのイベント駆動化が注目されている感じ(だと思っている)です。
具体的なサービスを挙げるとAWS Lambda(Amazon)、Azure Functions(Microsoft)などです。FaaS(Function as a Service)とよび、コードの実行をサービスとして提供しています。このサービスのバックグラウンドにイベント駆動化されたインフラがいます。
イベントが発生したらユーザのコードを実行する環境をデプロイされます。このため開発者は毎回、クリーンな実行環境を用意し直したり、サーバをプロビジョニングしたりする必要がありません。基盤としては、従来のようにユーザがサーバを占有しないため、純粋な開発においてはマシンリソースを大きく節約することができます。
そしてこのイベントが発生したらユーザのコードを実行する環境をデプロイの部分に、インフラをイベント駆動化する技術であるKnativeやKEDAがいます。
KEDA
KEDAは端的にいうと、k8s上で動作するイベント駆動型のオートスケーラーです。イベントの受信
→Podのオートスケール
になります。
恐ろしくシンプルなのですが、例えば
- ユーザからRESTが送られてきたらPodを起動したい
- CPUやRAM使用率が上がったらPodを減らしたい
- Kafkaへのmessage量が一定以上になったらmessageを処理するPodをスケールダウンしたい
などが実現可能です。ちなみにCNCF(Cloud Native Computing Foundation:コンテナ技術についての技術を推進していこうとしている財団)に加入しました。
KEDA for arm64(RaspberryPi)
KEDA公式はaarch64
(arm系アーキテクチャ)には対応していただけない様子...だったのですが、最近はCNCFのバックアップがあり、前向きに検討され始めてきていました!
ただし現状では、まだ内部の開発者(mohsinonxrm
氏)が提供しているだけで、最新バージョン2.5.0
は使えず、2.4.0
が提供されています。
→現在(2021-12-19)は2.6.0
が最新で、2.5.0
がmohsinonxrm氏によって提供されていました。
上記の現状のため少なくとも正式リリースまでは、自分でビルドする方法を知っておく必要があるなということで、今回はRaspberryPi上でKEDAをビルドしてしまいました。
ビルド方法
KEDAのリポジトリにDockerfileがあり、想定される環境下であれば問題なくビルドできるというものなのですがmohsinonxrm
の資料を参考に、RaspberryPiでも動作するDockerfileを作成しました。
keda(manager)
コードをgit clone
して持ってくること、ARCH=arm
、make実行前にgo mod tidy
している以外はほぼ内容同じです。
FROM golang:1.17.3 as builder
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Tokyo
WORKDIR /workspace
ENV ARCH=arm
RUN git clone -b v2.5.0 https://github.com/kedacore/keda.git && \
cd keda && \
go mod tidy && \
make manager
FROM gcr.io/distroless/static:nonroot
WORKDIR /
COPY /workspace/keda/bin/keda .
USER nonroot:nonroot
ENTRYPOINT ["/keda", "--zap-log-level=info", "--zap-encoder=console"]
バージョンの異なる内容が必要な場合はリポジトリのDockerfileを参照して書き直してください。
keda-metrics-apiserver(adapter)
Metrics APIトリガーを利用するのに必要になります。make build
であればkeda(manager)もbinに出力されるので、実はimageに大きな違いがなく、最低1つのdockerイメージでデプロイできたりします。
それでも分けているのは、結局デプロイ時にyamlで設定を作成する必要があり、KEDAのアップデートが速いことを考えると、削減できるリソースが管理コストに見合わないためです。
FROM golang:1.17.3 as builder
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Tokyo
WORKDIR /workspace
ENV ARCH=arm
RUN git clone -b v2.5.0 https://github.com/kedacore/keda.git && \
cd keda && \
go mod tidy && \
make adapter
RUN mkdir -p /apiserver.local.config/certificates && \
chmod -R 777 /apiserver.local.config
FROM gcr.io/distroless/static:nonroot
WORKDIR /
COPY /workspace/keda/bin/keda-adapter .
COPY /apiserver.local.config /apiserver.local.config
USER nonroot:nonroot
ENTRYPOINT ["/keda-adapter", "--secure-port=6443", "--logtostderr=true", "--v=0"]
バージョンの異なる内容が必要な場合はリポジトリのDockerfile.adapterを参照して書き直してください。
デプロイ方法(kustomize)
keda-2.5.0.yaml
)を、以下のファイルと同じディレクトリに配置します。
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../base
images:
- name: ghcr.io/kedacore/keda-metrics-apiserver:2.5.0
newName: registry.neko.lab:5005/root/serverless/keda-metrics-apiserver
newTag: latest
- name: ghcr.io/kedacore/keda:2.5.0
newName: registry.neko.lab:5005/root/serverless/keda
newTag: latest
name
にはkeda-2.5.0.yaml
で指定されているimage
と同じ値を、newName
とnewTag
は自身の設定を記載します。レジストリにイメージをPush完了したらkubectl apply -k manifests/keda/
でk8s上にデプロイできます。
以上でkedaの構築は完了です。
KEDAの使用例
KEDAのデプロイだけではおもしろくないので実際に便利そうなものを作ってみました。
RESTサーバにyoutubeのurlをPOSTすると、サーバにダウンロードしてくれる機構(ydl-sserver
)です。youtube-dl
を利用しています。
KEDAはこちらが用意したMetricsサーバの特定URLに対して定期的に結果を取得しており、ここで得られる値によってスケジュールを行います。
ydl-server
はcurlにより動画URLをリクエストをされた時だけkubernetesにPodをスケジュールするため、基本的に動作リソースはmetricsサーバのみです。
リクエスト数頻度に合わせてPodのスケジュール数を変更するため、ピーク時に多くのPodを、リクエスト数が少ないときは少しずつ処理を実行します。
終わりに
一時期Knativeを学んでいたのですが、CNCFから外れるということで、KEDAに移りました。初めの頃はあまり理解できていなかったことも、きちんと使えるようになると色々わかってきていい感じです。
初めの章の説明ですが、私もサーバーレス初心者なので、なにか間違っていたり見当違いなことを言っているかもしれません。
なにかございましたら、よろしければご指摘いただいて、是非修正させてください。
参考
Discussion
本記事内の備考程度ではありますが、ここ最近は
mohsinonxrm
氏の精力的な行動によってarm用イメージが提供され、新しめなKEDAをRaspberryPiで動かせたりします。自分でビルドするのが億劫であれば彼のイメージをお借りして、以下を
apply -k
でも良いと思いました。文中のツール(
ydl-server
)で使われているKEDAの機能metrics-apiserver
についてはREADME.mdの方に書いてました、こっちに書けばよかった。今回はデプロイまでなので参考程度にどうぞ...!試せていないのですが、2022年5月、KEDAはv2.7からarmサポートされたようです。
まだやりたいことがあるので、KEDAについては今後また触れていこうと思います