Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Kubernetes上で単発のジョブを実行するkube-jobというツールを作った / kub...
Search
h3poteto
August 28, 2019
Technology
6
8.5k
Kubernetes上で単発のジョブを実行するkube-jobというツールを作った / kubernetesmeetuptokyo22
Kubernetes Meetup Tokyo #22 LT『Kubernetes上で単発のジョブを実行するkube-jobというツールを作った』
h3poteto
August 28, 2019
Tweet
Share
More Decks by h3poteto
See All by h3poteto
EKS on Fargateは最高のJob基盤 / jawsug_bgnr
h3poteto
1
1k
Electronによるアプリケーション開発事情2018 / builderscon2018
h3poteto
9
10k
fluentdサーバをchefで構築するの辛かったけどDockerも別に救世主じゃなかった / tokyu ruby kaigi 12
h3poteto
0
4.8k
ECSのサービスをslack botでデプロイする // ecs-goploy
h3poteto
1
5.5k
まだRailsで消耗してるの?
h3poteto
7
4.8k
阿澄佳奈と昇竜拳
h3poteto
1
520
Other Decks in Technology
See All in Technology
20251027_マルチエージェントとは
almondo_event
1
430
SRE × マネジメントレイヤーが挑戦した組織・会社のオブザーバビリティ改革 ― ビジネス価値と信頼性を両立するリアルな挑戦
coconala_engineer
0
250
コンパウンド組織のCRE #cre_meetup
layerx
PRO
1
270
OSSで50の競合と戦うためにやったこと
yamadashy
3
990
[VPoE Global Summit] サービスレベル目標による信頼性への投資最適化
satos
0
250
プロファイルとAIエージェントによる効率的なデバッグ / Effective debugging with profiler and AI assistant
ymotongpoo
1
160
Open Table Format (OTF) が必要になった背景とその機能 (2025.10.28)
simosako
2
200
IoTLT@ストラタシスジャパン_20251021
norioikedo
0
140
ゼロコード計装導入後のカスタム計装でさらに可観測性を高めよう
sansantech
PRO
1
440
可観測性は開発環境から、開発環境にもオブザーバビリティ導入のススメ
layerx
PRO
0
310
クラウドとリアルの融合により、製造業はどう変わるのか?〜クラスメソッドの製造業への取組と共に〜
hamadakoji
0
430
知覚とデザイン
rinchoku
1
580
Featured
See All Featured
Become a Pro
speakerdeck
PRO
29
5.6k
Done Done
chrislema
185
16k
The World Runs on Bad Software
bkeepers
PRO
72
11k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
The Cult of Friendly URLs
andyhume
79
6.6k
A Tale of Four Properties
chriscoyier
161
23k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1k
Why Our Code Smells
bkeepers
PRO
340
57k
Speed Design
sergeychernyshev
32
1.2k
Practical Orchestrator
shlominoach
190
11k
Designing for humans not robots
tammielis
254
26k
Transcript
Kubernetes 上で単発のジョブを実⾏す るkube-job というツールを作った Kubernetes Meetup Tokyo #22 @h3_poteto
⾃⼰紹介 Akira Fukushima ( 福島 明) GitHub: h3poteto twitter: h3_poteto
仕事: SRE / LAPRAS Inc. 2
Kubernetes 上でcron job を実⾏したい 3
ふつうCronJob を使いますよね? 4
でもRundeck を使いたい Rundeck OSS のジョブスケジューラ Rundeck プロセスからSSH して任意のインスタンスでジョブを実⾏す る スケジュールの書き⽅はだいたいcron
と同じ 失敗時の通知や再実⾏ができる 5
Rundeck を使いたい理由 ジョブの成功/ 失敗をSlack に通知したい ジョブの並列実⾏をしたい ログをWebUI 上で⾒られるようにしたい 元々Rundeck を使っていたので移⾏が楽
6
Kubernetes のCronJob 失敗時の再実⾏はできる Slack 通知は⾃分で作り込む必要がある ジョブの並列実⾏は⼀応できるが,パラメータを少しずつ変えた ジョブを並列実⾏したりはできない 7
Rundeck からKubernetes のJob を実⾏で きればよくね? 8
というわけで単発のジョブを実⾏できる CLI ツールを作った https://github.com/h3poteto/kube-job 9
やってほしいこと 1. ジョブを同期的に実⾏する 2. pod のログを標準出⼒に出してほしい 3. ジョブの定義⾃体は,予め⽤意したyaml を使って良い(ジョブ定義 に必要なパラメータを全てCLI
のパラメータで取るようなことはなし ない) 4. ジョブ定義の⼀部(args )を任意のコマンドで上書きした上でジョブ 実⾏したい 5. Job がFail したらコマンドもFail してほしい 6. 実⾏し終わったらJob/Pod を掃除しておいてほしい 10
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
kube-job を呼ぶ $ ./kube-job run \ --config=$HOME/.kube/config \ --template-file=./job.yaml \
--container="alpine" \ # <= ログを出したいコンテナを指定する --args="echo fuga" fuga 12
ジョブが失敗する場合 $ ./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
中⾝の話 golang で実装している client-go を使う clientcmd.BuildConfigFromFlags すれば $HOME/.kube/config をそのま ま使える
kubectl と同じように認証できる job.yaml は yaml.Unmarshal するだけで k8s.io/api/batch/v1.Job にパー スできる あとはArgs を上書きしてJobs.Create するだけ 14
ジョブを同期的に実⾏する Job をJobs.Create した後に,ジョブを定期的にポーリングする 数秒置きに Jobs.Get する Status.Active をチェックする これを繰り返し
Job が終了した場合 JobCondition に応じてツールを終了させる このときに終了したJob, Pods を削除する 15
ログの取得 Job のLabel を元にPods を探す 失敗してBackoff している可能性があるので常にPods を再取得し続 ける GetLogs
で k8s.io/client-go/rest.Request が取得できる これをStream するとio.ReadCloser が返る os.Stdout に io.Copy するとログが標準出⼒に出る 16
他の細かい機能とか Job 定義はローカルファイルだけでなくURL も指定できる GitHub のprivate repository も指定できる (personal access
token が 必要) Job 終了後の削除では,以下の挙動が選べる 成功時のみJob/Pods を削除する 失敗時のみJob/Pods を削除する 成功でも失敗でも関係なくJob/Pods を削除する 17
Rundeck で使う もはやRundeck からKubernetes のノードにSSH しても何もできない のでSSH はしない ローカルコマンドでkube-job を叩く
認証情報だけはRundeck のホストに保存しておく必要がある 18
副産物 デプロイ時にmigration を流したいような場合に便利 1. migration はコンテナを⼊れ替える前に⾏いたい 異様に重いクエリを流さなきゃいけない場合がある migration が失敗する場合,そこで中断してほしい 2.
migration が失敗した場合に,CI/CD の画⾯上にログが出るのは便利 19
まとめ client-go 使うとかなり⾃由度⾼く作れる kubectl と同じスキームで認証が通るので楽 ただし依存解決にglide を使う必要はある dep とか最近流⾏りのgo mod
は使えない 今の所上書きできるのはargs のみ.そのうち増やすかもしれない 20
この⼿のツールは検索するとかなり出てくるの でみんな結構⾃前で作ってる? 21