Slide 1

Slide 1 text

緊急SOS! KubernetesのCompletedな10万Jobぜんぶ消す 株式会社primeNumber プロダクト開発本部 Head of SRE Hiroki Takatsuka (@tk3fftk) 2023年ヒヤリハット大反省会@新宿 1

Slide 2

Slide 2 text

目次 ● 自己紹介とtrocco®の紹介 ● 何が起こったか・どのように対応したか ● 学び ● まとめ 2 ※ タイトルは出オチで内容は寄せれませんでした()

Slide 3

Slide 3 text

目次 ● 自己紹介とtrocco®の紹介 ● 何が起こったか・どのように対応したか ● 学び ● まとめ 3

Slide 4

Slide 4 text

髙塚 広貴 (Hiroki Takatsuka) 株式会社primeNumber プロダクト開発本部 SRE 4 ● ヤフー株式会社 (2016 ~ 2022) ○ CI/CDプラットフォーム Screwdriver.cd の SREチームのEMやスクラムマスターなど ● 株式会社primeNumber (2022 ~ ) ○ trocco®のSRE ○ SREチームは現在2名 + 業務委託の方数名 ■ 会社全体だと約80名 ■ trocco®に関わるエンジニアは約15名 ● 猫 ○ アル (アビシニアン ♂ 3歳半)

Slide 5

Slide 5 text

trocco®とは 5 フルマネージド ETL/ELT 日本特有のサービスを含めた、約100種のコネクタに対応 データ分析基盤のための技術スタックを提供するサービスです。 GUI ワークフロー 複雑なデータ処理フローを GUI 上で設定・運用 データマネジメント機能 データリネージ / Git 連携・コード管理 / スキーマ追従 / データカタログ etc.

Slide 6

Slide 6 text

6 約100種のコネクタで データを整備・集約 データエンジニアが手を煩わせていた作業工程を、SaaS で簡単に巻き取ることが可能です。

Slide 7

Slide 7 text

目次 ● 自己紹介とtrocco®の紹介 ● 何が起こったか・どのように対応したか ● 学び ● まとめ 7

Slide 8

Slide 8 text

みなさん、Kubernetes使ってますか? ● trocco®もデータ転送ジョブの実行基盤としてKubernetes使ってます ○ 1データ転送ジョブに対して1Jobが起動します ■ データ転送ジョブ?って方はCIのジョブと読みかえてもらえると🙏 ○ 運用のご経験があると今日の話のヒヤリハット度の解像度があがるかも…? 8

Slide 9

Slide 9 text

事が起こったのはここ ● trocco®もデータ転送ジョブの実行基盤としてKubernetes使ってます ○ 1データ転送ジョブに対して1Jobが起動します ■ データ転送ジョブ?って方はCIのジョブと読みかえてもらえると🙏 ○ 運用のご経験があると今日の話のヒヤリハット度の解像度があがるかも…? 9

Slide 10

Slide 10 text

異変①: kubectl が “out of memory”で失敗する ● (のんきに記念書き込みをしてる場合ではなかった) ● でも〜 ○ 実行してるのリソースの少ない踏み台だし… ■ ラズパイとかでk8s動かしてるとまれによくみる ○ 毎回じゃないし… ○ やりたい操作はできてるし… 10

Slide 11

Slide 11 text

異変②: New Relicへのデータ転送量が急激に増えている ● でも〜 ○ 節約する修正を入れるもあまり効果はなし ○ 機能的にもアーキテクチャ的にも怪しい変更は無し 11

Slide 12

Slide 12 text

異変③: Cluster AutoscalerがOOMで何度も死んでる ● ● でも〜 ○ 最近他のコンポーネントのリソースも上げたから食い合ってるとか? ○ 過去にもOOMで死ぬことあったしまあリソース上げるしかないよね 12 $ kubectl get pods -n kube-system | grep auto cluster-autoscaler-58f96bd48c-cxbf8 1/1 Running 17 (8m8s ago) 31d cluster-autoscaler-58f96bd48c-fmpsw 1/1 Running 25 (6m24s ago) 31d cluster-autoscaler-58f96bd48c-lzs49 1/1 Running 63 (18m ago) 31d

Slide 13

Slide 13 text

異変④: k8s Jobお掃除CronJobが仕事をしていない疑惑 ● 通称: clean-job ● 大量にCompletedなJob(のPod)が残っている ○ 設定としては3分に一回実行し、CompletedになったJobを消しているはず ○ 時間がかかって3分ごとに実行できていない ● でも〜 ○ 全く消せてないわけではない ○ 消せないからといってゴミが残るだけでは? ○ エラー吐いてないし… 13

