Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

2 アジェンダ - 自己紹介 - Kubernetes Custom Controller の難しさ - 状態管理の種類と実例紹介 - まとめ 2

Slide 3

Slide 3 text

3 自己紹介 3

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

6 Kubernetes Custom Controller の難しさ 6

Slide 7

Slide 7 text

7 みなさん 7

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

9 カスタムリソースとは? カスタムリソース使ってますか? - Kubernetes の自作リソースを作成できる機能 - その機能で作られたサードパーティーなリソースのこと - `kubectl list|get|delete` などで操作できるようになる - 身近なクラスタで `kubectl get crd` を実行してみるとどうなりますか? 9

Slide 10

Slide 10 text

10 カスタムリソースとは? カスタムリソース使ってますか? 10 気づかぬうちに たくさん使っています

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

12 カスタムリソースを作る カスタムリソース作ったことありますか? - kubebuilder を使うとかんたんに作成できる - zoetro さんの「つくって学ぶKubebuilder」がとても参考になる - https://zoetrope.github.io/kubebuilder-training/ - `kubectl get myresource` するだけでもテンション上がる 12

Slide 13

Slide 13 text

13 カスタムリソース きちんと実装できますか? 13

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

19 Reconciliation Loop カスタムリソースをきちんと実装できますか? - リソース内容に更新があるたびに Reconcile() が実行される - Reconcile の中でリソースの状態を更新する 19 controller.Reconcile() Resource 変更を検知 状態を更新

Slide 20

Slide 20 text

20 Deployment の挙動から見る 状態管理の難しさ 20

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

28 状態管理の種類と 実例紹介 28

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

30 Deployment の状態管理 30

Slide 31

Slide 31 text

31 Deployment はどうやっているのか 状態管理の種類と実例紹介 - Deployment は ReplicaSet を子リソースとして持つ - Deployment が直接 Pod を操作しているわけではない 31 Deploy Deployment RS 同一設定の Pod を複数起動する Pod の個数を制御する

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

35 Deployment はどうやっているのか 状態管理の種類と実例紹介 - ローリングアップデートは ReplicaSet (rs) をうまく使って実現している - アップデート前(old) と後(new) の設定の rs を持っている 35 Deployment old replica: 3 new new replica: 0

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

44 Deployment はどうやっているのか 状態管理の種類と実例紹介 - 削除された Pod が所属する rs が復旧を行う - old, new 両方が Ready になるまで RollingUpdate を中断する 44 Deployment old replica: 1 new new replica: 2 Ready Not Ready

Slide 45

Slide 45 text

45 Deployment はどうやっているのか 状態管理の種類と実例紹介 - もとどおりになったら処理を再開する 45 Deployment old replica: 1 new new replica: 2 Ready Ready

Slide 46

Slide 46 text

46 単一責務パターン 状態管理の種類と実例紹介 - 責務の異なるリソースの階層構造になっている - 子リソースに責務を委譲しているといえる 46 Deployment ReplicaSet Pod App の更新を管理する 指定個数 Pod を作成する ワークロードを動かす

Slide 47

Slide 47 text

47 単一責務パターンのメリット 状態管理の種類と実例紹介 - Deployment は想定する ReplicaSet が作成できるかに特化すれば良い - 実装がシンプルに保てる - リソースのテストを記述しやすい 47

Slide 48

Slide 48 text

48 単一責務パターンのメリット 状態管理の種類と実例紹介 - 自作カスタムリソースに応用しやすい - ワークロードは Deployment を作成すれば状態管理に悩まない - 複雑な状態管理は得意な他リソースを選定してやらせてしまえる - ロードバランシングが必要なら svc を作る 48

Slide 49

Slide 49 text

49 単一責務パターンのデメリット 状態管理の種類と実例紹介 - 結合テストは難しくなる - 作成した子リソースの設定は本当に想定した動きをするのか? - Pod に渡したコマンドライン引数でプロセスは起動するのか? - Pod が起動しなかった際のフォールバックはうまくいくのか? 49

Slide 50

Slide 50 text

50 単一責務パターンのデメリット 状態管理の種類と実例紹介 - 状態管理の実装の仕方を学習できない - 難しいところを他リソース任せにしてる - 実際どうやって状態を管理していくの? 50

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

52 cert-manager 52

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

54 cert-manager 状態管理の種類と実例紹介 - 複数の CRD (Custom Resource Definition) が連携している 54 Certificate CertificateRequest Issuer ClusterIssuer Order Challenge

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

56 cert-manager 状態管理の種類と実例紹介 - Certificate は CertificateRequest を作成する - CertificateRequest が完了するまで待機し、完了したら Secret を作る 56 Certificate CertificateRequest Issuer ClusterIssuer

Slide 57

Slide 57 text

57 Status.Conditions パターン 状態管理の種類と実例紹介 - 状態の確認には Status.Condition を使う - ↓Certificate の Condition の例 57 Certificate CertificateRequest

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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: カレーを作るコントローラ カレー作りの工程を 表現する状態

Slide 60

Slide 60 text

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: 鍋に具材と水を入れて火にかける

