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

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

Takuya TAKAHASHI
November 22, 2022
1.1k

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

CNDT2022 で発表した内容です

Takuya TAKAHASHI

November 22, 2022
Tweet

Transcript

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

    View full-size slide

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

    View full-size slide

  3. 3
    自己紹介
    3

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  6. 6
    Kubernetes
    Custom Controller の難しさ
    6

    View full-size slide

  7. 7
    みなさん
    7

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  30. 30
    Deployment の状態管理
    30

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  52. 52
    cert-manager
    52

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  80. 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

    View full-size slide

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

    View full-size slide

  82. 83
    まとめ
    83

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  88. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  93. 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

    View full-size slide

  94. 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

    View full-size slide

  95. 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

    View full-size slide

  96. 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

    View full-size slide

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

    View full-size slide

  98. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    Check
    Build

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  106. 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

    View full-size slide