Operatorを作ってみる - helmチャートから生成する方法

KubernetesのOperatorとかCustom Controllerをいくつかの作り方を実際に試してみたいと思う。

まずはoperator-sdkを使ってhelmチャートからOperatorの雛形を生成する方法。

https://github.com/operator-framework/operator-sdk/blob/master/doc/helm/user-guide.md

上記はnginxの例だが、これを応用して、mackerel-agentをdaemonsetとして作成して維持してくれるOperatorを作ってみる。

operator-sdk new mackerel-operator-helm --api-version=kirishikistudios.com/v1alpha1 --kind=Mackerel --type=helm

これでyamlファイルの雛形が生成されるので、編集していく。

ᐅ tree
.
├── build
│   └── Dockerfile
├── deploy
│   ├── crds
│   │   ├── kirishikistudios_v1alpha1_mackerel_cr.yaml
│   │   └── kirishikistudios_v1alpha1_mackerel_crd.yaml
│   ├── operator.yaml
│   ├── role.yaml
│   ├── role_binding.yaml
│   └── service_account.yaml
├── helm-charts
│   └── mackerel
│       ├── Chart.yaml
│       ├── templates
│       │   ├── _helpers.tpl
│       │   └── daemonset.yaml
│       └── values.yaml
└── watches.yaml

1. CRDをデプロイする

kubectl create -f deploy/crds/kirishikistudios_v1alpha1_mackerel_crd.yaml

2. その他のリソースをデプロイする

kubectl create -f deploy/service_account.yaml
kubectl create -f deploy/role.yaml
kubectl create -f deploy/role_binding.yaml
kubectl create -f deploy/operator.yaml

この時点でOperatorのdeployment(pod)が立ち上がる。

ᐅ kubectl get pods --watch
NAME                                      READY     STATUS              RESTARTS   AGE
mackerel-operator-helm-86d4b65f5f-njqtz   0/1       ContainerCreating   0          6s
mackerel-operator-helm-86d4b65f5f-njqtz   1/1       Running   0         7s

3. CRをデプロイする

ᐅ kubectl create -f deploy/crds/kirishikistudios_v1alpha1_mackerel_cr.yaml
mackerel.kirishikistudios.com "example-mackerel" created

この後、mackerel-agentのDaemonSetが自動で起動する。

ᐅ kubectl get pods --watch
NAME                                                             READY     STATUS              RESTARTS   AGE
example-mackerel-gs6t9y101r2kac1982x9id4x-mackerel-agent-s5rn6   0/1       ContainerCreating   0          1s
mackerel-operator-helm-86d4b65f5f-njqtz                          1/1       Running             0          16s
example-mackerel-gs6t9y101r2kac1982x9id4x-mackerel-agent-s5rn6   1/1       Running   0         2s

これだけだとただdaemonsetを作るだけなので、Operatorを使う意味はほぼない。MackerelというCRDを定義するという1レイヤーをかぶせたにすぎない。 helmチャートから作るこの方法だと、helmで実現できること以上のことはできない。service, deploymentなどの複数のリソースを束ねてwatchできるというのが唯一のメリット?のように見える。

ベースイメージのhelm-operatorが何かやっているんだろうということと、そこにビルド時にIncludeするwatchs.yamlというがポイントなんだろうということはわかる。

https://github.com/operator-framework/operator-sdk/tree/master/pkg/scaffold/helm

このへんが中身なんだろうけど、まだ読み解けない。

ソースコードはこちら。

github.com