Slide 61

Slide 61 text

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: 鍋に具材と水を入れて火にかける

Slide 62

Slide 62 text

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: 鍋に具材と水を入れて火にかける 水を入れた

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

65 cert-manager 状態管理の種類と実例紹介 - Certificate は証明書の再作成 (re-issue) も責務とする - 証明書の再作成が必要かどうかを監視している 65 Certificate CertificateRequest Issuer ClusterIssuer Controller

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

70 cert-manager 状態管理の種類と実例紹介 - 各 CRD の責務はこんな感じ - 子リソースの完了は子リソースの Conditions を確認する 70 Certificate CertificateRequest Order Challenge Issuer ClusterIssuer CR を作成する CR の完了を監視する Secret を作る renew を管理する Order を作成する Order の完了を監視する Challenge を作成する Challenge の完了を 監視する Challenge が失敗したら再 作成する ACME Challenge を 実行する

Slide 71

Slide 71 text

71 cert-manager まとめ 状態管理の種類と実例紹介 71 - Certificate を頂点とする階層構造を持つ - 状態管理は Conditions パターンを用いる - 親は子リソースの状態を Status.Conditions から取得する - コントローラは Condition の値を見て後続の処理を決定する

Slide 72

Slide 72 text

72 rook 72

Slide 73

Slide 73 text

73 rook 状態管理の種類と実例紹介 73 - Cloud Native なストレージクラスタオペレータ - k8s 内で Ceph クラスタを管理する rook/ceph がメイン - 国内ではサイボウズさんが積極的に開発している

Slide 74

Slide 74 text

74 rook 状態管理の種類と実例紹介 74 - CephCluster リソースについて紹介します - Ceph のクラスタバージョンやプロセス個数などを管理する CephCluster

Slide 75

Slide 75 text

75 rook 状態管理の種類と実例紹介 75 - CephCluster も Condition を持つがほぼ参照されない! CephCluster Type: Progressing Status: True Type: Ready Status: False Progressing, Ready くらい

Slide 76

Slide 76 text

76 rook 状態管理の種類と実例紹介 76 - Message でどこまで処理が進んだかユーザーに通知する役割を持つ - Progressing Condition の Message を都度更新している CephCluster Type: Progressing Status: True Message: "Detecting Ceph version" Type: Ready Status: False

Slide 77

Slide 77 text

77 rook 状態管理の種類と実例紹介 77 - じゃあ状態はどうやって管理しているのか? CephCluster

Slide 78

Slide 78 text

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

Slide 79

Slide 79 text

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 を開始する

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

82 rook まとめ 状態管理の種類と実例紹介 82 - 状態管理しないという選択もある - 1リソースにかかる時間が増えても整合性を保ちたい場合おすすめ

Slide 83

Slide 83 text

83 まとめ 83

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

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

Slide 87

Slide 87 text

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

Slide 88

Slide 88 text

88 oci-image-operator 状態管理の種類と実例紹介 88 - 拙作プロダクト - git の更新をもとにイメージビルドをするワークフローを実行する - 動作例: - branch1 への Push を検知する - branch1 の HEAD Revision をタグに持つイメージの存在チェック - 存在しなかったらイメージを作成、プッシュする

Slide 89

Slide 89 text

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

Slide 90

Slide 90 text

90 oci-image-operator 状態管理の種類と実例紹介 90 - Image リソースが作成される Image git

Slide 91

Slide 91 text

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

Slide 92

Slide 92 text

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

Slide 93

Slide 93 text

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

Slide 94

Slide 94 text

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

Slide 95

Slide 95 text

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

Slide 96

Slide 96 text

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

Slide 97

Slide 97 text

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

Slide 98

Slide 98 text

98 oci-image-operator の状態管理の特徴 状態管理の種類と実例紹介 98 - CRD がひとつである - Condition がイメージのリビジョンごとに存在する

Slide 99

Slide 99 text

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

Slide 100

Slide 100 text

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 から 変更なし

Slide 101

Slide 101 text

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 …?

Slide 102

Slide 102 text

102 oci-image-operator の改善ポイント 状態管理の種類と実例紹介 102 - Checked だけでよい Image Deployment git Type: Checked Target: rev1 Status: True

Slide 103

Slide 103 text

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

Slide 104

Slide 104 text

104 oci-image-operator の改善ポイント 状態管理の種類と実例紹介 104 - イメージのワークフローは子リソースに切り出したほうがいい Image Ensure Ensure Git リポジトリを監視する 変更があったら Ensure を作 成する Check を作る Check の結果を見て Build を作 る Check Build

Slide 105

Slide 105 text

105 oci-image-operator まとめ 状態管理の種類と実例紹介 105 - 状態は少なければ少ないほどいい - リソースの役割は少ないほうがいい - 役割が増えたら子リソースに切り出す

Slide 106

Slide 106 text

106 リソースの状態をうまく管理するには カスタムリソースをきちんと実装できますか? - Reconcilation Loop の根底にある考えを参考にする - 状態を検知し以降の処理を決定する Level Triggering を行う 106

Slide 107

Slide 107 text

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