このトピックでは、Kubernetes 環境に SchedulerX エージェント をインストールし、ネイティブな Kubernetes Pod およびジョブをスケジューリングする方法について説明します。SchedulerX を使用すると、ジョブのステータスモニタリング、アラート機能、ログ収集、診断が可能です。
仕組み
次の図は、SchedulerX が Kubernetes ジョブをスケジューリングする仕組みを示しています。

次の表は、Kubernetes ジョブとスクリプトジョブの利用シーンを比較したものです。
|
シナリオ |
スクリプトジョブ |
Kubernetes ジョブ |
|
リソース消費が高く、実行頻度が低い。 |
推奨されません。各実行ごとに子プロセスをフォークすると、エージェントマシンのリソースを消費し、システムが過負荷になる可能性があります。 |
推奨されます。Kubernetes は独自の負荷分散戦略を使用して、各実行ごとに新しい Pod を起動するため、高い安定性を確保できます。 |
|
リソース消費が低く、実行頻度が高い。 |
推奨されます。子プロセスのフォークは高速でリソース効率が高いためです。 |
推奨されません。各実行ごとにイメージをプルして Pod を起動するのは遅いです。また、Pod やジョブをスケジューリングするために API サーバーを頻繁に呼び出すと、レート制限が発生する可能性があります。 |
|
依存関係の構築方法。 |
ECS インスタンスに事前に依存関係を手動でデプロイします。 |
ベースイメージに依存関係を組み込みます。依存関係が変更された場合は、ベースイメージを再ビルドする必要があります。 |
前提条件
SchedulerX に接続します。詳細については、「Kubernetes クラスターへの SchedulerX のデプロイ」をご参照ください。
Kubernetes ジョブの作成
シェルスクリプト
独自のイメージをビルドせずに Pod 内でシェルスクリプトを実行するには、[タスク] ページで Kubernetes ジョブを作成し、リソースタイプとして [Shell-Script] を選択します。デフォルトのイメージは BusyBox ですが、必要に応じて独自のイメージに置き換えることができます。
構成例: タスクタイプ を K8s に、リソースタイプ を Shell-Script に設定します。イメージ のデフォルト値は BusyBox です。スクリプトエディタに、echo hello schedulerx のようなシェルスクリプトの内容を入力します。
Run once をクリックします。Kubernetes クラスター内で、schedulerx-shell-{JobId} という名前の Pod が起動します。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
schedulerx-shell-xxx 1/1 Running 0 xxx
SchedulerX コンソールの Task Management ページで、実行履歴や Pod のログを確認できます。ログ出力エリアには、hello schedulerx のようなスクリプトの実行結果に加え、実行時間やステータスが表示されます。
Python スクリプト
独自のイメージをビルドせずに Pod 内で Python スクリプトを実行するには、[タスク] ページで Kubernetes ジョブを作成し、リソースタイプとして [Python-Script] を選択します。デフォルトのイメージは python ですが、必要に応じて独自のイメージに置き換えることができます。
構成例: タスクタイプ を K8s に、リソースタイプ を Python-Script に設定します。イメージ のデフォルト値は python です。スクリプトエディタに、print('hello schedulerx') のような Python スクリプトの内容を入力します。
Run once をクリックします。Kubernetes クラスター内で、schedulerx-python-{JobId} という名前の Pod が起動します。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
schedulerx-python-xxx 1/1 Running 0 xxx
SchedulerX コンソールの Task Management ページで、実行履歴や Pod のログを確認できます。手順はシェルスクリプトの場合と同じです。ログ出力エリアにはスクリプトの実行結果が表示されます。
PHP スクリプト
独自のイメージをビルドせずに Pod 内で PHP スクリプトを実行するには、[タスク] ページで Kubernetes ジョブを作成し、リソースタイプとして [Php-Script] を選択します。デフォルトのイメージは php:7.4-cli ですが、必要に応じて独自のイメージに置き換えることができます。
構成例: タスクタイプ を K8s に、リソースタイプ を Php-Script に設定します。イメージ のデフォルト値は php:7.4-cli です。スクリプトエディタに PHP スクリプトの内容を入力します。
Run once をクリックします。Kubernetes クラスター内で、schedulerx-php-{JobId} という名前の Pod が起動します。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
schedulerx-php-xxx 1/1 Running 0 xxx
SchedulerX コンソールの Task Management ページで、実行履歴や Pod のログを確認できます。手順はシェルスクリプトの場合と同じです。ログ出力エリアにはスクリプトの実行結果が表示されます。
Node.js スクリプト
独自のイメージをビルドせずに Pod 内で Node.js スクリプトを実行するには、[タスク] ページで Kubernetes ジョブを作成し、リソースタイプとして [Node.js-Script] を選択します。デフォルトのイメージは node:16 ですが、必要に応じて独自のイメージに置き換えることができます。
構成例: タスクタイプ を K8s に、リソースタイプ を Node.js-Script に設定します。イメージ のデフォルト値は node:16 です。スクリプトエディタに、console.log('hello schedulerx') のような Node.js スクリプトの内容を入力します。
Run once をクリックします。Kubernetes クラスター内で、schedulerx-node-{JobId} という名前の Pod が起動します。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
schedulerx-node-xxx 1/1 Running 0 xxx
SchedulerX コンソールの Task Management ページで、実行履歴や Pod のログを確認できます。手順はシェルスクリプトの場合と同じです。ログ出力エリアにはスクリプトの実行結果が表示されます。
Job-YAML
ネイティブな Kubernetes ジョブを SchedulerX で実行することもできます。その場合は、タスクタイプを K8s に、リソースタイプを Job-YAML に設定します。
構成例: タスクタイプ を K8s に、リソースタイプ を Job-YAML に設定します。YAML エディタに、apiVersion、kind、metadata、spec などのフィールドを含む標準的な Kubernetes ジョブ定義を入力します。
Run once をクリックします。ジョブとその関連 Pod が Kubernetes クラスター内で起動します。
$ kubectl get jobs
NAME COMPLETIONS DURATION AGE
schedulerx-xxx 1/1 xxx xxx
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
schedulerx-xxx 0/1 Completed 0 xxx
SchedulerX コンソールの Task Management ページで、実行履歴や Pod のログを確認できます。ログ出力エリアには、ジョブの実行結果、実行時間、ステータスが表示されます。
SchedulerX で Kubernetes ジョブを実行する際は、CronJob の使用は推奨されません。代わりに、SchedulerX 側でスケジュールを設定することで、各 Pod の実行履歴とログを確実に収集できます。
Pod-YAML
ネイティブな Kubernetes Pod を SchedulerX で実行することもできます。その場合は、タスクタイプを K8s に、リソースタイプを Pod-YAML に設定します。
構成例: タスクタイプ を K8s に、リソースタイプ を Pod-YAML に設定します。YAML エディタに、apiVersion、kind、metadata、spec などのフィールドを含む標準的な Kubernetes Pod 定義を入力します。
Run once をクリックします。Pod が Kubernetes クラスター内で起動します。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
schedulerx-xxx 1/1 Running 0 xxx
SchedulerX コンソールの Task Management ページで、実行履歴や Pod のログを確認できます。ログ出力エリアには、Pod の実行結果、実行時間、ステータスが表示されます。
SchedulerX を使用して Kubernetes Pod を実行する場合、Web アプリケーションなど、終了しない長期間稼働する Pod の実行は推奨されません。再起動ポリシーを Never に設定する必要があります。設定しない場合、Pod が継続的に再起動します。
環境変数によるジョブパラメーターの受け渡し
SchedulerX は、ジョブパラメーターを環境変数として注入できます。スクリプト、Pod、ジョブは、これらのパラメーターを環境から簡単に読み取ることができます。
この機能を利用するには、SchedulerX エージェントのバージョンが 1.10.14 以降である必要があります。
|
パラメーター |
説明 |
|
SCHEDULERX_JOB_NAME |
ジョブの名前。 |
|
SCHEDULERX_SCHEDULE_TIMESTAMP |
ジョブのスケジューリングタイムスタンプ。 |
|
SCHEDULERX_DATA_TIMESTAMP |
ジョブのデータタイムスタンプ。 |
|
SCHEDULERX_WORKFLOW_INSTANCE_ID |
ジョブがワークフローの一部である場合の、ワークフローインスタンス ID。 |
|
SCHEDULERX_JOB_PARAMETERS |
ジョブパラメーター。 |
|
SCHEDULERX_INSTANCE_PARAMETERS |
ジョブのインスタンスパラメーター。 |
|
SCHEDULERX_JOB_SHARDING_PARAMETER |
ジョブがシャーディングジョブである場合の、シャーディングパラメーター。 |
次の例は、SchedulerX ジョブパラメーターを取得する方法を示しています。
例: ジョブ構成の [ジョブパラメーター] フィールドに値を入力します。スクリプト内では、SCHEDULERX_JOB_PARAMETERS 環境変数を読み取ることで、この値にアクセスできます。たとえば、シェルスクリプトでは echo $SCHEDULERX_JOB_PARAMETERS を使用してパラメーターを出力できます。
メリット
ネイティブな Kubernetes ジョブ機能と比較して、SchedulerX を使用して Kubernetes ジョブをスケジューリングする場合、以下のメリットがあります。
オンラインでのスクリプト編集
Kubernetes ジョブの一般的なユースケースは、データ処理や運用タスクであり、これらは多くの場合スクリプトで実装されます。ネイティブなワークフローでは、スクリプトをイメージにパッケージ化し、YAML ファイルでコマンドを構成する必要があります。スクリプトを変更するたびに、開発者はイメージを再ビルドして再デプロイする必要があります。例:
apiVersion: batch/v1
kind: Job
metadata:
name: hello
spec:
template:
spec:
containers:
- name: hello
image: busybox
command: ["sh", "/root/hello.sh"]
restartPolicy: Never
backoffLimit: 4
SchedulerX で Kubernetes ジョブを管理する場合、イメージのビルドやスクリプトの構成のための YAML 記述は不要です。コンソール上で直接、シェル、Python、PHP、Node.js のスクリプトを編集でき、システムが自動的に Pod 内で実行します。スクリプトを更新するには、コンソール上で編集・保存するだけで済み、次回のスケジュール時に最新版のスクリプトが実行されます。これにより、Kubernetes ジョブの開発および管理効率が大幅に向上します。さらに、コンテナ関連の詳細を抽象化することで、コンテナサービスに詳しくない開発者でも Kubernetes を容易に扱えるようになり、生産性が向上します。
例:
SchedulerX コンソールのジョブ編集ページでは、スクリプトエディタ で直接スクリプトの内容を記述・修正できます。完了したら、[保存] をクリックします。最新版のスクリプトは、次回のスケジュール時に自動的に実行されます。
ビジュアルジョブオーケストレーション
Kubernetes エコシステムにおいて、Argo はワークフローオーケストレーションの一般的なソリューションです。例:
# 次のワークフローは、ダイヤモンド型ワークフローを実行します。
#
# A
# / \
# B C
# \ /
# D
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: dag-diamond-
spec:
entrypoint: diamond
templates:
- name: diamond
dag:
tasks:
- name: A
template: echo
arguments:
parameters: [{name: message, value: A}]
- name: B
depends: "A"
template: echo
arguments:
parameters: [{name: message, value: B}]
- name: C
depends: "A"
template: echo
arguments:
parameters: [{name: message, value: C}]
- name: D
depends: "B && C"
template: echo
arguments:
parameters: [{name: message, value: D}]
- name: echo
inputs:
parameters:
- name: message
container:
image: alpine:3.7
command: [echo, "{{inputs.parameters.message}}"]
SchedulerX のワークフロー機能を使用すると、ドラッグ&ドロップインターフェイスで Kubernetes ジョブをビジュアルにオーケストレーションできます。
Argo と比較して、SchedulerX はよりユーザーフレンドリな体験を提供します。ランタイム中は、ジョブの進捗状況を明確に追跡できるビジュアルワークフローグラフを表示するため、ボトルネックや失敗したタスクを簡単に特定・位置特定できます。
ワークフローインスタンスビューでは、各タスクノードのステータスに応じて色分け(例:成功は緑、失敗は赤)されるため、視覚的に障害箇所をピンポイントで特定できます。
モニタリングとアラート機能
Pod やジョブを SchedulerX でスケジューリングすると、内蔵のモニタリングおよびアラートシステムを利用して、ステータスの効率的な追跡や例外時のアラート通知が可能です。
-
サポートされているアラートチャンネル: SMS、電話、メール、Webhook(DingTalk、WeCom、Lark 対応)
-
サポートされているアラートポリシー: 失敗時アラート、実行タイムアウト時アラート
ログサービス
SchedulerX を使用して Pod やジョブをスケジューリングすると、Pod 実行中に生成されたログを自動的に収集します。追加のログサービスを有効にする必要はありません。Pod が失敗した場合、SchedulerX コンソールで直接詳細な失敗理由を確認・分析し、迅速にトラブルシューティングできます。
タスクインスタンスの詳細画面では、スタックトレースや失敗理由を含む、Pod 実行中に生成された完全なログを確認でき、問題の迅速な特定とデバッグに役立ちます。
モニタリングダッシュボード
SchedulerX を使用して Pod やジョブをスケジューリングすると、Prometheus などのサービスを有効にすることなく、内蔵のジョブモニタリングダッシュボードを利用できます。
モニタリングダッシュボードには、ジョブの実行回数、成功・失敗率、実行時間の推移などの主要メトリックが表示され、ジョブの運用状況をグローバルに把握できます。
混合ジョブデプロイメント
注文処理など、リアルタイム性能が求められるオンラインジョブでは、同一プロセス内で直接メソッドを呼び出して効率的に処理し、オンラインサービスとのシームレスな統合を実現できます。一方、定期的なレポートエクスポートなど、リアルタイム性の要求は低いもののリソースを大量に消費するオフラインジョブでは、スクリプトを記述して別の Pod で実行できます。SchedulerX プラットフォームは Java および Kubernetes の両ジョブタイプをサポートしており、オンラインおよびオフラインジョブのハイブリッドデプロイメントを実現し、多様な要件に対応できます。