fluentd-sidecar-injectorをhelmでインストールできるようにした

以前fluentd-sidecar-injectorというものを作った.

h3poteto.hatenablog.com

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の場合はこちらが

github.com

fluent-bitの場合はこちらが

github.com

injectされるようになっている.もちろんこのimageもパラメータやannotationで変更可能ではある.

CustomResourceDefinition

github.com

もともと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を用意したほうがいい気がしている.