Argoでkubernetesのジョブ管理を導入してみた

先日作った下記のサイトですが小さいながk8sでジョブを動かしてます。

koduki.hatenablog.com

ジョブの構成は

  1. BTCの情報を収集
  2. 学習&予測
  3. スコアリング

の3種類で1 -> 2-> 3の順番に依存があります。で、2の部分は当然アルゴリズムを増やすと増えますし並列実行したくなりますね。 とりあえずはKNNしか入れてなかったのでシンプルにk8sのcronだけで作ってたのですが、流石に管理が面倒なので決定木のアルゴリズムを追加したのに合わせてジョブ管理ツールを導入するすることにして見ました。

今回使ったのは下記のArgo workflowというk8sネイティブのワークフローエンジンです。

argoproj.github.io

JenkinsやRundeckなど比較的手になじんだツールを使おうかとも思ったのですが、折角なのでk8sネイティブで新気鋭のこいつを使うことにしました。 いろんな設定が出来るんですが今回は単純にDAGで依存を付けただけです。

gist9327b361396b07a8e0040adcf6c24ce7

するとargo-uiからは以下のようなワークフローで確認できます。

f:id:pascal256:20180917095511p:plain

簡単ですね。

現時点ではArgo workflow自体はスケジューリングをサポートしてないのでそちらはk8sのcronジョブでjessesuen/argocliをベースに上記のyamlファイルをコンテナ内に入れてargo submitさせることで対応しています。

k8sをベースに作成してしてあるのでargoコマンドじゃ無くてそのままkubectlも使えたり、CPUやメモリのリソース制限やボリュームなどもそのまま利用できるので今後に結構期待のツールです。

まとめ

今回はとりあえず依存実行が欲しかったので入れただけですが、このツール自体は今後色々野心的なところを狙っていきそうなので期待大です。 テキストなのでDockerで管理しやすいのもGoodですね。

一方で、現時点ではargo-uiでは純粋に実行結果を見ることしかできなくて、実行前のネットワークの確認もできなかったり、1ファイルに書くというフォーマットでは、人間がわかる範囲で管理するのは大規模ジョブだと厳しいのかな、とも思ったり増します。 まあ、シェルかなんかで組み立てるなりやりようはありそうなのですけどね。何れにしても個人で使うには十分役立ちそうな感じです。

それではHappy Hacking!

参考