Helmfileを利用して複数のHelm Chartをまとめて管理する

背景

最近、EKSにHelmを使って Opentelemetry Collector をインストールしました。 Opentelemetry Collector で利用するバックエンドプラットフォーム(監視SaaS)のAPIキーが必要になるので AWS Secrets Manager に保管することにしました。

EKSから AWS Secrets Manager のリソースを参照するには Secrets Store CSI Driver の SecretProviderClass というカスタムリソースを作成する必要があります。 しかし Opentelemetry Collector のHelm Chart に SecretProviderClass のリソースが存在しないので別途管理する必要がありました。

関連リソースなのでまとめて管理したいと思い調べたところ Helmfile を利用することで解決できそうだったのでやってみました。

Helmfile

HelmfileはHelm Chartをより宣言的に管理できるツールです。Helmのリポジトリなどもコード管理できるようになるのでより再現性を確保することができます。

また複数のHelm Chartを管理できるので、今回のようなカスタムリソースもHelm Chartにしてしまえば一緒に管理できるようになります。

構成

最終的なファイル構成は以下のようになりました。

 ├── helmfile.yaml
 ├── otel-collector
 │   ├── config.yaml
 │   └── helmfile.yaml
 └── otel-collector-misc
     ├── Chart.yaml
     ├── helmfile.yaml
     └── templates
         └── secret-provider-class.yaml

ディレクトリを2つ掘っているのでそれぞれ解説します。

./otel-collector

Opentelemetry Collector の Helm Template に渡す変数が書かれた config.yaml を置いています。

helmfile.yaml は以下の通りで Helm Chart の Repository の設定や Release の設定を記述することができます。

repositories:
- name: open-telemetry
  url: https://open-telemetry.github.io/opentelemetry-helm-charts 

releases:
- name: opentelemetry-collector
  namespace: otel-collector
  chart: open-telemetry/opentelemetry-collector 
  version: 0.53.1
  values:
    - config.yaml

./otel-collector-misc

SecretProviderClass の 簡単な Helm Chart を作成して置いています。 helmfile.yaml には以下のようにカレントのディレクトリを指定するように記述することでローカルの Helm Chart を利用することができます。

releases:
- name: opentelemetry-collector-misc
  namespace: otel-collector
  chart: ./
  version: 0.1.0

./helmfile.yaml

./otel-collector./otel-collector-misc にある helmfile.yaml へのpathを記述することで複数の Helm Chart を管理できるようになります。

helmfiles:
  - path: ./otel-collector/helmfile.yaml
  - path: ./otel-collector-misc/helmfile.yaml

実行

helmfile apply を実行するだけで Opentelemetry Collector 関連のリソースと SecretProviderClass のカスタムリソースをEKS上にまとめて作成することができました。 helm だと事前に Repository の追加が必要だったり、helm install コマンドに Namespace や Chart のバージョンを渡す必要がありますが、全て helmfile.yaml に記述されているので必要ありません。 さらにhelmfile diffで差分を確認できるのも便利ですね。helmの場合はpluginを入れたりする必要があるので。

まとめ

複数のHelm Chartを管理する目的でHelmfileを利用してみましたが、helmfile化することでコード管理できる範囲が広がったことも嬉しいポイントでした。 ArgoCDなどで管理したい場合には Config Management Plugin などを利用すると良さそうなので引き続き試して見ようと思います。

話は変わりますが、先日 Mackerel が OpenTelemetry 対応を進めているといった発表がありました。 API キーの管理方法は今回の件が利用できるかもしれません。こちらも楽しみにしています。

mackerel.io