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
このへんが中身なんだろうけど、まだ読み解けない。
ソースコードはこちら。