タスクについて
アプリ(長時間実行プロセス)とは対照的に、タスクは一定時間に実行されてから、停止します。タスクは親アプリの構成に基づいて独自のコンテナ内で実行されます。また、制限されたリソース(CPU / メモリ / エフェメラル ディスク ストレージなど)を使用するように構成することもできます。
タスクのユースケース
- データベースの移行
- バッチジョブの実行(スケジュールあり / スケジュールなし)
- メール送信
- データの変換(ETL)
- データの処理(アップロード / バックアップ / ダウンロード)
タスクの仕組み
タスクは親アプリや同じアプリで実行されるその他のタスクと非同期的かつ独立して実行されます。タスクの実行用に作成したアプリではルートの作成や割り当てがなされず、実行ライフサイクルはスキップされます。ソースコードのアップロードとビルドのライフサイクルはそのまま続行され、アプリを push した後、タスクの実行に使用されるコンテナ イメージが作成されます(アプリケーションのデプロイのアプリ ライフサイクルをご覧ください)。
タスクのライフサイクルは次のとおりです。
- タスクを実行するために、
kf push APP_NAME --task
コマンドを使用してアプリを push します。 kf run-task APP_NAME
コマンドを使用してアプリ上でタスクを実行します。タスクは、アプリにバインドされている環境変数、サービス バインディング、リソースの配分、起動コマンド、セキュリティ グループを継承します。- Kf がアプリからの値と
run-task
コマンドからのパラメータを使用して、Tekton PipelineRun を作成します。 - Tekton PipelineRun が、アプリとタスクの構成に基づいてコンテナを起動する Kubernetes Pod を作成します。
- タスクの実行が停止(タスクの終了、または手動での終了)し、基盤となる Pod も停止または終了します。停止したタスクの Pod は保持されるため、
kf logs APP_NAME --task
コマンドでタスクログにアクセスできます。 - タスクが停止する前に終了すると、Tekton PipelineRun がキャンセルされ(PipelineRun のキャンセルを参照)、基盤となる Pod もログとともに削除されます。終了したタスクのログは、Stackdriver や Fluentd などのクラスタレベルのロギング ストリームに配信されます(構成されている場合)。
- アプリで実行されるタスクの数が 500 を超えると、最も古いタスクが自動的に削除されます。
タスクの保持ポリシー
タスクは Kubernetes クラスタでカスタム リソースとして作成されるため、基盤となる etcd
データベースのスペースを占有しないようにすることが重要です。デフォルトでは、Kf はアプリごとに最新の 500 のタスクのみを保持します。タスクの数が 500 に達すると、最も古いタスクが基盤となる Pod とログとともに自動的に削除されます。
タスクのロギングと実行履歴
タスクが STDOUT や STDERR に出力するデータやメッセージは、kf logs APP_NAME --task
コマンドを使用して確認できます。クラスタレベルのロギング メカニズム(Stackdriver、Fluentd など)は、構成されたログの宛先にタスクログを配信します。
タスクのスケジュール設定
前述のように、タスクは kf run-task APP_NAME
コマンドで非同期に実行できます。また、kf create-job
コマンドでジョブを作成してから、kf schedule-job JOB_NAME
コマンドでジョブをスケジュールすることで、実行するタスクのスケジュールを設定することもできます。指定した unix-cron スケジュールでタスクが自動的に実行されるようにジョブをスケジュールできます。
タスクのスケジュール方法
タスクを実行するジョブを作成し、スケジュールを設定します。ジョブは、実行するタスクを記述し、タスクの作成を自動的に管理します。
タスクは、タスクの前の実行がまだ完了していなくても、スケジュールどおり作成されます。なんらかの理由で実行されなかった場合は、システムが回復したときに、最後に実行されなかった実行のみが実行されます。
ジョブを削除すると、関連付けられているすべてのタスクが削除されます。関連するタスクがまだ進行中の場合は、タスクが強制的に削除され、実行は完了しません。
スケジュールされたジョブによって作成されたタスクは、引き続きタスクの保持ポリシーの対象になります。
PCF Scheduler との違い
PCF Scheduler では、1 つのジョブに複数のスケジュールを作成できますが、Kf では 1 つのジョブに 1 つのスケジュールしか作成できません。PCF Scheduler と同じ動作を再現するには、スケジュールごとに 1 つのジョブを作成します。