Helmは、Kubernetesの複数のマニフェストをChartとしてまとめ、設定値とリリース履歴を管理するツールです。今回はDeploymentとServiceだけのChartを作ります。
今回やること

Chart + values → helm install → revision 1
values変更 → helm upgrade → revision 2
問題を想定 → helm rollback 1
前提: 自分のローカルminikubeなど、学習用クラスタでkubernetes入門を完了していること。
| 言葉 | 意味 |
|---|---|
| Chart | テンプレート、既定値、メタデータをまとめたディレクトリ |
| Release | Chartをクラスタへ導入した一つの実体 |
| Revision | installやupgradeごとに増えるリリース履歴の番号 |
同じChartでも、release名とvaluesを変えれば別の実体として管理できます。この実習ではrelease名をdemoに固定します。
最小Chartを作る
demo-web/
├── Chart.yaml
├── values.yaml
└── templates/
├── deployment.yaml
└── service.yaml
Chart.yamlにはChart自身の情報を書きます。
apiVersion: v2
name: demo-web
description: Minimal nginx chart for learning
type: application
version: 0.1.0
appVersion: "1.30.4"
values.yamlには変更したい値をまとめます。
replicaCount: 1
image:
repository: nginx
tag: "1.30.4"
templates/deployment.yamlを作ります。
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-demo-web
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Release.Name }}-demo-web
template:
metadata:
labels:
app: {{ .Release.Name }}-demo-web
spec:
containers:
- name: nginx
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
ports:
- containerPort: 80
templates/service.yamlを作ります。
apiVersion: v1
kind: Service
metadata:
name: {{ .Release.Name }}-demo-web
spec:
selector:
app: {{ .Release.Name }}-demo-web
ports:
- port: 80
targetPort: 80
installする
クラスタの向き先を確認してから、Chartを検査・表示・導入します。
kubectl config current-context
helm lint ./demo-web
helm template demo ./demo-web
helm install demo ./demo-web
helm templateはクラスタを変更せず、生成されるKubernetesマニフェストを表示します。意図しない名前や値がないか確認してからhelm installへ進みます。
kubectl wait --for=condition=available \
deployment/demo-demo-web --timeout=120s
helm status demo
upgradeとrollback
Pod数だけを2へ変更します。
helm upgrade demo ./demo-web --set replicaCount=2
kubectl get pods -l app=demo-demo-web
helm history demo
revision 2がdeployedで、Podが2つになったことを確認します。次にrevision 1へ戻します。
helm get values demo
ここではコマンドラインで上書きしたreplicaCount: 2を確認できます。複数環境で繰り返し使う値は、コマンド履歴だけに残さずvaluesファイルとしてGit管理します。
helm rollback demo 1
kubectl rollout status deployment/demo-demo-web
kubectl get pods -l app=demo-demo-web
helm history demo
rollbackも新しい履歴として記録されます。履歴を消して過去へ戻る操作ではありません。
成功確認
- install後にDeploymentがAvailableになる
- upgrade後にPodが2つになる
- rollback後にPodが1つへ戻る
helm history demoにinstall、upgrade、rollbackが残る
よくあるつまずき
template errorでインストールできない
先にhelm lintとhelm templateを実行し、YAMLの字下げと.Valuesの名前を確認します。
別のクラスタへ入れてしまう
Helmは現在のkubeconfigを使います。実行前にkubectl config current-contextを確認してください。
練習
service.port: 80をvalues.yamlへ移し、Serviceテンプレートから参照してください。helm templateの結果でport: 80になれば成功です。
後片付け
helm uninstall demo
kubectl get all -l app=demo-demo-web
リソースが残っていないことを確認します。ローカルクラスタ自体の削除はKubernetes入門の手順を使います。