Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kubernetes上で単発のジョブを実行するkube-jobというツールを作った / kub...

h3poteto
August 28, 2019

Kubernetes上で単発のジョブを実行するkube-jobというツールを作った / kubernetesmeetuptokyo22

Kubernetes Meetup Tokyo #22 LT『Kubernetes上で単発のジョブを実行するkube-jobというツールを作った』

h3poteto

August 28, 2019
Tweet

More Decks by h3poteto

Other Decks in Technology

Transcript

  1. やってほしいこと 1. ジョブを同期的に実⾏する 2. pod のログを標準出⼒に出してほしい 3. ジョブの定義⾃体は,予め⽤意したyaml を使って良い(ジョブ定義 に必要なパラメータを全てCLI

    のパラメータで取るようなことはなし ない) 4. ジョブ定義の⼀部(args )を任意のコマンドで上書きした上でジョブ 実⾏したい 5. Job がFail したらコマンドもFail してほしい 6. 実⾏し終わったらJob/Pod を掃除しておいてほしい 10
  2. Job 定義を⽤意しておく # job.yaml apiVersion: batch/v1 kind: Job metadata: name:

    example-job spec: template: spec: containers: - name: alpine image: alpine:latest args: ["env"] # <= ここをCLI で上書き可能 env: - name: HOGE value: fuga restartPolicy: Never backoffLimit: 2 11
  3. kube-job を呼ぶ $ ./kube-job run \ --config=$HOME/.kube/config \ --template-file=./job.yaml \

    --container="alpine" \ # <= ログを出したいコンテナを指定する --args="echo fuga" fuga 12
  4. ジョブが失敗する場合 $ ./kube-job run \ --config=$HOME/.kube/config \ --template-file=./job.yaml \ --container="alpine"

    \ --args="hoge" container_linux.go:247: starting container process caused "exec: \"hoge\": executable container_linux.go:247: starting container process caused "exec: \"hoge\": executable container_linux.go:247: starting container process caused "exec: \"hoge\": executable FATA[0046] Job is failed: BackoffLimitExceeded exit status 1 $ echo $? 1 コマンドラインツールもexit 1 する 13
  5. 中⾝の話 golang で実装している client-go を使う clientcmd.BuildConfigFromFlags すれば $HOME/.kube/config をそのま ま使える

    kubectl と同じように認証できる job.yaml は yaml.Unmarshal するだけで k8s.io/api/batch/v1.Job にパー スできる あとはArgs を上書きしてJobs.Create するだけ 14
  6. ログの取得 Job のLabel を元にPods を探す 失敗してBackoff している可能性があるので常にPods を再取得し続 ける GetLogs

    で k8s.io/client-go/rest.Request が取得できる これをStream するとio.ReadCloser が返る os.Stdout に io.Copy するとログが標準出⼒に出る 16
  7. 他の細かい機能とか Job 定義はローカルファイルだけでなくURL も指定できる GitHub のprivate repository も指定できる (personal access

    token が 必要) Job 終了後の削除では,以下の挙動が選べる 成功時のみJob/Pods を削除する 失敗時のみJob/Pods を削除する 成功でも失敗でも関係なくJob/Pods を削除する 17