あけましておめでとうございます。Red HatでOpenShiftのサポートをしているid:nekopです。OpenShift 全部俺 Advent Calendar 2018 - Qiitaの16日目のエントリです。
さて、過去2回でclient-goを直接利用する素のコントローラーを見ていきましたが、現在主流のkubebuilderやoperator-sdkなどの高レイヤーのライブラリはcontroller-runtimeというライブラリを利用しています。controller-runtimeを利用することでControllerとWebhookを簡単に実装できるようになっています。
含まれているサンプルではReplicaSetにLabelを付与するControllerと、Podのアノテーションを付与およびチェックするWebhookを実装しています。
- https://github.com/kubernetes-sigs/controller-runtime/blob/v0.1.9/example/main.go
- https://github.com/kubernetes-sigs/controller-runtime/blob/v0.1.9/example/controller.go
スタンドアロンビルドする手順は過去2回のものと変わらないので省略して、成果物だけ以下に置きました。webhook部分は削除してpod名を出力するだけのControllerに変更していますが、importなどを除くと50行程度でControllerが書くことができています。素のclient-goのworkqueueサンプルでは150行くらいだったので、1/3くらいの手軽さです。
https://github.com/nekop/cr-pod-list-controller
glide.yamlを作った時に気づきましたが、controller-runtime v0.1.9ではk8s 1.11 / client-go 0.8ではコンパイルエラーになったので、k8s 1.12 / client-go 0.9にしています。新しいライブラリでまだバージョンが0系、stableブランチがないので利用する際には注意が必要です。クラスタはOpenShift 3.11 / k8s 1.11でも上記のサンプルは動作します。