株式会社ユーザベースの技術チームブログです。(@skikkh)です。Kubernetesページに反映されていたことです。閑話休題、弊社SPEEDAサービスでは大量のバッチジョブがHinemosを起点としてVM上で動作しています。SREチームではこのようなジョブ群を徐々にサーバから切り離して、コンテナライズを進めています。環境変数と環境が異なると掛け算式に増えていきます。これをkubernetesのCronJobでyamlハードコーディングすると容易に1000行を超えてしまい、管理上のコストも含め現実的ではありません。1そこで、kubernetesパッケージマネージャーを使用することにしました。その選択肢としてはHelmやKustomizeなどがあります。これらを利用することで環境毎に異なる設定値のリソースが作成できたり、複雑な依存関係を持つkubernetesリソース群をChartという一つのフォーマットにまとめることができます。今回、要件を満たすエントリが見当たらなかった為、利用事例として投稿させていだきます。単一のリストを利用してCronJobをループ処理する複数のリストを利用してCronJobをループ処理するスケジュールの時間毎に、異なる地域のバッチジョブを実行するサブチャートを作成して、一連のワークフローを一つのChartで再現する個別のyaml設定の注意点フラグで実行するジョブバッチを選択する完成したvalues.yamlおわりに仲間募集Kustomizeの場合まずはKustomizeで同様の利用を想定した際の構成を見てみましょう。下記ディレクトリ構成は公式のKustomizeのGithubの、サンプルディレクトリ構成から拝借しました。production環境といった環境差分をoverlaysで表現するのはKustomizeの方がいいかもしれませんが、Kustomizeの基本的なユースケースに照らし合わせてジョブを作成するとなると、次の例ようにCronJob毎にディレクトリを切る必要があり、管理コストが嵩んでしまいます。Kustomizeで多数CronJobを作成する例えば24個のAジョブと24個のBジョブ計48個作成する場合、overlays下に48個のディレクトリ構成ができてしまいます。以下がサンプルになります。table.yamlバッチジョブが20を超えてくるとなるとディレクトリで分割するのは現実的に厳しいと思います。同一テンプレートからスケジュール毎に生成する以上の理由から、KustomizeではなくHelmを利用することを決めました。Helmの場合Helmではアクションと呼ばれる制御構造によってリストをループ処理することができます。したがって、今回のケースではこちらを採用することにしました。Tillerのバージョンはv2.14.3を使用しています。複数の地域情報を取り出し処理ができる2バッチジョブを作成する必要がありました。これを実現するためには先述したループ処理を行う必要があります。実現方法としては「ループ処理をネストすれば可能」というのが答えなのですが、少しだけハマりどころがあったので、それも合わせてお話できればと思います。通常のCronJobをループ処理する場合、values.yamlに回したい変数のリストを作成し、rangeを入れればループ処理が可能です。単一のリストを利用してCronJobをループ処理するまずはスケジュール毎にCronJobを作成したい場合を想定してみましょう。以下の実行例ではスケジュール毎にスケジュールのインデックスをechoで出力するという設定をyamlで行います。testを利用しましょう。テストで検証するのであれば、busyboxイメージでechoを出力します。}}因みにyamlの可読性の為、最初に以下のような代入を行っています。}}values.yamlの設定は以下のようになります。]特に難しい部分はなく、rangeアクションで作成したいCronJobを囲むだけです。一つ注意しないといけない点として、CronJobの名前は一意になるようにしなければいけません。その為、全ての名前が一意になるように命名規則を考えてつけましょう。基本的にはループで回す変数名をつけるようにすれば大丈夫だと思います。3作成後、以下のhelmコマンドを実行します。.これでテーブルの数だけジョブを回すことができるChartのリリースができますね。複数のリストを利用してCronJobをループ処理する一つの変数の条件でループ処理ができたので、複数の変数のリストを使用してループする場合を考えてみましょう。スケジュールのループ処理内にテーブルのループ処理をネストするだけで作成できます。記述例としては以下のようになります。runしかし、例のようにスケジュール×テーブルという変数でジョブを回そうとすると失敗してしまいます。以下が失敗の際に出力されるエラーになります。{}失敗の原因は.のカレントスコープが「.Values.global.schedules」を向いているためで、.Values.global.regionが習得できません。回避策としては、ループの処理の際に、「常にグローバルスコープを持つ$を使用する」ことでこのエラーを回避できます。したがって、以下のdiffの変更点のように最初の記述でループしたい変数を別の変数に代入することでスコープを変えないままネストしたループ処理ができるようになります。CronJobのリソース名も一意にするため、テーブルの名前を更新しておきましょう。名前を一意にするためしかし、これでもまだ十分ではありません。スケジュールのindexがほしいのではなく、スケジュール(cron)毎に習得される地域の変数をCronJobのmetadataや環境変数に代入したいのです。libraryを利用してリストを取得するようにしています。このような形にしたのは、複数のバッチジョブを後述するsubchartに記述する際、values.yamlをDRYにするためです。全てのリストを1つづつ取得する関数がなかったので、次のような形で再現しています。}}values.yamlにはglobal.regionsを、scheduleのリスト長と同一のリストを加えましょう。china]これで、地域別のDBのテーブルの情報が取得できるようになりましたね。サブチャートを作成して、一連のワークフローを一つのChartで再現する実際には上記のようなバッチジョブが後続に存在しているので、これらをひとまとまりにして扱う必要があります。最後に、これらバッチジョブをひまとまりにして処理する方法を学びましょう。複数のjob(Dockerイメージが別)を扱うためにsubchartを採用しました。ServiceAccount関連のリソースやNetworkPolicyやNamespaceのようなグローバルなリソースは大本のChartにまとめ、各ジョブをsubchartに入れるという形を取ります。values.yamlの項目で、globalの変数と、そうでないsubchart毎のローカル変数を使いわけることで実現できます。以下にサンプルのディレクトリ構成を挙げます。各サブチャート毎に分化されたschedulesはグローバルの設定ではなく、個別のジョブ毎のローカルの設定になるため、各subchart内では、.Values.global.schedulesから.Values.schedulesのようにグローバルのスコープをローカルのスコープに変更しておきましょう。}}フラグで実行するジョブバッチを選択する後でsubhart毎にテストをするには、個別のsubchartだけを実行する必要があります。そのため、enabledを各subchartに記述します。end}}values.yamlに以下の設定を入れます。xxx...実行時に不必要なジョブに対してfalseのフラグを立てることで個別実行が実現できます。.上記は0101-jobだけがChartだけがデプロイされる例になります。テストに関して1つ注意点があります。テストを行う毎はテストの実行ジョブの順番が変わるのでご注意下さい。5完成したvalues.yaml最終的なvalues.yamlは次のようになります。Chart化しました。その他ハマりどころとしてはvalues.yamlのsubchart名と一致しないChart名、ディレクトリ名になっているとチャートがデプロイされないという事例がありました。名前を変更した際には確認するようにしましょう。Resourcesなど省略しているので、それぞれの環境に合わせて設定していただればと思います。掲げて業務に取り組んでいます。「挑戦しなければ、SREではないし、SREがなければ、SPEEDAもない」という意識で、日々ユーザベースのMissionである、「経済情報で、世界をかえる」の実現に向けて邁進しています。Dockerネットワークの基礎こんにちは。SPEEDA開発チームの鈴木です。技術チームインターンの前田です。アプリケーションを開発して...2014-11-18CentOS7にLAMP環境を構築してWordpressをインストールするインターン生の阿達です。»プロフィール『経済情報で、世界を変える』をミッションに、企業・業界情報プラットフォーム「SPEEDA」やソーシャル経済ニュース「NewsPicks」、ABMを強力にサポートする「FORCAS」、スタートアップの情報収集を圧倒的効率化「entrepedia」などを提供する株式会社ユーザベースの技術チームブログです。多国通貨」をハンズオンしたら快適で楽しかったGo言語でオブジェクト指向プログラミングの基本(型編)月別アーカイブ検索@Uzabase_Techさんのツイートスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。