Slide 14

Slide 14 text

いや、さすがにさぼりすぎちゃう? ということで調査開始🔍 14

Slide 15

Slide 15 text

制限のある中で状況をざっくり把握する 15

Slide 16

Slide 16 text

踏み台からはOOMしてkubectlまともに叩けないのでPodから叩く ● 約13万Jobs… ● 参考: 2023/12時点の1日あたりの実行ジョブ ○ データ転送のみで17万 16

Slide 17

Slide 17 text

つまり ● 何らかの要因でCompletedなJobの定期削除が追いつかなくなっていた ● CompletedなPodはk8sの計算リソースは消費しないが、データとしては存在 ● 大量のCompletedなJob/Podがあることによりk8s APIで扱うデータが増える ① kubectlは “out of memory”で失敗する ② New Relicへのデータ転送量は急激に増える ③ Cluster AutoscalerはOOMする 17

Slide 18

Slide 18 text

● 愚直に “--field-selector” でフィルタしてのgetは非対応 ● でもdeleteなら ”--field-selector” でフィルタできるらしいという情報を得る ○ 検証したら実際できた (なんか裏技っぽいですよね) ○ ref: kubernetes - kubectl list / delete all completed jobs - Stack Overflow CompletedなJobをいい感じにフィルタして消したい… 18 ~ # kubectl get job --field-selector status.succeeded=1 Error from server (BadRequest): Unable to find "batch/v1, Resource=jobs" that match label selector "", field selector "status.succeeded=1": field label "status.succeeded" not supported for Job kubectl delete jobs --all-namespaces --field-selector status.successful=1

Slide 19

Slide 19 text

Completedな10万Jobぜんぶ消す 19

Slide 20

Slide 20 text

20

Slide 21

Slide 21 text

30分後… 21

Slide 22

Slide 22 text

New Relicへの転送量もがくっと下がったとさ🎉 22

Slide 23

Slide 23 text

目次 ● 自己紹介とtrocco®の紹介 ● 何が起こったか・どのように対応したか ● 学び ● まとめ 23

Slide 24

Slide 24 text

異変はスルーせず納得行くまで確認しよう ● 異変①〜④の事象を繋げて考えられなかった ● まず踏み台で今までkubectlができてたのができない、は怪しむべき ○ なにもしてないのにこわれました、はそうそう無いはず 24

Slide 25

Slide 25 text

● TTLAfterFinishedによるJob削除機能がk8s v1.23でstableになっている ○ Jobを終わった後に残したい時間を “.spec.ttlSecondsAfterFinished” に設定するだけ ○ これより前はclean-jobのような仕組みで掃除するしかなかったはず ● ネイティブの機能として実装されるのにはワケがある(はず)なので使うべき ● 「できること変わらないし優先度は低く」はバッドプラクティスっぽい󰢃 ○ ぼくがかんがえたさいきょうのソリューション()はやめよう ネイティブの機能を使おう 25

Slide 26

Slide 26 text

目次 ● 自己紹介とtrocco®の紹介 ● 何が起こったか・どのように対応したか ● 学び ● まとめ 26

Slide 27

Slide 27 text

まとめ ● 約10万Jobを一気に消した話でした ○ 気づいてなかったら色々爆発してた可能性 ○ CompletedなJobをぜんぶ消すには “$ kubectl delete jobs --all-namespaces --field-selector status.successful=1” だよ ● 異変はスルーせず納得行くまで確認しよう ● ネイティブの機能をできるだけ使おう 27

Slide 28

Slide 28 text

trocco®を一緒に創ってくれる方を探しています👀 ● 海外展開に向けて面白い経験ができると思うのでぜひ🙏 ○ trocco® SRE ○ trocco® ソフトウェアエンジニア ○ セキュリティスペシャリスト ○ その他募集一覧 👉 https://herp.careers/v1/primenumber ● primeNumber (trocco®) エンジニア採用サイトもオープンしました! 28

Slide 29

Slide 29 text

参考資料など ● kubernetes - kubectl list / delete all completed jobs - Stack Overflow ● Automatic Cleanup for Finished Jobs | Kubernetes ● Kubernetes で Complete/Failed となった Job を自動削除する #kubernetes - Qiita ● 池の水ぜんぶ抜く:テレビ東京 29