K3sにHelmを使って何かをデプロイする場合、K3s自体にHelmChartカスタムリソースを使ったチャートのインストールがサポートされており、helm
CLIコマンドを使わずにマニフェストを作成するだけでチャートのインストールが可能なので試してみた。
HelmChartカスタムリソースのマニフェストファイル
お題は以下の「クラスタ上のPodのログをsyslog転送するFluent Bitのデプロイ」
これと同じ内容でHelmチャートをデプロイするには、HelmChart
カスタムリソースを以下のように記述。
--- apiVersion: helm.cattle.io/v1 kind: HelmChart metadata: name: fluentbit namespace: kube-system spec: targetNamespace: logging createNamespace: true repo: https://fluent.github.io/helm-charts chart: fluent-bit version: "0.43.0" valuesContent: | image: repository: cr.fluentbit.io/fluent/fluent-bit tag: 2.2.2 config: ## https://docs.fluentbit.io/manual/pipeline/filters filters: | [FILTER] Name kubernetes Match kube.* Merge_Log On Keep_Log Off K8S-Logging.Parser On K8S-Logging.Exclude On [FILTER] Name grep Match * Exclude $kubernetes['namespace_name'] logging [FILTER] name nest match kube.* operation lift nest_under kubernetes add_prefix kubernetes_ ## https://docs.fluentbit.io/manual/pipeline/outputs outputs: | [OUTPUT] name syslog match kube.* host 192.168.0.75 syslog_message_key log syslog_hostname_key kubernetes_namespace_name syslog_appname_key kubernetes_pod_name syslog_procid_key kubernetes_container_name
この内容のマニフェストを適用すると、
- kube-systemネームスペースにHelmチャートをインストールするためのhelm-install-fluentbit podがデプロイされる
- helm-install-fluentbit podによって、loggingネームスペースにFluent Bitのpodがデプロイされる
という処理が起動する。
HelmChart
リソースの作成先をkube-system
にしてるが特にどこでもよい。
Helmチャートインストール時に新しくネームスペースを作成する場合(初期状態では存在しない場合)にすでに確実に存在するネームスペースを指定している程度。
チャートのリポジトリをrepo
で、チャート名をchart
で、チャートのバージョンをversion
で指定しているが、これはhelm
CLI実行時の事前実行で行う処理や引数指定に相当。
values.yaml
の内容がvaluesContent
に相当で、コピペで問題ない。(マニフェストファイル内のインデントに位置を合わせる必要はあるが)
設定変更したい場合
CLIだとhelm upgrade
する場面は、HelmChartカスタムリソースを更新してapply
すればOK
前述のFluent Bitの例であれば、valuesContent
部分の設定を変更してapply
すれば、ConfigMapが更新されPodが再作成される。
HelmChartConfigカスタムリソースを使った設定の分離と上書き
HelmChart
カスタムリソースとは別に、HelmChartConfig
カスタムリソースも用意されており、HelmChart
でデプロイされているチャートのvaluesContent
部分の設定を上書きできる。
上書き対象のHelmチャートは、metadata.name
とmetadata.namespace
をHelmChart
リソースの値と一致させておく必要があり、前述のFluent Bit用の設定を上書きするには以下の通り。
この内容のマニフェストによって、Podのリソース制限とtailインプットモジュールのバッファサイズが更新される。
--- apiVersion: helm.cattle.io/v1 kind: HelmChartConfig metadata: name: fluentbit namespace: kube-system spec: valuesContent: | resources: limits: cpu: 100m memory: 128Mi requests: cpu: 100m memory: 128Mi config: inputs: | [INPUT] Name tail Path /var/log/containers/*.log multiline.parser docker, cri Tag kube.* Mem_Buf_Limit 20MB Skip_Long_Lines On [INPUT] Name systemd Tag host.* Systemd_Filter _SYSTEMD_UNIT=kubelet.service Read_From_Tail On
これを使うと、設定のみ定義を分離できる。 また、K3sデフォルトでHelmインストールされるTraefikの設定もこれで上書きできる。
というか、ドキュメントの大項目に「Helm」とあるのにちゃんと読んでなくて、最近なんとなく眺めてたら「え、こんな機能あったんだ!?」と思ったのが実情