しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Container Service で作成した Kubernetes で Cron Jobs を使ってみる

Jobs はいまいち使いどころが分からなかったですが、Cron Jobs はいくらでも思いつくので実際に試しておきました。デフォルトでは有効化されていないので、ドキュメントに従って設定を追加する必要があります。

ちなみに Azure Container Service で作られる Kubernetes は 1.5 系です。

You need a working Kubernetes cluster at version >= 1.4 (for ScheduledJob), >= 1.5 (for CronJob), with batch/v2alpha1 API turned on by passing --runtime-config=batch/v2alpha1=true while bringing up the API server (see Turn on or off an API version for your cluster for more). You cannot use Cron Jobs on a hosted Kubernetes provider that has disabled alpha resources.

Cron Jobs | Kubernetes

Kubernetes の API server を起動する時のパラメータを追加すれば良いみたいですが、Azure Container Service で作成した Kubernetes の場合はマスターに接続して手動で変えるしか方法がありませんでした。

SSH で接続して /etc/kubernetes/manifests/kube-apiserver.yaml というファイルを直接編集します。

f:id:shiba-yan:20170508012308p:plain

kube-apiserver というコンテナの設定にコマンドを追加出来るようになっているので、最後に必要な設定を追加しておきました。反映させるのが面倒だったので、今回はマスターを再起動させました。

再起動後には kubectl やダッシュボードから Cron Job の追加が行えるようになっています。今回はテストなので専用のイメージを用意せずに試してみることにしました。

apiVersion: batch/v2alpha1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: microsoft/windowsservercore
            args:
            - cmd
            - /c
            - echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure
          nodeSelector:
            beta.kubernetes.io/os: windows

公式ドキュメントの YAML を Windows Server Core を使うように少し書き換えただけのものです。例によって nodeSelector を使って Windows を選ぶようにしておかないと辛いことになります。

作成した YAML をダッシュボードからアップロードして Cron Job を作成しました。前回は検証エラーが発生して作成できませんでしたが、今回は問題なく終了しました。

f:id:shiba-yan:20170508012642p:plain

Cron Jobs はダッシュボードから確認できないので、ここだけは kubectl を使って確認します。

f:id:shiba-yan:20170508011520p:plain

公式の YAML は 1 分間隔で起動するようになっていたのですが、Windows Server Core のダウンロードに時間がかかるため、Job と Pod が次々に作られてしまいました。この辺りは相変わらず罠ですね。

仕方ないので一度 Cron Job / Job / Pod を削除して、Windows Server Core をダウンロードさせることにしました。本来なら concurrencyPolicy で Forbit を選択するべきでした。

f:id:shiba-yan:20170508011635p:plain

適当に kubectl から Windows Server Core を使うデプロイメントを作成して、ダウンロードさせた後に再度 Cron Job を作成すると、今度は 1 分以内にコンテナが終了するようになりました。

Pod のステータスが完了になっているので、正常にコンテナが終了してることが分かります。

f:id:shiba-yan:20170508012731p:plain

各 Pod のログを確認すると、YAML に書いたメッセージがちゃんと出力されているので、Job が動作したことも確認できました。コンテナをステートレスにしておくと並列実行も容易ですね。

f:id:shiba-yan:20170508012754p:plain

定期的に実行される Job を扱うのは可用性やスケーラビリティの面で結構大変ですが、Kubernetes を使うことで特定のノードに依存することなく実行させることが出来るようになりそうです。

少しコンテナの起動に時間がかかっているのが気になりますが、これは VM サイズの問題な気もします。Windows Server Containers を使う場合には Premium Storage は必須でしょう。