Kubernetes Operator を理解する

Written by @ryysud

Apr 14, 2019 00:00 · 1518 words · 4 minutes read #kubernetes

モチベーション

調べごとをしているときに、時折出てくる 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 を実装してみたりしたいと思います。

参考資料