OpenShift3.11のCronJobを試す

# 変更履歴

`ConcurrencyPolicy` → `concurrencyPolicy`
頭文字が大文字「C」でもエラーはでませんが、オプションが効いていない状況になるそうです。
誤記申し訳ありません。




# はじめに

OpenShiftでPodを色々立ち上げてみてますが、
Cronが利用したくなるシーンがままありますよね(^_-)-☆

そんな訳で3.9以降で実装されているCronJobを試してみます！
Red Hat OpenShift 3.11 【[第38章 Cronジョブ](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/3.11/html/developer_guide/dev-guide-cron-jobs)】

# CronJobの定義

[RedHatのサンプル](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/3.11/html/developer_guide/dev-guide-cron-jobs)をカスタマイズして作成してみます。
今回はWordPressのバックアップJobを呼び出す設定にしてみます。
WordpressのバックアップJobのオプションはここでは記載しませんが、専用のURLをCallする形となります。


サンプルからの変更箇所は
　imageを`perl`から`busybox`にしてコマンドを修正してみました。 

```yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: wp-cron
spec:
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 3
  concurrencyPolicy: "Forbid"
  schedule: "*/30 * * * *"
  jobTemplate:
    spec:
      template:
        metadata:
          labels:
            parent: "wp-cron"
        spec:
          containers:
          - name: wp-cron
            image: busybox
            command: ["wget",  "--spider", "http://wordpress-wordpress.192.168.42.178.nip.io/wp-cron.php?_nonce=39f47013&backwpup_run=runext&jobid=1"]
          restartPolicy: OnFailure
```
- `successfulJobsHistoryLimit`...成功時の保持するJobの数（その分Podが生き続けます）
- `failedJobsHistoryLimit`...失敗時の保持するJobの数（その分Podが生き続けます）
- `concurrencyPolicy`...同時実行ポリシー
    - `Allow`...同時に実行します。
    - `Forbid`...同時実行を禁止し、直前の実行が終了していない場合は次の実行を省略します。
    - `Replace`...同時に実行されているジョブを取り消し、新規ジョブに置き換えます。
- `schedule`...Cron形式でスケジュールを登録します。

