Helmのvaluesにはjsonファイルを渡せる
結論
- Helmでテンプレートをレンダリングする際、
-f, --values
オプションで渡すファイルはjson形式のファイルでもいい - なぜならYAMLはJSONのスーパーセットだから
Github
内容
例えば、上記Githubのリポジトリの例で説明します
- 以下のようなテンプレートを用意します。
- jsonの
testJSON
キー以下の内容に応じて、Podと対になるサービスを作成しています。
- jsonの
-
以下のjsonを用意します
https://github.com/oniku-2929/helm_yaml_is_superset_of_json/blob/main/test.json -
この状態で
helm template . -f test.json
を実行すると、以下のようなレンダリング結果になります。
---
# 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を使えば解決します。
ので、例えば1回yqをかまして生成したyamlファイル群を入力に使えば、それでも当然動作可能です。
ですが、たとえば他のツールやシステムが既に吐き出しているJSONファイルの内容を元に
マニフェストを生成したいというようなケースでは、使えて損はない小ネタかなと思います。
なぜ、jsonを受け付けるのか
これが何故動作するのか、最初分かりませんでした。
これは現在のYAMLの規格では、YAMLはJSONのスーパーセットであるからと定めされているからのようです。
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