Helm 3.0 - 7 / a first template
Helm 3.0 が GAになったので 色々やってみる。その7
今日のお題はここの続き Getting Started / A Starter Chart
実際にテンプレートを作ってみる
mychartを作ってみる
helm create mychart
これでジェネレートされるテンプレートファイルは悪くないのですが、最初に触るには些かごちゃごちゃしているので、ばっさり消してCleanな状態にする。
rm -rf mychart/templates/*
cat /dev/null > mychart/values.yaml
テストインストール
helm install mychart-inst ./mychart --dry-run --debug
これで実際にインストールはせずに結果を確認出来る。
$ helm install mychart-inst ./mychart --dry-run --debug
install.go:148: [debug] Original chart version: ""
install.go:165: [debug] CHART PATH: /home/user/work/helm/mychart
NAME: mychart-inst
LAST DEPLOYED: Sun Dec 1 14:52:01 2019
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
{}
HOOKS:
MANIFEST:
manifestテンプレートを追加する
最初に ConfigMapを作ってみる。
cat << EOF > mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "Hello World"
EOF
一つも値をテンプレート化していないので、出力はこのまま。
$ helm install mychart-inst ./mychart --dry-run --debug
install.go:148: [debug] Original chart version: ""
install.go:165: [debug] CHART PATH: /home/user/work/helm/mychart
NAME: mychart-inst
LAST DEPLOYED: Sun Dec 1 15:14:19 2019
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
{}
HOOKS:
MANIFEST:
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "Hello World"
実際にインストールをしてみる。
$ helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
$ helm install mychart-inst ./mychart
NAME: mychart-inst
LAST DEPLOYED: Sun Dec 1 15:18:06 2019
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
$ helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
mychart-inst default 1 2019-12-01 15:18:06.357626725 +0900 JST deployed mychart-0.1.0 1.16.0
$ helm get manifest mychart-inst
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "Hello World"
レンダリングされてデプロイされたmanifestを確認するときは以下のコマンドで出来る
helm get manifest RELEASE_NAME
テンプレートの呼び出しを使ってみる
このチャートを使ってもう一つリリースを追加してみるとどうなるか?
$ helm install mychart-inst2 ./mychart
Error: rendered manifests contain a resource that already exists. Unable to continue with install: existing resource conflict: kind: ConfigMap, namespace: default, name: mychart-configmap
テンプレートのConfigMapは固定で mychart-configmapという名前を持っているため、同じnamespaceに2つ目のリリースを作ろうとしても、ConfigMapリソースの名前が衝突してしまうので出来ませんというエラーです。
ConfigMapはリリース毎に ユニークな名前を持たせるべきでしょう。リソースの名前にリリースの名前を含める事で独自の名前にしてやれば良さそうです。リリースの名前は .Release.Name で参照する事が出来るので以下の様に変更します。
cat << EOF > mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
EOF
templateを変更したのでupgradeしてみます。
helm upgrade mychart-inst ./mychart
$ helm get manifest mychart-inst
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "Hello World"
$ cat << EOF > mychart/templates/configmap.yaml
> apiVersion: v1
> kind: ConfigMap
> metadata:
> name: {{ .Release.Name }}-configmap
> data:
> myvalue: "Hello World"
> EOF
$ helm upgrade mychart-inst ./mychart
Release "mychart-inst" has been upgraded. Happy Helming!
NAME: mychart-inst
LAST DEPLOYED: Sun Dec 1 15:29:11 2019
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
$ helm get manifest mychart-inst
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-inst-configmap
data:
myvalue: "Hello World"
これでリリース毎にリソース名が異るようになったので、2つ目のリリースを追加しても問題がなくなりました。
$ helm install mychart-inst2 ./mychart
NAME: mychart-inst2
LAST DEPLOYED: Sun Dec 1 15:32:20 2019
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
$ helm get manifest mychart-inst2
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-inst2-configmap
data:
myvalue: "Hello World"
テンプレートを展開する際にスコープを意識する必要がありますが、現状ではとりあえず . に続けて名前を指定する事で 参照出来ると思っていれば良いかと思います。
values.yamlを使ってみる
ConfigMap中にある メッセージをパラメータ化してみます。
values.yamlを作ります。
cat << EOF > mychart/values.yaml
messages:
greeting: "Hello World!!!"
EOF
テンプレートを更新
cat << EOF > mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "{{ .Values.messages.greeting }}"
EOF
テスト実行してみます。COMPUTED VALUESにvalues.yamlの内容がのってきています。
$ helm upgrade mychart-inst2 ./mychart --dry-run --debug
upgrade.go:79: [debug] preparing upgrade for mychart-inst2
upgrade.go:87: [debug] performing update for mychart-inst2
upgrade.go:220: [debug] dry run for mychart-inst2
Release "mychart-inst2" has been upgraded. Happy Helming!
NAME: mychart-inst2
LAST DEPLOYED: Sun Dec 1 15:45:47 2019
NAMESPACE: default
STATUS: pending-upgrade
REVISION: 2
TEST SUITE: None
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
messages:
greeting: Hello World!!!
HOOKS:
MANIFEST:
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-inst2-configmap
data:
myvalue: "Hello World!!!"
–setを使ってユーザ指定パラメータを持つリリースを作ってみます。
helm install mychart-inst3 ./mychart --set "messages.greeting=ハイサイ"
$ helm install mychart-inst3 ./mychart --set "messages.greeting=ハイサイ"
NAME: mychart-inst3
LAST DEPLOYED: Sun Dec 1 15:47:30 2019
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
$ helm get manifest mychart-inst3
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-inst3-configmap
data:
myvalue: "ハイサイ"
こんな感じで manifestを 再利用可能なチャートに変換していきます。