以前fluentd-sidecar-injectorというものを作った.
AdmissionWebhookを使って,任意のPodにログ転送用のfluentdをサイドカーとして差し込むものだ.これの目的は,
標準出力以外の,例えばファイルに吐き出すようなログはどうなるだろう? こういったログを集めるためには,アプリケーションのコンテナのサイドカーとしてfluentdを動かし,ログファイルをVolumeMountすることでサイドカー側のfluentdにログファイルを読ませる,というようなことをする必要がある. でもこれ, アプリケーションが増えてきたときに,毎回すべてのDeploymentにSidecarの定義書くのめんどくさくない?
というのを解決することだった.
これは変わってないのだが,いかんせんKubernetesのWebhookはインストールするのがめんどくさい.というわけでWebhookをセットアップするためのCustomResourceDefinitionとコントローラを作って,適切なリソース定義を書けばインストールできるようにした.これによりfluentd-sidecar-injectorはhelmでインストールすることができるようになった.
インストール方法を変えただけで,使い方は特に変わってない.
helmでインストール
$ helm repo add h3poteto-stable https://h3poteto.github.io/charts/stable $ helm install my-injector --namespace kube-system h3poteto-stable/fluentd-sidecar-injector
これだけで入る.
injectするfluentdの設定等をここのパラメータで渡すことができる. 詳しくはhelm chartのREADMEに書いた.ただし,ここで指定されるパラメータは,個別のPodのannotationで上書きされる.あくまでデフォルト設定を流し込むだけ.
injectされるcontainer
fluentdの場合はこちらが
fluent-bitの場合はこちらが
injectされるようになっている.もちろんこのimageもパラメータやannotationで変更可能ではある.
CustomResourceDefinition
もともとWebhookサーバの環境変数で指定できたデフォルト値等をすべてCRDにも追加している.これにより,helm側からインストール時にパラメータ指定できるようになっている.
デフォルト設定をいじらない場合は,collectorだけを指定すれば良い.fluentd-sidecar-injectorはfluentdとfluent-bitをサポートしているので,そのどちらかを指定する.
apiVersion: operator.h3poteto.dev/v1alpha1 kind: SidecarInjector metadata: name: fluentd-injector namespace: kube-system spec: collector: "fluentd"
もちろんCRをいじってもいいんだけど,基本的にはhelmでインストールすると,初期設定のCRもインストールされるようになっているので,特にこれを触る必要はない.
CRDは1種類だけだし,特に複数の処理をやる必要もなく,一度webhookの設定を作るだけのコントローラなので,controller-runtimeは使ってないない.client-goで基本的に実装していて,CRDの生成にだけcontroller-toolsのcontroller-genを使っている.
この先の予定
とりあえずまだLeaderElectionを作ってないので,これを作ったほうがいい.helm chartではreplicas: 1
の固定にしてあるが,デプロイ時等にどうしても多重起動する可能性があるし,これはユーザがいじってしまう可能性もあるので,LeaderElectionは作っておきたい.
あと,いかんせんテストが作りにくくて毎回クラスタを用意して手動でチェックしてたんだけど,あまりにもめんどくさすぎるのでE2Eテストを書こうと思う.ControllerがWebhookをインストールすることくらいなら,もうちょっとサボっても行ける気がするんだけど,Webhookが正常に動いてPodにSidecarが差し込まれることをテストするのは,E2Eを用意したほうがいい気がしている.