🤦‍♂️

Helmに入門したので、躓いたところを振り返る

2023/06/12に公開

はじめに

アプリのマニフェストを管理するのにKustomizeを使っていたのですが、同じようなマニフェストが乱立したので管理を楽にするためにHelmに移行しました。
Helmを一から書いたのは初めてだったので、躓いた点をここに残します。

quote関数の進数変換

0から始まる数値をquote関数を使って文字列にすると進数変換が起こり想定した値ではなくなる

下記のようなtemplateでidとして0000000060のような値を渡すと、8進数として解釈され10進数である48に変換されてしまいます。

...
id: {{ .id | quote }}
...

0から始まる数値はtemplateでクォーテーションを付けず、valuesの段階でクォーテーションを付けます。

{{ }}の埋め込み

Helm templateへの値の埋め込みの記法は{{ }}なので、{{ }}という文字列自体を簡単に埋め込めない

Argo WorkflowsのWorkflow Templatesなどは{{ }}自体をマニフェストに記述する必要があります。

...
- name: message
  value: {{inputs.parameters.message}}
...

上記ををHelm templateで表現しようとすると下記のような煩雑な書き方をしなければならかったです。

...
- name: {{ . }}
  value: {{ printf "%s%s%s%s" "{{" "inputs.parameters." . "}}" | quote }}
...

変数の統合

range operator使用時に繰り返す変数と親スコープの変数を1つに統合したい

まず、マニフェストのmetadataなどの共通部分はinclude関数などでtemplateを作成したいです。

...
metadata:
  {{- include "metadata" . -}}
...

そしてrange operatorで複数のリソースを作る時も同じようにinclude関数で共通部分を記述したいので、繰り返しの変数と親スコープの変数の両方をinclude関数に渡したいです。

{{- range $name, $app := .Values.apps }}
---
apiVersion: v1
kind: Service
metadata:
  {{- include "metadata" ここに$nameと$を入れたい -}}
...

しかし、include関数は複数の値を渡すことができないです。
なので、$name$を統合します。
$はdictionaryなので$nameをdict関数でdictionaryにしmerge関数で統合します。

...
{{- $ := merge (dict "name" $name) $ }}
...

上記を踏まえるとこのようなtemplateになります。

{{- range $name, $app := .Values.apps }}
---
{{- $ := merge (dict "name" $name) $ }}
apiVersion: v1
kind: Service
metadata:
  {{- include "metadata" $ -}}
...

Discussion