Operatorの開発の始め方...の前に必要な知識

# Operatorとは？

Operatorは、Kubernetesの拡張機能の一つです。
ステートフルなアプリケーションの運用を自動化するために数年前から注目を浴びています。

技術的にはCustom Resource Definition(CRD) + Custom Controllerの組み合わせで実現します。

![crd_controller.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314463/69b1a0dc-3758-a25d-05a7-71494e67739d.png)

Operator(CRD + Controller)を作るための方法は複数種類があります。
本記事では、それらの開発の概要を紹介します。

> Operatorについての参考記事:
[Kubernetes Operator](https://qiita.com/shotat/items/4a60083fd20d11936860)
[Operator Basic in CNDK2019](https://speakerdeck.com/capsmalt/operator-basic-in-cndk2019)

# Operatorの開発方法まとめ

1. Kubernetes Way(CRD + client-go, code-generator)で開発する
2. Kubebuilderで開発する
3. Operator SDKで開発する
4. controller-runtime, controller-toolsを使う
5. その他([kudo](https://github.com/kudobuilder/kudo), [meta-controller](https://github.com/GoogleCloudPlatform/metacontroller)など)

5を除いて、順に説明していきます。

# 各ツールとライブラリの整理

Operatorを開発するためのツールやライブラリには非常に多くの種類があります。
さらにわかりにくいことに、ライブラリにも高レイヤのものと低レイヤのものがあります。

KubebuilderやOperator SDKなどの**SDK**とcontroller-runtimeやcontroller-tools, client-goなどの**ライブラリ**などの関係性を図に表したものが下記です。

![controller_method.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314463/9fae5411-95eb-5f24-0cb6-2e95b28e52b0.png)

さらにもう少しSDKとライブラリの関係性を補足したものが下記です。

<img width="904" alt="スクリーンショット 2019-11-29 21.37.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314463/101b776e-c5a2-7ae2-b3f7-7af38b634593.png">

ここではローレベルなライブラリであるclient-goやcode-generatorの下に、各コンポーネント(Informer, Schemeなど)がありますが、ここでは無視して構いません。

# Operator開発方法の概要

## 1. Kubernetes Way(CRD + client-go, code-generator)で開発する

[client-go](https://github.com/kubernetes/client-go)と[code-generator](https://github.com/kubernetes/code-generator)は、Kubernetesの公式ライブラリです。
Kubernetes標準API Resource(Pod,Deployment,Serviceなど)やController(ReplicaSet Controller, Deployment Controllerなど)の開発にも使われています。

この開発方法の特徴としては、低レベルなAPIを活用して開発することになります。
そのため、初めて手を出すには他の方法と比べて難易度が高いです。
実際にOperatorを作る必要性にかられたとしても、おそらく他の方法を選択するケースがほとんどでしょう。

この開発方法のより細かい詳細を知りたい場合は、
[ゼロから始めるKubernetes Controller](https://speakerdeck.com/govargo/under-the-kubernetes-controller-36f9b71b-9781-4846-9625-23c31da93014)の資料がこの世で最も詳しいはずです。

## 2. Kubebuilderで開発する

[Kubebuilder](https://github.com/kubernetes-sigs/kubebuilder)はKubernetesコミュニティであるSIGsで開発されているOperatorを作るためのSDKです。

チュートリアルも整備されており、Operator開発を始めたい方に非常にオススメできるツールです。
1の方法と比べて格段に開発しやすくなっています。

逆にいうとKubebuilderやOperator SDKは1のKubernetes Wayを隠蔽している部分も多く、いざ開発するとあたかもオーパーツを扱っているかのような錯覚を受けるかもしれません(ここでは、原理が分からないのになぜか動く、という意味で書いています)

その際は1の方法の原理を見ていくと、疑問が氷解するはずです。
[ゼロから始めるKubernetes Controller](https://speakerdeck.com/govargo/under-the-kubernetes-controller-36f9b71b-9781-4846-9625-23c31da93014)が参考になります(2回目の登場ですが、宣伝したいわけではありません...他に選択肢がないだけです)。

## 3. Operator SDKで開発する

Operator SDKもKubebuilderと同じように、Operatorを開発を簡単にするためのSDKとして開発されています。
主にRed Hatが開発をサポートしています。

KubebuilderもOperator SDKも裏側は前述したcontroller-runtimeとcontroller-toolsを使っているので、どちらでも技術トランスファーは容易でしょう。

Red Hatは[Operator Framework](https://github.com/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](https://github.com/kubernetes/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開発の前に知っておきたい知識についての説明でした。
参考になれば幸いです。