📝

Helmのvaluesにはjsonファイルを渡せる

2023/03/14に公開

結論

  • Helmでテンプレートをレンダリングする際、-f, --valuesオプションで渡すファイルはjson形式のファイルでもいい
  • なぜならYAMLはJSONのスーパーセットだから

Github

https://github.com/oniku-2929/helm_yaml_is_superset_of_json

内容

例えば、上記Githubのリポジトリの例で説明します

  • 以下のようなテンプレートを用意します。
    • jsonのtestJSONキー以下の内容に応じて、Podと対になるサービスを作成しています。

https://github.com/oniku-2929/helm_yaml_is_superset_of_json/blob/main/templates/pod.yaml

---
# Source: test/templates/pod.yaml
#JSON:map[labels:[hoge huga piyo] name:b type:two]
apiVersion: v1
kind: Pod
metadata:
  name: pod-b
  labels:
    app: pod-b
    hoge: label-hoge
    huga: label-huga
    piyo: label-piyo
  annotations:
    type: two
spec:
  containers:
    - name: nginx
      image: nginx
      ports:
      - name: http
        containerPort: 80
---
# Source: test/templates/pod.yaml
#JSON:map[name:c type:three]
apiVersion: v1
kind: Pod
metadata:
  name: pod-c
  labels:
    app: pod-c
  annotations:
    type: three
spec:
  containers:
    - name: nginx
      image: nginx
      ports:
      - name: http
        containerPort: 80
---
...(以下略)

なので、このままhelm install test . -f test.jsonとすればインストール可能です。
helm template . -f test.json -f values.yamlでも
helm template . -f values.yaml -f test.jsonでも動作します。

使いどころ

jsonをyamlの形式にするだけなら、yqを使えば解決します。

https://github.com/mikefarah/yq
https://github.com/kislyuk/yq
ので、例えば1回yqをかまして生成したyamlファイル群を入力に使えば、それでも当然動作可能です。

ですが、たとえば他のツールやシステムが既に吐き出しているJSONファイルの内容を元に
マニフェストを生成したいというようなケースでは、使えて損はない小ネタかなと思います。

なぜ、jsonを受け付けるのか

これが何故動作するのか、最初分かりませんでした。
これは現在のYAMLの規格では、YAMLはJSONのスーパーセットであるからと定めされているからのようです。
https://yaml.org/spec/1.2.2/

1.2. YAML History
The YAML 1.2 specification was published in 2009. Its primary focus was making YAML a strict superset of JSON. It also removed many of the problematic implicit typing recommendations.

これを見たとき、「なるほど、だからkuberntesのマニフェストでも、JSONもYAMLも両方指定できるのか」と合点がいきました。

所感

😇

yq使えばよかった

Discussion