Kubernetes Operator を理解する
Written by @ryysud Apr 14, 2019 00:00 · 1518 words · 4 minutes read
モチベーション
調べごとをしているときに、時折出てくる Kubernetes Operator という文言を見かけては、気にかけずスルーしてきたのですが、流石に理解しておかないとマズいなと思ったので、「Kubernetes Operator にはどんな役割があり、どんな課題を解決するものなのか?」を自分なりに噛み砕いてまとめてみました。
Kubernetes Operator とは?
Kubernetes Operator とは、ユーザーに代わりステートフルなアプリケーションを自動で管理する Custom Contoroller のことを指します。
元々は CoreOS が提唱したもので、k8s 上でアプリケーションを動かす際に、RESTful API などのステートレスなものは管理しやすいが、DB や Cache や Monitering などのステートフルなものは、以下のような各種アプリケーション固有の運用知識が求められ、人間が手動で管理するのは難しいという、k8s の課題を解決するために生まれたようです。
- データを欠損させない
- クラスタとしての可用性も担保する
- スケールした際に再設定も行う
各種アプリケーション固有の運用知識はプログラムとして落とし込み、人間は抽象化されたものを使いましょうという流れですね。
どのように実装するのか?
k8s における Resource とそれを Desired state に保つ Controller の概念と同じで、Kubernetes Operator にも専用の Custom Resource と Custom Controller を 定義/実装 する必要があります。
標準で組み込まれている k8s における Resource と Controller の対応を一部抜粋したものが以下となります。詳細は こちら を参照ください。
Resource | Contoller | Note |
---|---|---|
Node | Node Controller | - |
Endpoint | Endpoint Controller | - |
Pod Replica? | Replication Controller | 現在は非推奨で ReplicaSet の利用が推奨されている |
Pod, ReplicaSet, Deployment? | Deployment Controller | - |
Service Account | Service Account Controller | - |
API access token | Token Controller | - |
Custom Resource の定義方法
Custom Resource は、CRD を使って定義を行います。
※ CRD( Custom Resource Definition )= k8s の API を拡張して独自の Resource を定義する仕組み
Custom Controller の実装方法
Custom Controller は、k8s API を介して Custom Resource を Desired state に保つプログラムの実装を行います。
Go で kubernetes/client-go を使って、k8s API を触りながらフルスクラッチな実装も可能ですが、以下のようなサードパーティ製のものを使うと、比較的簡単に実装が行えるようです。
Custom Resource の状態を監視して、然るべきタイミングで然るべき処理が実行できれば良いので、kubectl と while を使ったシェルスクリプトでの実装方法を “シェルスクリプトで作る、ゆるふわ Kubernetes Operator” として公開されている方がいて、初学者の自分には大変参考になりました。
OSS として公開されている Kubernetes Operator
2019年3月から OperatorHub.io という Operator のパブリックレジストリが RedHat から公開されたので、そちらで確認できたものをピックアップしてみます。蛇足ですが、現在 Kubernetes Operator を提唱した CoreOS は RedHat 傘下です。
- AWS Service Operator
- etcd Operator
- Istio Operator
- MongoDB Operator
- Redis Operator
- Spark Operator
- Vault Operator
- etc…
Operator Framework で Awesome Operators in the Wild なども公開されているので、眺めてみると有用なものが見つかるかもしれません。
上記の Kubernetes Operator を k8s にデプロイすることで、任意のステートフルなアプリケーションを自動で管理することが可能になるということですね。
まとめ
ここまで調べてみて、特定のステートレスなアプリケーションの運用知識が k8s 上で自動で動くようにプログラムされたものが Kubernetes Operator で、Kubernete Operator は Custom Resource と Custom Controller から構成されていることが理解できました。今回深掘りできなかった箇所を補うためにも、時間があるときに、いくつか主要な Kubernetes Operator を動かして恩恵を感じてみたり、自ら Kubernetes Operator を実装してみたりしたいと思います。
参考資料
- Kubernetes Operator - Qiita
- Introducing Operators: Putting Operational Knowledge into Software - CoreOS Blog
- Operators - CoreOS Official
- Kubernetes Custom Resource, Controller and Operator Development Tools - admiralty.io
- ズンドコキヨシ with Kubernetes Operator - KubebuilderでKubernetes Operatorを作ってみた
- シェルスクリプトで作る、ゆるふわ Kubernetes Operator - Qiita
- Kubernetesアプリケーションの運用ツールポータル「OperatorHub.io」Red Hatが開始。
- Red Hat、Kubernetes Operator共有レジストリのOperatorHub.ioを開設