KubernetesのJobを管理するカスタムコントローラーを作成した

KubernetesのJobは完了しても登録したJobは削除されず kubectl get job などを実行したときの視認性がよくありません。
これを解消するための設定として .spec.ttlSecondsAfterFinished がありますが、長いことalpha版でGKEでは使用することができません。

単純に消すだけであればclient-goを使って書いたスクリプトをCronJobで定期実行すればよさそうですが、カスタムコントローラーを作ってみたかったため akaimo/job-observer というコントローラーを作成してみました。

akaimo/job-observer

カスタムコントローラーを作るにあたっていくつかの方法がありますが、Kubernetes本体のことも知りたかったため、本家のコントローラーと同様のアプローチである k8s.io/code-generator を使って作成しました。

インストール方法

デフォルト設定のコントローラーをインストールする場合は以下の一行を実行するだけです。

$ kubectl apply -f https://raw.githubusercontent.com/akaimo/job-observer/master/bundle.yaml

これはhelmのtemplateコマンドで出力したものなのでカスタマイズができます。
現状はあまり多くのことはできませんが...

カスタムリソース

Cleaner リソースでPodの停止から任意の時間が経過したJobを削除することができます。

apiVersion: job-observer.akaimo.com/v1alpha1
kind: Cleaner
metadata:
  name: my-cleaner
spec:
  ttlAfterFinished: 1m
  cleaningJobStatus: Complete
  selector:
    matchLabels:
      app: my
      version: mikan

削除対象を絞り込むことができ、ServiceでPodを指定するときと同じ方法でLabelを使って選択できます。
また、Jobの終了ステータスで指定することもできます。

Cleaner リソースを複数個登録することで、対象の条件ごとに削除までの期間を指定できます。
例えば、成功したJobは1h、失敗したJobは24hといったような指定ができます。

今後について

今の所、わざわざコントローラーを入れるほどの内容ではないというのが正直なところです。

コントローラーを作成することにもなれてきたので、Jobの終了時にSlackなどに通知する機能を追加してみようかと考えています。