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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
h3poteto
August 28, 2019
Technology
8.9k
6
Share
Kubernetes上で単発のジョブを実行するkube-jobというツールを作った / kubernetesmeetuptokyo22
Kubernetes Meetup Tokyo #22 LT『Kubernetes上で単発のジョブを実行するkube-jobというツールを作った』
h3poteto
August 28, 2019
More Decks by h3poteto
See All by h3poteto
EKS on Fargateは最高のJob基盤 / jawsug_bgnr
h3poteto
1
1.1k
Electronによるアプリケーション開発事情2018 / builderscon2018
h3poteto
9
11k
fluentdサーバをchefで構築するの辛かったけどDockerも別に救世主じゃなかった / tokyu ruby kaigi 12
h3poteto
0
5.1k
ECSのサービスをslack botでデプロイする // ecs-goploy
h3poteto
1
5.8k
まだRailsで消耗してるの?
h3poteto
7
4.9k
阿澄佳奈と昇竜拳
h3poteto
1
550
Other Decks in Technology
See All in Technology
AsyncStreamでマルチブロードキャストを実装する
1mash0
1
120
そのSLO 99.9%、本当に必要ですか? 〜優先度付きSLOによる責任共有の設計思想〜 / Is that 99.9% SLO really necessary? Design philosophy of shared responsibility through prioritized SLOs
vtryo
0
810
JTCでRedmine利用者2700人を実現した手法 第二部
nobuonakamura
0
130
M&Aで増え続けるプロダクトに少数QAはどう立ち向かうか─GENDAが挑む、全員で取り組む品質標準化戦略 / GENDA Tech Talk #4
genda
0
120
「強制アップデート」か「チームの自律」か?エンタープライズが辿り着いたプラットフォームのハイブリッド運用/cloudnative-kaigi-hybrid-platform-operations
mhrtech
0
210
Cortex(Code) を ML モデルの 精度改善サイクルに組み込む.pdf
oimo23
0
150
AI時代に、 データアナリストがデータエンジニアに異動して
jackojacko_
0
1k
RedmineをAIで効率的に使う検証
yoshiokacb
0
140
マンション備え付けのネットワークとLTE回線を組み合わせた ネットワークの安定化の考案
harutiro
1
140
クラウドからエッジまで ~ 1,700台を支える監視設計~
optfit
0
110
なぜ、私がCommunity Builderに?〜活動期間1か月半でも選出されたワケ〜
yama3133
0
140
freeeで運用しているAIQAについて
qatonchan
1
640
Featured
See All Featured
Paper Plane
katiecoart
PRO
1
50k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.6k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.9k
Google's AI Overviews - The New Search
badams
0
1k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
230
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
550
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
180
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
530
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
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