- busyboxの[最新版のマニュアル](https://busybox.net/downloads/BusyBox.html)にある`wget`のオプションは`-s`でしたが、OpenShiftに入っているbusyboxのバージョン的には`--spider`だったようです。

# Cronjobの登録

Overview画面でも何処でも良いので、`Import YAML/JSON`から登録します。
途中警告が表示されますが、**[Create Anyway]**で構わず登録

![無題5-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324255/4781222b-43a3-0bba-afbb-3850aee4529c.png)
![無題5-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324255/7dc83750-2718-26a1-83cb-e210af9dd2f2.png)
![無題5-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324255/8975cbe0-33c9-0835-9d39-7ff2a805b7e8.png)
![無題5-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324255/99761a34-8f38-577d-370c-4d3382ecb5ac.png)

# Cronjobの確認

登録したJobを確認したいのですが…okdのどの画面をみても登録したはずの`wp-cron`がない…(汗
初回登録した時間が来たので確認したらApplications > Podsにありました！

![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324255/455b306a-2b69-48c5-69cf-226a5310ccea.png)

CronJob名に定義した名前のPodをクリックすると詳細に飛びます。

![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324255/2a731fa9-a58f-6281-ee19-3d490e3957a3.png)

実行結果はLog画面を参照すると標準出力の結果が出ています。

![無題4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324255/5eb25ccd-4a9b-88ae-b144-2a33d9753bff.png)

夜間（AM3:00）にCronJobを仕込んで翌朝確認したらLogが
「**Logs are not available.**」
やっぱ``--spider``は良くなかったかな…（汗


ここでふと疑問に思ったことが…
CronJobを消すにはどうしたらいいのだろうか…

またokdの管理画面を探していくとRecources > Other Recourcesの中にjobなる文言が

![無題2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324255/e12f4322-499a-67c5-b7e5-397ba2c45145.png)
![無題2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324255/75df772f-e740-ec4b-d69e-a6a95a9c4d3b.png)
![無題2-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324255/8b33837e-be41-5320-9a4a-ec6c0e855344.png)

ここで消えそうな気もしますが…
次回実行タスクだけが消える気もしないでもない。

# Cronjobの変更

同じ名前でCronの時間のみを変更すると上書きするかどうか聞かれますので
`Replace`をクリックすればOkです。

![無題6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324255/b70d0128-b4e9-7535-8429-5c053a47b655.png)

# Cronjobの削除

GUIからできんのかいっ!!

```console
$ oc delete cronjob/<cron_job_name>
```

```console
[tak@minishift ~]$ eval $(minishift oc-env)
[tak@minishift ~]$ oc login
Authentication required for https://192.168.42.178:8443 (openshift)
Username: developer
Password: ********
Login successful.

You have one project on this server: "wordpress"

Using project "wordpress".
[tak@minishift ~]$ oc get cronjob
NAME       SCHEDULE    SUSPEND   ACTIVE    LAST SCHEDULE   AGE
wp-cron    */30 * * * *   False     0         41m             2h
wp-cron2   0 3 * * *   False     0         <none>          47m
[tak@minishift ~]$ oc delete cronjob/wp-cron2
cronjob.batch "wp-cron2" deleted
[tak@minishift ~]$ oc get cronjob
NAME      SCHEDULE    SUSPEND   ACTIVE    LAST SCHEDULE   AGE
wp-cron   */30 * * * *   False     0         41m             2h
[tak@minishift ~]$ 
```

# Cronjobのシステム全体での確認(要Admin権限)
基盤を守るうえではCronjobが乱立するのは避けたいですよね。
それに何処で何のCronjobが登録されているか把握しておきたいですよね。

そんな場合は、Admin権限で以下のコマンドを叩けばOKです。

```console
[tak@minishift ~]$ oc get --all-namespaces=true cronjob
NAMESPACE   NAME      SCHEDULE    SUSPEND   ACTIVE    LAST SCHEDULE   AGE
wordpress   wp-cron   */30 * * * *   False     0         1h              2h
```

minishiftでadmin権限って何!?って方はこちらを先にやってください。

```console
[tak@minishift ~]$ oc login
Authentication required for https://192.168.42.178:8443 (openshift)
Username: admin
Password: ********
Login successful.

Using "default".  You can switch projects with:

 'oc project <projectname>'
[tak@minishift ~]$ minishift addons enable admin-user
Add-on 'admin-user' enabled
[tak@minishift ~]$ minishift addons apply admin-user
-- Applying addon 'admin-user':..
```

# あれっ実行されない...
気をよくして実際にAM3:00にセットして翌朝を迎えましたが
実行されている気配がない

```yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: wp-cron
spec:
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 3
  concurrencyPolicy: "Forbid"
  schedule: "0 3 * * *"
  jobTemplate:
    spec:
      template:
        metadata:
          labels:
            parent: "wp-cron"
        spec:
          containers:
          - name: wp-cron
            image: busybox
            command: ["wget",  "--spider", "http://wordpress-wordpress.192.168.42.178.nip.io/wp-cron.php?_nonce=39f47013&backwpup_run=runext&jobid=1"]
          restartPolicy: OnFailure
```

色々試してみましたが...
ocコマンドでの確認はちゃんと出るのに時間指定すると実行されないようです(^^;

OKな場合

```yaml
  schedule: "*/30 * * * *"
```

```yaml
  schedule: "30 * * * *"
```

NGな場合

```yaml
  schedule: "0 3 * * *"
```

```yaml
  schedule: "0 03 * * *"
```

ここで、わたくし閃きました！**GMT**でした(笑)

AM3:00 JSTに走らせるためには-9:00して

```yaml
  schedule: "0 18 * * *"
```

が正解でした♪

```console
[tak@minishift ~]$ date
2019年  7月 16日 火曜日 09:55:17 JST
[tak@minishift ~]$ oc get --all-namespaces=true cronjob
NAMESPACE   NAME       SCHEDULE       SUSPEND   ACTIVE    LAST SCHEDULE   AGE
wordpress   wp-cron    55 0 * * *     False     1         22s             46m
```