銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

.NET Core コンソールアプリをOpenShiftのcronjobとして動かす

ひとりAdent Calendar13日目です。

adventar.org

昨日紹介したbinary artifactsのビルドを使って、.NET Core コンソールアプリをcronjobとして動かしてみます。

cronjobというのはその名の通り、Linuxのcronのようにコンテナを指定したスケジュールで定期実行できます。

Cron Jobs | Developer Guide | OpenShift Container Platform 3.11

このサンプルだと、perlというContainer Catalogで公開されているイメージを使っていますが、自分でビルドしてOpenShiftのdocker registryにpushしたイメージを指定することもできます。OpenShift 3.7以前はイメージのURLを直接指定する必要がありましたが、3.9以降はimagestreamで指定できるようになりました。

Managing Images | Developer Guide | OpenShift Container Platform 3.11

これを使って、.NET Console Applicationからイメージを作って実行することにします。今回はサンプルなので、デフォルトのConsoleプロジェクトのまま実行することにします。

$ dotnet new console --output csjob
$ cd csjob
$ dotnet publish -c Release /p:MicrosoftNETPlatformLibrary=Microsoft.NETCore.App

続いて昨日と同じようにbinary artifactsでイメージを作ります。

$ oc new-build --name=csjob1 dotnet:2.2 --binary=true

$ oc start-build csjob1 --from-dir=bin/Release/netcoreapp2.2/publish

これでImage StreamおよびImage Stream Tagが作られます。

$ oc get istag
NAME                        DOCKER REF                                                                                                          UPDATED
csjob1:latest               docker-registry.default.svc:5000/aspnetcore22/csjob1@sha256:77417...               About an hour ago

このImage Stream Tagをkubernetesのオブジェクトから参照できるようにするためにimage-lookupを設定します。

$ oc set image-lookup csjob1

これでcsjob1というimagesreamを参照できるようになったので、次のコマンドでcronjobを作成できます。デフォルトで.NET Coreのコンソールアプリが起動するのでcommandは指定しなくても大丈夫です。

$ oc run csjob1 --image=csjob1:latest --schedule='*/1 * * * *'     --restart=OnFailure --labels parent="cronjobcs"

jobが実行される様子はoc get pod -wなどで確認し、ログをoc log {pod名}で確認します。

f:id:tanaka733:20181210151241p:plain

このままだ延々とcronjobが実行され続けるので不要なjobは削除しておきましょう。

$ oc delete cronjob.batch/csjob1