はじめに
こんにちは、アソビューでSREをしている三森です。
今回はArgo Workflowsで残すアーカイブをジョブ毎に切り替える設定を入れたお話です。
アソビューでは、ジョブを定期実行する環境をArgo Workflowsで実行しています。 ちょうど、Kubernetes上でcronを実行するみたいな感じなのですが、これまで、Argo Workflowsで実行されたジョブの履歴(以降、アーカイブ)をすべて残す運用をしておりました。
しかし、少し前から管理コンソールでのアーカイブの表示が重たくなっており、さらにArgo Workflowsをv3.5.6へバージョンアップ後、 この表示時のDBサーバで利用するメモリ量がボトルネックとなってしまいました。
Argo Workflowsのアーカイブは、データベースの中にあるargo_archived_workflowsというテーブルにアーカイブを書き込みますが、 このアーカイブが200万行ほどとなっていてリスト化するSQLが負荷をかけている状態になってました。
目指したい姿
Argo Workflowsで実行しているジョブのうち、数分単位で実行されるアーカイブが大半を占めており負荷をかけていました。
ただ、運用上それらのアーカイブを見ることがなく、残さなくても問題ないと判断し、 その他デイリーやウィークリーで動いているジョブのアーカイブのみを残す状態を目指すことになりました。
具体的な実現方針としては、以下としました。
- kind:Workflowに特定のラベルをつけて、そのラベルに合致するものはアーカイブを1週間残す、そうでなければ残さない。
今回の設定では、以下のように実行中のジョブのyamlが、以下のようにラベルがある状態になっていることを目指しました。
なお、設定は以下を参考にしました。
次のセクションでは、今回の設定で必要な知識について触れます。
CronWorkflowとWorkflowTemplateについて
Argo WorkflowsでのWorkflowを管理するyamlがいくつかありますが、今回気にするのは以下の2つです。
WorkflowTemplate = Workflowのテンプレートです。Workflowで共通に設定したいものをここに書きます。
CronWorkflow = 上記のWorkflowの設定 + cronの設定になります。cronの設定とは、実行時間やタイムゾーンなどのcronの実行の制御に関わるものです。
WorkflowTemplateがWorkflowのテンプレートなのであれば、こちらにだけ記載すればWorkflowにもラベルがつくはずと思っていましたが、 実際にはラベルはつきませんでした。ただ、WorkflowTemplateから手動でWorkflowを実行するケースもあるかと思いますので、その場合こちらにもラベルをつける必要があります。
CronWorkflowにも同様の設定が必要のようです。
WorkflowMetadataについて
WorkflowMetadata はWorkflowに自動的にラベルをつけることができますが、 WorkflowTemplateとCronWorkflowの両方に使うことができます。 (Workflow Templateはこちら、CronWorkflowはこちらを参照)
archiveLabelSelectorについて
アーカイブを取得する判定として、workflow-controller-configmap.yamlに記載したラベルとWorkflowに付与されたラベルがマッチすることが判定条件となっております。ここから取得できるworkflow-controller-configmapにしか情報はありませんが、仕組みとしてはラベルセレクターを採用しているようです。
今回は、workflows.argoproj.io/archive-strategy: ”always”のラベルがついたWorkflowのアーカイブを残すようにしています。
具体的な設定&実行結果
以下は実際の設定に近いものです。 まずは、workflow-controller-configmap.yamlで以下を設定します。 ここでは、ラベルの値がalwaysになっているWorkflowのアーカイブを取得します。
次に、workflow templateです。
次に、CronWorkflowですが、アーカイブを残したい場合は以下のようにalwaysをつけます。
以下、アーカイブが残っています。(nameなどは伏せています)
ラベルで指定した文字列以外であればなんでもいいのですが、今回は、neverにしました。
以下、数分のラグはありますが、alwaysとは違い、アーカイブが残っていません。
感想
WorkflowTemplateのWorkflowMetadataにラベルを記載をして検証してみた時に、Workflowにはラベルが反映されると思っていましたが、 実際にはラベルは付与されなかったことはハマったポイントでした。ただ、今回の設定で必要なアーカイブのみ残せるようになりました。
このアーカイブ周りの設定は、具体的な説明がドキュメントに残されていなかったので、試行錯誤をしながら実際の挙動を把握するのに苦労しました。
ArgoWorkflowsのアーカイブは、量が多くなると色々と問題が出てくるので、アーカイブを取得する際はどの期間まで保持するかに加えて、 どのアーカイブを保持するかも検討した方がいいなと思いました。
最後に
アソビューでは「生きるに、遊びを。」をミッションに、一緒に働くメンバーを募集しています! ご興味がありましたらお気軽にご応募いただければと思います。