Operatorとは?
Operatorは、Kubernetesの拡張機能の一つです。
ステートフルなアプリケーションの運用を自動化するために数年前から注目を浴びています。
技術的にはCustom Resource Definition(CRD) + Custom Controllerの組み合わせで実現します。
Operator(CRD + Controller)を作るための方法は複数種類があります。
本記事では、それらの開発の概要を紹介します。
Operatorについての参考記事:
Kubernetes Operator
Operator Basic in CNDK2019
Operatorの開発方法まとめ
- Kubernetes Way(CRD + client-go, code-generator)で開発する
- Kubebuilderで開発する
- Operator SDKで開発する
- controller-runtime, controller-toolsを使う
- その他(kudo, meta-controllerなど)
5を除いて、順に説明していきます。
各ツールとライブラリの整理
Operatorを開発するためのツールやライブラリには非常に多くの種類があります。
さらにわかりにくいことに、ライブラリにも高レイヤのものと低レイヤのものがあります。
KubebuilderやOperator SDKなどのSDKとcontroller-runtimeやcontroller-tools, client-goなどのライブラリなどの関係性を図に表したものが下記です。
さらにもう少しSDKとライブラリの関係性を補足したものが下記です。
ここではローレベルなライブラリであるclient-goやcode-generatorの下に、各コンポーネント(Informer, Schemeなど)がありますが、ここでは無視して構いません。
Operator開発方法の概要
1. Kubernetes Way(CRD + client-go, code-generator)で開発する
client-goとcode-generatorは、Kubernetesの公式ライブラリです。
Kubernetes標準API Resource(Pod,Deployment,Serviceなど)やController(ReplicaSet Controller, Deployment Controllerなど)の開発にも使われています。
この開発方法の特徴としては、低レベルなAPIを活用して開発することになります。
そのため、初めて手を出すには他の方法と比べて難易度が高いです。
実際にOperatorを作る必要性にかられたとしても、おそらく他の方法を選択するケースがほとんどでしょう。
この開発方法のより細かい詳細を知りたい場合は、
ゼロから始めるKubernetes Controllerの資料がこの世で最も詳しいはずです。
2. Kubebuilderで開発する
KubebuilderはKubernetesコミュニティであるSIGsで開発されているOperatorを作るためのSDKです。
チュートリアルも整備されており、Operator開発を始めたい方に非常にオススメできるツールです。
1の方法と比べて格段に開発しやすくなっています。
逆にいうとKubebuilderやOperator SDKは1のKubernetes Wayを隠蔽している部分も多く、いざ開発するとあたかもオーパーツを扱っているかのような錯覚を受けるかもしれません(ここでは、原理が分からないのになぜか動く、という意味で書いています)
その際は1の方法の原理を見ていくと、疑問が氷解するはずです。
ゼロから始めるKubernetes Controllerが参考になります(2回目の登場ですが、宣伝したいわけではありません...他に選択肢がないだけです)。
3. Operator SDKで開発する
Operator SDKもKubebuilderと同じように、Operatorを開発を簡単にするためのSDKとして開発されています。
主にRed Hatが開発をサポートしています。
KubebuilderもOperator SDKも裏側は前述したcontroller-runtimeとcontroller-toolsを使っているので、どちらでも技術トランスファーは容易でしょう。
Red HatはOperator FrameworkというエコシステムでOperator Lifecycleを支援しているので、その恩恵を受けられます。
KubebuilderとOperator SDKのどっちがいいの? と思ったら、好きな方を選びましょう。
4. controller-runtime, controller-toolsを使う
これは上級編です。
KubebuilderやOperator SDKの根本ともいえる、controller-runtimeとcontroller-toolsを個別に使うことでもOperatorは作成できます。
KubebuilderやOperator SDKは、あくまでOperator作成に必要なファイル(goやyamlなど)のテンプレートを生成することが主目的です。
そのため、そうしたライブラリを使ってOperatorを自作することも可能です。
ただ、よほどのユースケースでなければオススメはしません(KubebuilderやOperator SDKを使いましょう)。
本格的にOperatorの開発を開始したい場合
Operatorを作るには、Reconciliation Loopを実装することになります。
名前の通り、Loopで実行するためのロジックを書くことになるので、プログラミング言語における"Hello World"にあたるものはありません。
そのため、Operatorを試しに作る、というのも初めて触る方には難しいかもしれません。
そんな人にオススメなのがSample Controllerです。
Sample ControllerはKubernetes公式で用意したサンプルのControllerです。
このリポジトリでは1のKubernetes Wayで書かれています。
このSample Controllerを試しにKubebuilderやOperator SDKで書いてみたい...!
でもどう書けばいいんだろう?
と思うかもしれません。
KubebuilderとOperator SDKでSample Controllerを再実装したリポジトリを用意していますので、こちらのリポジトリをご参照ください。
https://github.com/govargo/sample-controller-kubebuilder
https://github.com/govargo/sample-controller-operatorsdk
参考本
Kubernetes Controllerの低〜高ライブラリの説明から、Kubebuilder・Operator SDKでのSample Controller実装について一から説明している本を用意しているので、本格的にOperatorに入門したい方・興味がある方はご参照ください。
https://go-vargo.booth.pm/items/1574698
https://go-vargo.booth.pm/items/1566979
以上がOperator開発の前に知っておきたい知識についての説明でした。
参考になれば幸いです。