Helm 3.0 - 7 / a first template

Page content

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を 再利用可能なチャートに変換していきます。