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

KubeCon EU 2025 Recap - Kubernetes CRD Design f...

KubeCon EU 2025 Recap - Kubernetes CRD Design for the Long Haul: Tips, Tricks, and Lessons Learned / Kubernetes Meetup Tokyo #70 / k8sjp70-crd-long-haul-recap

Avatar for Shingo Omura

Shingo Omura

May 19, 2025
Tweet

More Decks by Shingo Omura

Other Decks in Technology

Transcript

  1. Kubernetes CRD Design for the Long Haul: Tips, Tricks, and

    Lessons Learned Christian Schlotter, Broadcom & Fabrizio Pandini, VMware by Broadcom Shingo Omura @everpeace Kubernetes Meetup Tokyo #70 https://speakerdeck.com/everpeace/k8sjp70-crd-long-haul-recap KubeCon + CloudNativeCon Europe 2025 Recap Icons made by Freepik from www.flaticon.com スライド youtube
  2. @everpeace Shingo OMURA / @everpeace ▶ AI Platform Engineer @

    LINEヤフー株式会社 ▶ ex-Woven By Toyota, ex-PFN ▶ 主な活動SIG: sig-node, sig-scheduling ◦ KEP-3619: Fine-grained supplemental groups control (Beta) ◦ KEP-5055: DRA: device taints and tolerations (Alpha)
  3. @everpeace なぜRecapするのか? • CRD/Operatorは一度は書いたことのある人は多いはず • でも長期にわたって互換性を保ちつつAPIを進化させるのは難しい • そのためのアンチパターン, Tips, ベストプラクティスが詰まっていた

    • Operator開発者として発表にとても感銘を受けた • 他のトピック(AIとかマルチクラスタとか)もあるけどなぜこれ? →より多くのKubernetes/Operator開発者に共有したいと感じた
  4. @everpeace (まとめ) 長期運用に耐えるCRD設計のアンチパターン/ベストプラクティス 🙅 アンチパターンと回避策 ◦ (Go) 外部APIの型を自分の型に埋め込む → 必要部分だけコピーして独自に進化させる

    ◦ (Go) 複数のCRDで同じ型を使い回す → 別々の型を定義する ◦ (生成) CRD Markerつけわすれ → Kubernetes API Linter(KAL)で予防 ◦ (生成) GitOps(SSA)フレンドリじゃないAPI → SSA Marker(+listType,+listMapKey)つける ◦ (Yaml) 汎用的すぎるフィールド名 → 具体的な名前 (❌ready, ⭕provisioned) ◦ (Yaml) Camelケース繋げすぎのフィールド名 → 階層化する (❌nodeDrainTimeout ⭕nodeDrain.timeout) 🙆 ベストプラクティス ◦ APIは上から読んでいって意味がわかるように設計する ◦ プロジェクト内の用語(Glossary)を定義して一貫性を持って使う ◦ Kubernetes API Linter(KAL)を使ってミスを予防 ◦ 非互換/非推奨リリース時のルールを守る ◦ ピアレビューを活用したり他のプロジェクトを参考にする c.f. Christian Schlotter and Fabrizio Pandini “Kubernetes CRD Design for the Long Haul: Tips, Tricks, and Lessons Learned,” KubeCon+CloudNativeCon Europe 2025
  5. @everpeace 🙅アンチパターン: 外部APIの型を自分の型に埋め込む(2) 🤔なぜだめ? • 不要なフィールドが紛れ込む • 一度入れてしまったらフィールド 削除難しい 💡どうする?

    • "Copy, adapt and evolve" • 必要なフィールドだけを持つ独自の 型を作って独自に進化させる (metav1.{Time,ObjectMeta}みた いなのは例外) 📝UpstreamでもObjectReferenceの新規利用は 非推奨
  6. @everpeace 🙅アンチパターン: CRD Markerつけ忘れ 🤔なぜだめ? • OptionalなのにOptionalじゃなくなる • Validationがない/中途半端 •

    validation系のMarker追加はBreaking Change 💡どうする? • Kubernetes API Linter(KAL)を 使って予防する
  7. @everpeace 🙅アンチパターン: GitOpsフレンドリーじゃないAPI(SSA Markerが適切じゃない) 🤔なぜだめ? • 例えばリスト(defaultは+atomic) • GitOpsしたリストフィールドに 別Controllerが上書き→GitOps→

    上書き→・・・ 💡どうする? • +listType=map,+listMapKey=name といったServerSideApply Markerを適 切つけて複数の主体が衝突なく更新でき るようにする