コンテンツにスキップ

Custom Controller@カスタムリソース

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. Custom Controllerとは

カスタムリソースのための kube-controller に相当する。

ただし、kube-controller とは異なり Node 上で稼働する。

実体は Deployment や StatefulSet 配下の Pod であることが多い。


02. Custom Controllerの仕組み

アーキテクチャ

Custom Controller は、client-go コンポーネントと custom-controller コンポーネントから構成される。

kubernetes_custome-controller_architecture


client-goコンポーネント

▼ client-goコンポーネントの仕組み

リフレクター、インフォーマー、インデクサー、から構成される。

▼ リフレクター

kube-apiserver から Kubernetes リソースのマニフェストの変更を検知する。

また、変更内容に応じて作成した Kubernetes リソースの実体を Delta FIFO キューに格納する。

▼ インフォーマー

Delta FIFO キューから Kubernetes リソースの実体を取得する。

また、取得した実体をインデクサーを介して保管し、Kubernetes リソースの種類に応じてリソースイベントハンドラーをコールする。

▼ インデクサー

キャッシュとして、Kubernetes リソースの実体を Node のメモリ上に保管する。


custom-controllerコンポーネント

▼ custom-controllerコンポーネントとは

リソースイベントハンドラー、ワークキュー、アイテム処理、から構成される。

これらを組み合わせて、Reconciliation を実行する。

▼ リソースイベントハンドラー

記入中...

▼ ワークキュー

記入中...


03. reconciliation

処理の仕組み

custom_controller

(1)

Custom Controller は、kube-apiserver を介して、etcd に watch イベントを送信している。

(2)

カスタムリソースと CRD のマニフェストを何らかの方法 (例:kubectl apply コマンド、kubectl edit コマンドなど) で etcd 上に永続化したとする。

(3)

Custom Controller は、etcd 上でカスタムリソースと CRD のマニフェストを検知し、実際にカスタムリソースを作成/変更する。

クライアントからのマニフェストの作成/変更は、etcd 上のマニフェストの設定値を変更しているのみで、実際のカスタムリソースを作成/変更しているわけではないことに注意する。

その他、etcd 上のカスタムリソースに応じて、外部サービスの API (例:証明書の Fastly) をコールする。そして、カスタムリソースとペアになるもの (例:Fastly の証明書) も作成できる。

注意点として、CRD を削除すると kube-controller はカスタムリソースを削除する。

このとき CRD をあらためて作成しても、kube-controller はカスタムリソースを自動的に作成しない。

kube-controller に不具合があると、etcd 上の CRD の通りにカスタムリソースが作成されない。


reconciliationループ

kube-controller-manager は、Node にある Custom Controller を反復的に実行する。

これにより、カスタムリソースは CRD の宣言通りに定期的に修復される (reconciliation ループ) 。

ただし、Custom Controller 自体は kube-apiserver クライアント (例:kubectl クライアント、Kubernetes リソースなど) が作成する必要がある。


04. セットアップ

実装パターン

▼ 自前で実装する場合

Custom Controller を自前で実装する。

▼ OSSを使用する場合


05. Operatorパターン

Operatorパターンとは

Custom Controller を内蔵し、特定のカスタムリソースをセットアップする責務を持つ。


Operatorパターンの仕組み

▼ アーキテクチャ

Operator パターンは、カスタムリソース、Custom Controller の Operator、認可スコープ付与リソース、といったコンポーネントから構成されている。

kubernetes_operator_architecture

▼ Operator

Custom Controller として動作する。

Custom Controller と同様に、実体は Deployment や StatefulSet 配下の Pod であることが多い。

Operator がいる状況で、カスタムリソースと CRD のマニフェストを何らかの方法 (例:kubectl apply コマンド、kubectl edit コマンドなど) で etcd 上に永続化したとする。

すると Operator は、operator は etcd 上でカスタムリソースと CRD のマニフェストを検知し、実際にカスタムリソースを作成/変更する。

反対に、CRD を削除すると、Operator はカスタムリソースを削除する。

このとき CRD をあらためて作成しても、Operator はカスタムリソースを自動的に作成しない。

Operator に不具合があると、etcd 上の CRD の通りにカスタムリソースが作成されない。

Operator は関連するすべての CRD を要求し、たとえその CRD に対応するカスタムリソースを作成しないとしても、CRD だけは永続化しておく必要がある。(例:Prometheus 系の CRD をすべて作成しないと、PrometheusOperator がエラーになる)

kubernetes_operator-controller

▼ 認可スコープ付与リソース

Operator が kube-apiserver にリクエストを送信できるように、Operator に認可スコープを付与する。


Operatorパターンの例

OperatorHub で公開されている。

  • ArgoCDOperator
  • IstioOperator
  • PrometheusOperator
  • ...


06. Operatorのフレームワーク

KubeBuilder

記入中...


OperatorFramework

▼ OperatorFrameworkとは

Operator を開発するためのフレームワークのこと。

▼ Operator SDK

Operator を、開発、テスト、リリース、ために必要なツールを提供する。

▼ Operator Lifecycle Manager

Operator の、作成、削除を管理する。

▼ Operator Metering

記入中...