Windows 11でKestraを体験してみる

# はじめに
この記事ではWindows上で分散処理プラットフォームKestraを実行するため[公式サイト]( https://kestra.io/ "Kestra, an infinitely scalable orchestration and scheduling platform" ) の記述を参考にWSL2とDockerで環境を構築し、作業過程で躓いた点や気付いたことなどをメモしています。
インストール手順に関してはこちらの[Webサイト]( https://blog.ecbeing.tech/entry/2021/09/07/150000 "Windows 10 + WSL 2 でDocker環境を構築する（Docker Desktop有料化対策）")などを参考にしました。
参考サイトはWindows 10を対象にしているのでここではWindows 11で必要な作業だけ記述します。

# Kestraの概要
この記事を書いている2022.06.08の時点ではQiitaにKestraの情報が全く無かったので、最初にそもそもKestraとは何かについて簡単にご紹介します。

公式サイトの[What’s Kestra?]( https://kestra.io/docs/#what-s-kestra )からそのまま表現を借りると、Kestraは __複雑なパイプラインの構築、実行、スケジューリング、監視を支援するオーケストレーションとスケジューラのプラットフォーム__ です。
アーキテクチャとしてはApache KafkaとElasticSearchをベースとしていて、正式運用向けとしては図のように[Kubernetesが推奨環境](https://kestra.io/docs/administrator-guide/deployment/kubernetes/#deployment-on-kubernetes "Deployment on Kubernetes")となっていますが、手っ取り早く触ってみたい場合は今回ご紹介するようにDockerを使う事も出来ます。
![kestra_architecture](https://kestra.io/assets/img/architecture.8b7d9920.svg "Kestraのアーキテクチャ") ( https://kestra.io/docs/architecture/ より引用 )

Kestraではサービスのワークフローをyamlで記述します。
ワークフローは特定の実行環境に依存しない形で定義可能で、ワークフローの運用管理に関する
+ デプロイメント
+ スケーリング
+ モニタリング
+ エラー処理

等々のややこしい部分は全てKestraが処理してくれます。
公式サイトによるとKestraはスケーラビリティに上限が無いとの事なので、今回構築する最小構成の環境で記述したワークフローを大規模な分散環境にデプロイする事も簡単にできるのかもしれません。
スケーラビリティについては別の機会に試してみたいと思います。

# 環境構築
それではKestraを構築して、上記のようにKestraがいろいろやってくれるのを実際に見てみたいと思います。
公式サイトの[Getting-Started]( https://kestra.io/docs/getting-started/ )によるとDockerとDocker Composeを用意すれば後は数ステップで完了するようです。
Linuxマシンを用意するほどでも無さそうなのでWindows 11+WSL2をベース環境に選びました。

### WSL2へDebianをインストール
Windows 11ではWSL2を簡単に使えるようになっていて、管理者権限で起動したコマンドプロンプトやPowerShellから
```none
> wsl --install
```
を実行するだけでWSL2が有効になります。

次はDocker実行環境としてどのLinuxディストリビューションを選択するかですが、今回はDockerのインストールで参考にしたWebサイトに従ってDebianを選びます。
次のコマンドを実行するだけでDebianがインストールされます。
```none
> wsl --install -d Debian
```

それからこれは必須ではないですが、WSL2の環境を操作しやすくするために[Windowsターミナル]( https://docs.microsoft.com/ja-JP/windows/terminal/install )もインストールしておきます。
Windowsターミナルを入れておくとPowerShellやWSL2など複数のシェルをマウス操作で起動してタブで切り替える事が出来るのでとても便利です。

### Docker + Docker Composeをインストール

DockerをDebian上にインストールします。
WindowsのスタートメニューまたはWindowsターミナルからDebianを起動するとコマンドプロンプトが表示されるのでそこで以下のコマンドを実行していきます。

+ apt-getをアップデートしHTTPSリポジトリ使用を設定
apt-getは標準ではHTTPSトランスポートがインストールされないので2つめのコマンドを実行しておかないと後ではまります。
```bash
$ sudo apt-get update
$ sudo apt-get install apt-transport-https
$ sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
```

+ DockerのGPGキーを追加
```bash
$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/debian/gpg \
 | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
```
+ リポジトリをセットアップ
```bash
$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt-get update
```
+ Docker Engineをインストール
[Docker公式サイトの記載](https://docs.docker.com/engine/install/debian/#set-up-the-repository "Install Docker Engine")に従うとコマンド末尾のdocker-composeは**docker-compose-plugin**とするところなのですが、やってみるとエラーが出て進みません。
[こちらの情報](https://qiita.com/kawaichi0228/items/c5d2ea2bbe5d160d8491 "エラー `E: Unable to locate package docker-compose-plugin` の対処法")を参考に"-plugin"を削除して実行します。
```bash
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose
```
+ Docker Composeをアップグレード
デフォルトでインストールされるDocker ComposeだとKestraのdocker-compose.ymlが実行できないので別途適切なバージョンをインストールします。ここでは2022.06.08時点で最新の2.6.0を指定します。
```bash
$ sudo rm -f /usr/local/bin/docker-compose
$ sudo curl -L https://github.com/docker/compose/releases/download/v2.6.0/\
docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
```
+ 念のためバージョンを確認
```bash
$ docker-compose -v
Docker Compose version v2.6.0
```

+ sudoなしでのdockerコマンド実行権限を付与
```bash
$ sudo usermod -aG docker <USER>
```
　※ターミナルを再度起動した時から有効です。

これでKestraインストールの準備は完了です。

### Kestraをインストール
+ docker-compose.ymlをダウンロード
```bash
$ wget https://raw.githubusercontent.com/kestra-io/kestra/develop/docker-compose.yml
```
+ イメージをダウンロード
私の環境では数十分掛かりました。
```bash
$ docker-compose pull
```
+ サービスを起動
```bash
$ docker-compose up -d
```
### WEBコンソールを起動
Kestraは操作が全てWEBブラウザ上で行えるようになっています。
http://localhost:8080/
へアクセスすると次の画面が表示されます。
![Main.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2636033/81d42643-2a4c-43c0-e39c-97f50e5e2e92.png)


# Kestraを動かしてみる
Docker用Kestraにはサンプルのワークフローが多数登録されています。
その中の1つを使ってKestraの動作を見てみます。

### ワークフロー parallel を実行する
初期画面に一覧表示されているワークフロー(Flows)からparallelをクリックするとこのようなトポロジー図(Topology)が表示されます。
![parallel_topology.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2636033/9657400b-62cb-32be-26f0-ae808355d864.png)
このワークフローは左の始点から右の終点へ流れる途中でt1～t6の6つのタスクを並列実行するよう設計されています。

これを実行するにはメニューのExecuteを選択し、Executeボタンをクリックします。
![parallel_execute.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2636033/786592fc-a4c0-806f-ffcc-41dbf828c53f.png)
すると、画面がガントチャート(Gantt)に切り替わりワークフローの実行状態がリアルタイムで表示されます。
![マイビデオ1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2636033/b3af05f9-956a-0bdd-1edb-bf3c0da8a80e.gif)

![parallel_Gantt_for_AGIF.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2636033/398197b3-c13d-1683-1e70-e4b61847bb07.png)

トポロジー図で表現されていた通りにタスクt1～t6が全て完了した時点でタスクparentの実行が完了し、その後にタスクlastが実行された事が分かります。

### ワークフロー parallel を編集する
このワークフローに少し手を加えるため、右下のEdit flowボタンをクリックします。
![parallel_edit.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2636033/11965859-ec00-2e81-97f3-4344eabeafa5.png)
するとワークフローのソースコードが表示されます。
![parallel_source.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2636033/de39647e-cae9-7cef-5984-04e8729b1057.png)
タスクt6の定義をコピーして新たにタスクt7を作ってみました。
タスクの同時実行数(concurrent)が3に設定されているので、タスクt7は単独で実行されるはずです。
![parallel_7_source.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2636033/cf489605-8b8e-0815-212d-06060a70d07c.png)
右下のSaveボタンで保存します。
 ![parallel_save.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2636033/b08739bd-02cc-6b11-9936-905d5d5209cc.png)
 すると即座にトポロジー図に反映されます。
![parallel_7_topology.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2636033/e40bd1d1-1782-4c2c-3af7-fd86efe85ae1.png)
タスクt7が増えているのが分かります。

### 編集したワークフローを実行する
これを先ほどと同じように実行した結果がこちらのガントチャートです。
![parallel_7_gantt.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2636033/65a553fc-a021-a8b2-58b4-a3f71d302fe6.png)
予想通り concurrent: 3 の制約の下でタスクt7が単独で実行されています。

また、トポロジー図に実行結果が紐付けられているので
![parallel_7_execution_topology.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2636033/98f4fa2f-7689-f1d1-611d-b1133b4db4ad.png)
Show task logsをクリックすると各タスクの実行結果を表示することもできます。
![parallel_7_execution_task_log.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2636033/06237833-7123-a95d-bfb1-d54abfe2e3df.png)

Docker用Kestraにはparallel以外にも様々なワークフローのサンプルが登録されているので皆さんも試してみて下さい。

# まとめ
Kestraの環境を構築して触ってみて、ワークフローの作成や実行、モニタリングといった操作が簡単にできることを確認出来ました。
WSL2上のDockerに全てが収まる最小構成なのでスケーラビリティやデプロイメントの部分は試せませんでしたが、Kubernetesを使った本格的な分散環境についても別の機会に構築してみたいと思います。