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

緊急SOS!KubernetesのCompletedな10万Jobぜんぶ消す

 緊急SOS!KubernetesのCompletedな10万Jobぜんぶ消す

2023年ヒヤリハット大反省会@新宿 - connpass
https://findy.connpass.com/event/302579/

Hiroki Takatsuka

December 07, 2023
Tweet

More Decks by Hiroki Takatsuka

Other Decks in Programming

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  12. 異変③: 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  18. ● 愚直に “--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

    View full-size slide

  19. Completedな10万Jobぜんぶ消す
    19

    View full-size slide

  20. 30分後…
    21

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide