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

実例から学ぶ Kubernetes Custom Controller の状態管理

Takuya TAKAHASHI
November 22, 2022
570

実例から学ぶ Kubernetes Custom Controller の状態管理

CNDT2022 で発表した内容です

Takuya TAKAHASHI

November 22, 2022
Tweet

Transcript

  1. 1 実例から学ぶ Kubernetes Custom Controller の状態管理 GMO ペパボ株式会社 高橋 拓也

  2. 2 アジェンダ - 自己紹介 - Kubernetes Custom Controller の難しさ -

    状態管理の種類と実例紹介 - まとめ 2
  3. 3 自己紹介 3

  4. 4 高橋拓也 自己紹介 GMO ペパボ株式会社でインフラエンジニアをやっています。 コードを書くことと Kubernetes が好きです。 自宅サーバを飼っています。 Twitter:

    @takutaka1220 GitHub: takutakahashi 4
  5. 5 宣伝: GMOペパボでは CNDT 2022 で 5セッション登壇しています! 自己紹介 - 11/21

    (すべて終了) - Dynamic VM Scheduling in OpenStack by Kazuhiko Yamashita - k8s Operatorで運用負担減&ハイブリッドクラウドのコスト最適化をした話 by Chiaki Sugawara - 実例から学ぶ Kubernetes Custom Controller のステータス管理 by Takuya Takahashi - 11/22 Track F - [13:20-] ペパボのSREが生産性の向上を目指しCloud Nativeなチーム作り実践し た話 by Ryuichi Watanabe - [13:40-] しきい値監視からの卒業! Prometheus による機械学習を用いた異常検 知アラートの実装 by Takuya Takahashi 5
  6. 6 Kubernetes Custom Controller の難しさ 6

  7. 7 みなさん 7

  8. 8 カスタムリソース 使ってますか?? 8

  9. 9 カスタムリソースとは? カスタムリソース使ってますか? - Kubernetes の自作リソースを作成できる機能 - その機能で作られたサードパーティーなリソースのこと - `kubectl

    list|get|delete` などで操作できるようになる - 身近なクラスタで `kubectl get crd` を実行してみるとどうなりますか? 9
  10. 10 カスタムリソースとは? カスタムリソース使ってますか? 10 気づかぬうちに たくさん使っています

  11. 11 カスタムリソース 作ったことありますか? 11

  12. 12 カスタムリソースを作る カスタムリソース作ったことありますか? - kubebuilder を使うとかんたんに作成できる - zoetro さんの「つくって学ぶKubebuilder」がとても参考になる -

    https://zoetrope.github.io/kubebuilder-training/ - `kubectl get myresource` するだけでもテンション上がる 12
  13. 13 カスタムリソース きちんと実装できますか? 13

  14. 14 カスタムリソースとコントローラをセットで実装する カスタムリソースをきちんと実装できますか? - リソース単体だと etcd に格納されたデータでしかない - コントローラにより操作対象をリソースに沿った状態へ収束させる -

    とてもたいへん 14
  15. 15 コントローラ大変ポイント カスタムリソースをきちんと実装できますか? - テストを書くのが大変 - 複雑な処理を実装するのが大変 - 監視のためのメトリクスを実装するのが大変 15

  16. 16 コントローラ大変ポイント カスタムリソースをきちんと実装できますか? - テストを書くのが大変 - 複雑な処理を実装するのが大変 - 監視のためのメトリクスを実装するのが大変 16

  17. 17 複雑な処理を実装するのが大変 カスタムリソースをきちんと実装できますか? - 状態遷移が多い処理 - 様々な対象からデータを取得して目的の状態に収束する処理 17 A A’

    B C 目的
  18. 18 複雑な処理を実装するのが大変 カスタムリソースをきちんと実装できますか? - Reconciliation Loop を実装する必要がある - 何度もループを回して理想状態に収束させる動作 -

    今回は詳しい説明を割愛します 18
  19. 19 Reconciliation Loop カスタムリソースをきちんと実装できますか? - リソース内容に更新があるたびに Reconcile() が実行される - Reconcile

    の中でリソースの状態を更新する 19 controller.Reconcile() Resource 変更を検知 状態を更新
  20. 20 Deployment の挙動から見る 状態管理の難しさ 20

  21. 21 Deployment の挙動から見る実装の難しさ カスタムリソースをきちんと実装できますか? - ローリングアップデート難しすぎる - Pod の全体の一部の割合を順繰りに更新していくやり方 21

  22. 22 Deployment の挙動から見る実装の難しさ カスタムリソースをきちんと実装できますか? - ローリングアップデート難しすぎる 22 Deploy Deploy Pod

    A が アップデートされた
  23. 23 Deployment の挙動から見る実装の難しさ カスタムリソースをきちんと実装できますか? - ローリングアップデート難しすぎる 23 Deploy Deploy 次のアップデート対象が

    Bなのでアップデートする
  24. 24 Deployment の挙動から見る実装の難しさ カスタムリソースをきちんと実装できますか? - ローリングアップデート難しすぎる 24 Deploy Deploy B

    が消えちゃった!
  25. 25 Deployment の挙動から見る実装の難しさ カスタムリソースをきちんと実装できますか? - ローリングアップデート難しすぎる 25 Deploy Deploy B

    を作る? その場合バージョンは 何を使う??
  26. 26 Deployment の挙動から見る実装の難しさ カスタムリソースをきちんと実装できますか? - ローリングアップデート難しすぎる - Pod の更新有無の管理 -

    更新中の成否の管理 - イレギュラー時の処理の決定 - etc… 26
  27. 27 Deployment の挙動から見る実装の難しさ カスタムリソースをきちんと実装できますか? - ローリングアップデート難しすぎる - Pod の更新有無の管理 -

    更新中の成否の管理 - イレギュラー時の処理の決定 - etc… 27 これらをまとめて、 リソースの状態管理 と呼ぶことにします
  28. 28 状態管理の種類と 実例紹介 28

  29. 29 既存プロダクトはどうやって実装している? 状態管理の種類と実例紹介 - 以下の OSS の状態管理から実装を確認します - Deployment -

    https://github.com/cert-manager/cert-manager - https://github.com/rook/rook 29
  30. 30 Deployment の状態管理 30

  31. 31 Deployment はどうやっているのか 状態管理の種類と実例紹介 - Deployment は ReplicaSet を子リソースとして持つ -

    Deployment が直接 Pod を操作しているわけではない 31 Deploy Deployment RS 同一設定の Pod を複数起動する Pod の個数を制御する
  32. 32 Deployment はどうやっているのか 状態管理の種類と実例紹介 - ReplicaSet が個数の管理を実行する 32 replica: 3

    1個消えた
  33. 33 Deployment はどうやっているのか 状態管理の種類と実例紹介 - ReplicaSet が個数の管理を実行する 33 replica: 3

    replica: 3 1個立て直す
  34. 34 Deployment はどうやっているのか 状態管理の種類と実例紹介 - ReplicaSet 内は同じ設定の Pod が動いている 34

    replica: 3 全部 v0.1.0
  35. 35 Deployment はどうやっているのか 状態管理の種類と実例紹介 - ローリングアップデートは ReplicaSet (rs) をうまく使って実現している -

    アップデート前(old) と後(new) の設定の rs を持っている 35 Deployment old replica: 3 new new replica: 0
  36. 36 Deployment はどうやっているのか 状態管理の種類と実例紹介 - new rs の replicas を

    1にする 36 Deployment old replica: 3 new new replica: 1
  37. 37 Deployment はどうやっているのか 状態管理の種類と実例紹介 - new rs の replicas を

    1にする - rs が更新中の状態に遷移するので更新完了 (Ready) まで待つ 37 Deployment old replica: 3 new new replica: 1 Not Ready
  38. 38 Deployment はどうやっているのか 状態管理の種類と実例紹介 - old rs の replicas を

    2にする - old rs のステータスが Ready になるまで待機する 38 Deployment old replica: 2 new new replica: 1
  39. 39 Deployment はどうやっているのか 状態管理の種類と実例紹介 - 以下繰り返し 39 Deployment old replica:

    1 new new replica: 2 old replica: 2
  40. 40 Deployment はどうやっているのか 状態管理の種類と実例紹介 - 以下繰り返し 40 Deployment old replica:

    1 new new replica: 2
  41. 41 Deployment はどうやっているのか 状態管理の種類と実例紹介 - 以下繰り返し 41 Deployment old replica:

    0 new new replica: 3 old replica: 1
  42. 42 Deployment はどうやっているのか 状態管理の種類と実例紹介 - 以下繰り返し 42 Deployment old replica:

    0 new new replica: 3
  43. 43 Deployment はどうやっているのか 状態管理の種類と実例紹介 - RollingUpdate 中に Pod の削除が発生したら? 43

    Deployment old replica: 1 new new replica: 2
  44. 44 Deployment はどうやっているのか 状態管理の種類と実例紹介 - 削除された Pod が所属する rs が復旧を行う

    - old, new 両方が Ready になるまで RollingUpdate を中断する 44 Deployment old replica: 1 new new replica: 2 Ready Not Ready
  45. 45 Deployment はどうやっているのか 状態管理の種類と実例紹介 - もとどおりになったら処理を再開する 45 Deployment old replica:

    1 new new replica: 2 Ready Ready
  46. 46 単一責務パターン 状態管理の種類と実例紹介 - 責務の異なるリソースの階層構造になっている - 子リソースに責務を委譲しているといえる 46 Deployment ReplicaSet

    Pod App の更新を管理する 指定個数 Pod を作成する ワークロードを動かす
  47. 47 単一責務パターンのメリット 状態管理の種類と実例紹介 - Deployment は想定する ReplicaSet が作成できるかに特化すれば良い - 実装がシンプルに保てる

    - リソースのテストを記述しやすい 47
  48. 48 単一責務パターンのメリット 状態管理の種類と実例紹介 - 自作カスタムリソースに応用しやすい - ワークロードは Deployment を作成すれば状態管理に悩まない -

    複雑な状態管理は得意な他リソースを選定してやらせてしまえる - ロードバランシングが必要なら svc を作る 48
  49. 49 単一責務パターンのデメリット 状態管理の種類と実例紹介 - 結合テストは難しくなる - 作成した子リソースの設定は本当に想定した動きをするのか? - Pod に渡したコマンドライン引数でプロセスは起動するのか?

    - Pod が起動しなかった際のフォールバックはうまくいくのか? 49
  50. 50 単一責務パターンのデメリット 状態管理の種類と実例紹介 - 状態管理の実装の仕方を学習できない - 難しいところを他リソース任せにしてる - 実際どうやって状態を管理していくの? 50

  51. 51 Deployment まとめ 状態管理の種類と実例紹介 - 1リソースにつきひとつの責務を管理する単一責務パターン - 子リソースの通知する状態を監視することで状態を管理できる 51

  52. 52 cert-manager 52

  53. 53 cert-manager 状態管理の種類と実例紹介 - 証明書を管理、運用するプロダクト - ACME プロトコルを利用して Let's Encrypt

    の証明書を作りがち 53
  54. 54 cert-manager 状態管理の種類と実例紹介 - 複数の CRD (Custom Resource Definition) が連携している

    54 Certificate CertificateRequest Issuer ClusterIssuer Order Challenge
  55. 55 cert-manager 状態管理の種類と実例紹介 - Certificate は証明書の情報を持つリソース - Issuer から証明書作成に必要となる情報を参照する 55

    Certificate Issuer ClusterIssuer
  56. 56 cert-manager 状態管理の種類と実例紹介 - Certificate は CertificateRequest を作成する - CertificateRequest

    が完了するまで待機し、完了したら Secret を作る 56 Certificate CertificateRequest Issuer ClusterIssuer
  57. 57 Status.Conditions パターン 状態管理の種類と実例紹介 - 状態の確認には Status.Condition を使う - ↓Certificate

    の Condition の例 57 Certificate CertificateRequest
  58. 58 Status.Conditions パターン 状態管理の種類と実例紹介 - Condition は「特定の状態を確認する」目的で使う 58

  59. 59 Status.Conditions パターン 状態管理の種類と実例紹介 - 「カレー作り」を Condition で表現してみる 59 Type:

    にんじんが切られている Status: True Type: いもが切られている Status: True Type: 肉に火が通っている Status: True Type: 鍋に水が入っている Status: False 59 Type: 具材が煮込まれている Status: False Type: カレーが完成している Status: False ex: カレーを作るコントローラ カレー作りの工程を 表現する状態
  60. 60 Status.Conditions パターン 状態管理の種類と実例紹介 - 各状態を表す Condition を見て次の行動を決定する 60 Type:

    にんじんが切られている Status: True Type: いもが切られている Status: True Type: 肉に火が通っている Status: True Type: 鍋に水が入っている Status: False 60 Type: 具材が煮込まれている Status: False Type: カレーが完成している Status: False Next Action: 鍋に具材と水を入れて火にかける
  61. 61 Status.Conditions パターン 状態管理の種類と実例紹介 - 状態が変更されたら 61 Type: にんじんが切られている Status:

    True Type: いもが切られている Status: True Type: 肉に火が通っている Status: True Type: 鍋に水が入っている Status: True 61 Type: 具材が煮込まれている Status: False Type: カレーが完成している Status: False Next Action: 鍋に具材と水を入れて火にかける 水を入れた Next Action: 鍋に具材と水を入れて火にかける
  62. 62 Status.Conditions パターン 状態管理の種類と実例紹介 - 次の行動も状態を見て再度決定される 62 Type: にんじんが切られている Status:

    True Type: いもが切られている Status: True Type: 肉に火が通っている Status: True Type: 鍋に水が入っている Status: True 62 Type: 具材が煮込まれている Status: False Type: カレーが完成している Status: False Next Action: 鍋に具材と水を入れて火にかける 水を入れた
  63. 63 Status.Conditions パターン 状態管理の種類と実例紹介 - Certificate リソースはふたつの Condition Type を持つ

    - Ready … 処理が完了しているかどうか - Issuing … 処理中かどうか 63 CertificateConditionReady CertificateConditionType = "Ready" CertificateConditionIssuing CertificateConditionType = "Issuing" https://github.dev/cert-manager/cert-manager/blob/e7ed5c491be93b3c93ea236d02a455aa2d6cd00a/pkg/apis/certmanager/v1/types_certificate.go#L498-L516
  64. 64 cert-manager 状態管理の種類と実例紹介 - Issuing が True = 処理中である場合、新しい CertificateReuest

    を作る 64 if !apiutil.CertificateHasCondition(crt, cmapi.CertificateCondition{ Type: cmapi.CertificateConditionIssuing, Status: cmmeta.ConditionTrue, }) { return nil } // 省略 return c.createNewCertificateRequest(ctx, crt, pk, nextRevision, nextPrivateKeySecret.Name) https://github.dev/cert-manager/cert-manager/blob/e7ed5c491be93b3c93ea236d02a455aa2d6cd00a/pkg/controller/certificates/requestmanager/requestmanager_controller.go#L152-L229
  65. 65 cert-manager 状態管理の種類と実例紹介 - Certificate は証明書の再作成 (re-issue) も責務とする - 証明書の再作成が必要かどうかを監視している

    65 Certificate CertificateRequest Issuer ClusterIssuer Controller
  66. 66 cert-manager 状態管理の種類と実例紹介 - 証明書の再作成をする必要が出たら、Issuing = True にする - 状態収束に必要な処理がすべて動作する

    66 log.V(logf.InfoLevel).Info("Certificate must be re-issued", "reason", reason, "message", message) crt = crt.DeepCopy() apiutil.SetCertificateCondition(crt, crt.Generation, cmapi.CertificateConditionIssuing, cmmeta.ConditionTrue, reason, message) if err := c.updateOrApplyStatus(ctx, crt); err != nil { return err } c.recorder.Event(crt, corev1.EventTypeNormal, "Issuing", message) return nil } https://github.dev/cert-manager/cert-manager/blob/e7ed5c491be93b3c93ea236d02a455aa2d6cd00a/pkg/controller/certificates/trigger/trigger_controller.go#L200-L201
  67. 67 cert-manager 状態管理の種類と実例紹介 - Certificate は CertificateRequest (CR)を作成する - CR.Status.Conditions

    が Ready = True になっていたら Secret を作る 67 Certificate CertificateRequest Issuer ClusterIssuer
  68. 68 cert-manager 状態管理の種類と実例紹介 - CR は Order を作成する 68 Certificate

    CertificateRequest Order Issuer ClusterIssuer
  69. 69 cert-manager 状態管理の種類と実例紹介 - Order は Challenge を作成する 69 Certificate

    CertificateRequest Order Challenge Issuer ClusterIssuer
  70. 70 cert-manager 状態管理の種類と実例紹介 - 各 CRD の責務はこんな感じ - 子リソースの完了は子リソースの Conditions

    を確認する 70 Certificate CertificateRequest Order Challenge Issuer ClusterIssuer CR を作成する CR の完了を監視する Secret を作る renew を管理する Order を作成する Order の完了を監視する Challenge を作成する Challenge の完了を 監視する Challenge が失敗したら再 作成する ACME Challenge を 実行する
  71. 71 cert-manager まとめ 状態管理の種類と実例紹介 71 - Certificate を頂点とする階層構造を持つ - 状態管理は

    Conditions パターンを用いる - 親は子リソースの状態を Status.Conditions から取得する - コントローラは Condition の値を見て後続の処理を決定する
  72. 72 rook 72

  73. 73 rook 状態管理の種類と実例紹介 73 - Cloud Native なストレージクラスタオペレータ - k8s

    内で Ceph クラスタを管理する rook/ceph がメイン - 国内ではサイボウズさんが積極的に開発している
  74. 74 rook 状態管理の種類と実例紹介 74 - CephCluster リソースについて紹介します - Ceph のクラスタバージョンやプロセス個数などを管理する

    CephCluster
  75. 75 rook 状態管理の種類と実例紹介 75 - CephCluster も Condition を持つがほぼ参照されない! CephCluster

    Type: Progressing Status: True Type: Ready Status: False Progressing, Ready くらい
  76. 76 rook 状態管理の種類と実例紹介 76 - Message でどこまで処理が進んだかユーザーに通知する役割を持つ - Progressing Condition

    の Message を都度更新している CephCluster Type: Progressing Status: True Message: "Detecting Ceph version" Type: Ready Status: False
  77. 77 rook 状態管理の種類と実例紹介 77 - じゃあ状態はどうやって管理しているのか? CephCluster

  78. 78 rook 状態管理の種類と実例紹介 78 - 状態を管理していない!!

  79. 79 rook 状態管理の種類と実例紹介 79 - Operator の Reconcile 関数内ですべての手順を実行する -

    各手順が高度に冪等性が担保されており、何度実行されてもいい 1. initializeCluster() a. configureMonitoring() // クラスタの監視を起動する b. detectAndValidateCephVersion() // Ceph Cluster のバージョンを確認する c. reconcileCephDaemons() // Ceph のすべてのプロセスを理想状態にする i. mons.Start() // mon を開始する ii. mgrs.Start() // mgr を開始する iii. osds.Start() // osd を開始する
  80. 80 なぜ rook では状態を管理しない?(推測) 状態管理の種類と実例紹介 80 - CephCluster は1つの k8s

    クラスタに1組を想定している - 1リソースに使える処理時間が長い - CephCluster はデータの耐久性を何よりも重視している - 処理速度よりも安全な処理を選択したのでは? - ゆっくりと状態を確認しながら処理するほうがいい
  81. 81 なぜ rook では状態を管理しない? 状態管理の種類と実例紹介 81 - 状態管理しないためテストがかっこいい r :=

    &ReconcileConfig{ client: cl, context: c, config: controller.OperatorConfig{ OperatorNamespace: namespace, Image: "rook", ServiceAccount: "foo", }, } res, err := r.Reconcile(ctx, req) assert. NoError(t, err) assert. False(t, res.Requeue) }) https://github.dev/rook/rook/blob/3744a9d79576eab748aefb53f5465cd4cad0ab24/pkg/operator/ceph/controller_test.go#L73-L87
  82. 82 rook まとめ 状態管理の種類と実例紹介 82 - 状態管理しないという選択もある - 1リソースにかかる時間が増えても整合性を保ちたい場合おすすめ

  83. 83 まとめ 83

  84. 84 状態管理は難しい まとめ 84 - イチから実装するのはとても大変である - 広く使われているリソースの肩に乗ることで楽ができる - 既存の実装をよく観察することが大事

    - Conditions パターンはとても広く使われている
  85. 85 多くの自作コントローラを本番投入しながら学んでいます! まとめ 85 - 一緒にコントローラを開発して状態難しい〜をやりませんか!

  86. 86 We are HIRING !!! https://recruit.pepabo.com/ 86

  87. 87 oci-image-operator おまけ (というより没になったネタ 87

  88. 88 oci-image-operator 状態管理の種類と実例紹介 88 - 拙作プロダクト - git の更新をもとにイメージビルドをするワークフローを実行する -

    動作例: - branch1 への Push を検知する - branch1 の HEAD Revision をタグに持つイメージの存在チェック - 存在しなかったらイメージを作成、プッシュする
  89. 89 oci-image-operator 状態管理の種類と実例紹介 89 - Detected, Checked, Uploaded の3つの Condition

    Type がある - 検査対象のブランチやタグごとに Condition を持つ Image Type: Detected Target: branch1 Status: False Type: Checked Target: rev1 Status: False Type: Uploaded Target: rev1 Status: False ブランチの変更を 検知したか? 対象のイメージが レジストリに存在するか? 対象のイメージの プッシュに成功したか? git
  90. 90 oci-image-operator 状態管理の種類と実例紹介 90 - Image リソースが作成される Image git

  91. 91 oci-image-operator 状態管理の種類と実例紹介 91 - git リポジトリを監視するDeployment を作成する Image Deployment

    git
  92. 92 oci-image-operator 状態管理の種類と実例紹介 92 - 変更を検知したら Detected=True, Checked=False を設定する Image

    Deployment git Type: Detected Target: branch1 Status: True Type: Checked Target: rev1 Status: False
  93. 93 oci-image-operator 状態管理の種類と実例紹介 93 - レジストリにイメージがあるか確かめる Job が作成される Image Deployment

    git Type: Detected Target: branch1 Status: True Job registry Type: Checked Target: rev1 Status: False
  94. 94 oci-image-operator 状態管理の種類と実例紹介 94 - 結果を見て Uploaded の Condition をセットする

    Image Deployment git Type: Detected Target: branch1 Status: True Job registry Type: Checked Target: rev1 Status: True Type: Uploaded Target: rev1 Status: False
  95. 95 oci-image-operator 状態管理の種類と実例紹介 95 - Uploaded=False だったらビルドのための Job を動かす Image

    Deployment git Type: Detected Target: branch1 Status: True Job registry Type: Checked Target: rev1 Status: True Type: Uploaded Target: rev1 Status: False Job
  96. 96 oci-image-operator 状態管理の種類と実例紹介 96 - Check の Job がイメージの存在を確認したら Uploaded=True

    にする Image Deployment git Type: Detected Target: branch1 Status: True Job registry Type: Checked Target: rev1 Status: True Type: Uploaded Target: rev1 Status: True Job
  97. 97 oci-image-operator 状態管理の種類と実例紹介 97 - git のブランチの変更を検知すると Deployment が Condition

    を作成する - 以下繰り返し Image Deployment git Type: Detected Target: branch1 Status: True registry Type: Checked Target: rev2 Status: False Type: Uploaded Target: rev2 Status: False Type: Checked Target: rev2 Status: True Type: Uploaded Target: rev2 Status: True
  98. 98 oci-image-operator の状態管理の特徴 状態管理の種類と実例紹介 98 - CRD がひとつである - Condition

    がイメージのリビジョンごとに存在する
  99. 99 oci-image-operator の状態管理は成功したのか? 状態管理の種類と実例紹介 99 - 改善の余地がある Image Deployment git

    Type: Detected Target: branch1 Status: True Type: Checked Target: rev1 Status: True Type: Uploaded Target: rev1 Status: True
  100. 100 oci-image-operator の改善ポイント 状態管理の種類と実例紹介 100 - Detected の状態は必要ない Image Deployment

    git Type: Detected Target: branch1 Status: True Type: Checked Target: rev1 Status: True Type: Uploaded Target: rev1 Status: True True から 変更なし
  101. 101 oci-image-operator の改善ポイント 状態管理の種類と実例紹介 101 - Checked, Uploaded の役割が重複している -

    存在しない状態があり無駄 Image Deployment git Type: Detected Target: branch1 Status: True Type: Checked Target: rev1 Status: True Type: Uploaded Target: rev1 Status: True Checked = False Uploaded = True …?
  102. 102 oci-image-operator の改善ポイント 状態管理の種類と実例紹介 102 - Checked だけでよい Image Deployment

    git Type: Checked Target: rev1 Status: True
  103. 103 oci-image-operator の改善ポイント 状態管理の種類と実例紹介 103 - 変更を検知したら Checked=False の Condition

    を作成する Image Deployment git Type: Checked Target: rev1 Status: True Type: Checked Target: rev2 Status: False
  104. 104 oci-image-operator の改善ポイント 状態管理の種類と実例紹介 104 - イメージのワークフローは子リソースに切り出したほうがいい Image Ensure Ensure

    Git リポジトリを監視する 変更があったら Ensure を作 成する Check を作る Check の結果を見て Build を作 る Check Build
  105. 105 oci-image-operator まとめ 状態管理の種類と実例紹介 105 - 状態は少なければ少ないほどいい - リソースの役割は少ないほうがいい -

    役割が増えたら子リソースに切り出す
  106. 106 リソースの状態をうまく管理するには カスタムリソースをきちんと実装できますか? - Reconcilation Loop の根底にある考えを参考にする - 状態を検知し以降の処理を決定する Level

    Triggering を行う 106
  107. 107 Reconcilation Loop について参照 - https://deeeet.com/writing/2018/12/13/how-kubernetes-change-our-wa y-of-automation/ - https://zoetrope.github.io/kubebuilder-training/introduction/basics.html -

    https://hackernoon.com/level-triggering-and-reconciliation-in-kubernete s-1f17fe30333d - 107