zaki work log

作業ログやら生活ログやらなんやら

[K3s / Helm] K3sのHelmChartカスタムリソースを使ったチャートのインストール (Fluent Bit)

K3sにHelmを使って何かをデプロイする場合、K3s自体にHelmChartカスタムリソースを使ったチャートのインストールがサポートされており、helmCLIコマンドを使わずにマニフェストを作成するだけでチャートのインストールが可能なので試してみた。

docs.k3s.io

HelmChartカスタムリソースのマニフェストファイル

お題は以下の「クラスタ上のPodのログをsyslog転送するFluent Bitのデプロイ」

zaki-hmkc.hatenablog.com

これと同じ内容で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

この内容のマニフェストを適用すると、

  1. kube-systemネームスペースにHelmチャートをインストールするためのhelm-install-fluentbit podがデプロイされる
  2. helm-install-fluentbit podによって、loggingネームスペースにFluent Bitのpodがデプロイされる

という処理が起動する。

HelmChartリソースの作成先をkube-systemにしてるが特にどこでもよい。
Helmチャートインストール時に新しくネームスペースを作成する場合(初期状態では存在しない場合)にすでに確実に存在するネームスペースを指定している程度。

チャートのリポジトリrepoで、チャート名をchartで、チャートのバージョンをversionで指定しているが、これはhelmCLI実行時の事前実行で行う処理や引数指定に相当。
values.yamlの内容がvaluesContentに相当で、コピペで問題ない。(マニフェストファイル内のインデントに位置を合わせる必要はあるが)

設定変更したい場合

CLIだとhelm upgradeする場面は、HelmChartカスタムリソースを更新してapplyすればOK
前述のFluent Bitの例であれば、valuesContent部分の設定を変更してapplyすれば、ConfigMapが更新されPodが再作成される。

HelmChartConfigカスタムリソースを使った設定の分離と上書き

HelmChartカスタムリソースとは別に、HelmChartConfigカスタムリソースも用意されており、HelmChartでデプロイされているチャートのvaluesContent部分の設定を上書きできる。

上書き対象のHelmチャートは、metadata.namemetadata.namespaceHelmChartリソースの値と一致させておく必要があり、前述の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」とあるのにちゃんと読んでなくて、最近なんとなく眺めてたら「え、こんな機能あったんだ!?」と思ったのが実情