Helm

Kubernetes用のパッケージマネージャ。
テンプレート言語で.yamlを書ける。

公式ページ
https://helm.sh/

GitHub
https://github.com/helm/helm

Qiitaの日本語記事:
Kubernetes: パッケージマネージャHelm

Helmの概要とChart(チャート)の作り方

導入

Quickstart Guide

インストール

管理者権限でPowerShellを立ち上げて実行。

choco install kubernetes-helm

初期化

helm init --max-history 200

履歴データが大量にならないために、--max-historyを指定することが推奨されている。

コマンド

helm create

チャートを作成する。

helm create [チャート名]

helm install

チャートをインストールする。

# 最新のチャートを入れるために更新する
helm repo update

# 公式チャートからインストール
# ex) helm install stable/mysql
helm install [チャート名]

# `--name`オプションでリリース名を指定できる
helm install --name [リリース名] [チャート名]

# ローカルのチャートをインストールする
# ex) helm install --name hoge .
helm install --name [リリース名] [チャートのパス]

# 指定したネームスペースがなければ作る
helm install --name [リリース名] --namespace=[ネームスペース名] [チャートのパス]

チャートをインストールするたびに新しいリリースが作成され、kube-systemネームスペース内のConfigMapsに格納されます。

--nameオプションを指定しない場合はランダムな名前でリリースが作成されるので、基本的に指定したほうが良いです。

高度な使い方

--node-selectors
--override
--output
helm init --output json

helm get -h

Helmコマンドのヘルプを表示する。

helm list

リリースの一覧を取得する。

helm list

# アンインストールされているリリースも表示
helm list -all

helm delete

リリースをアンインストールする。

helm delete [リリース名]

リリースのアンインストールは、リリースを完全に削除したわけではない。
次のコマンドによって状態を取得したり、ロールバックすることができる。

# リリースの状態を取得
helm status [リリース名]

# アンインストールしたリリースを復活
helm rollback [リリース名]

# リリースを完全に削除
helm delete --purge [リリース名]

リリースを完全に削除するにはhelm delete --purge [リリース名]を実行してください。

helm template

テンプレートを展開したyamlを出力する。

# ex) helm tempalte .
helm template [チャートのパス]

# 特定のテンプレートのみ出力する
helm template . -x tempaltes/app.yaml

スニペット

テンプレートyamlからデプロイメント名を取得

brew install python
helm template -f deploy/value.yaml deploy

すべてのリリースを完全に削除する

helm del --purge $(helm ls -q)

既存のリリースを削除してインストールしなおす

helm del --purge [リリース名]; helm install --name [リリース名] --namespace [ネームスペース名] [チャートのパス]

テンプレートをファイル単位で指定してデプロイ

# ex) helm template . -x templates/app.yaml | kubectl apply -f -
helm template [チャートのパス] -x [テンプレートのファイルパス] | kubectl apply -f -

以下の警告がでるが無視して問題ない。
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply

テンプレート

チャートのディレクトリ構成は次のようになる。

mychart/
  Chart.yaml
  values.yaml
  charts/
  templates/
  ...

次のコマンドでチャートのひな形を生成する。

helm create mychart
cd mychart

# ゼロから作業するときは最初に生成されたtemplatesを消す
rm -fr templates/*.*

次のコマンドでtemplates配下の.yamlで定義したリソースをまとめて生成できる。

helm install .

# release nameを指定する場合
helm install --name my-release .

# 既存のチャートを削除して再生成
helm install . --name my-release --replace

テンプレートの.yamlを編集したら次のコマンドでコンテナを作りなおす。

helm del hoge --purge
helm install . --name hoge

IF/ELSE

HELM Documentation | IF/ELSE

  {{- if .Values.hoge }}
  type: NodePort
  {{- else if .Values.hoge }}
  type: ClusterIP
  {{- else }}
  type: ClusterIP
  {{- end }}

Values

# values.yamlの値を入れる
name: {{ .Values.app.name }}

# 値がないときのデフォルト値を設定する
name: {{ .Values.app.name | default "hoge"}}

--set を使うと、values.yamlの設定値を上書きできる。

hoge=default
helm install --name hoge . --set hoge=123

空白の制御

https://helm.sh/docs/chart_template_guide/#controlling-whitespace

例えば、単なるIF文などを書くときに{{IF ~~~ }}と書くと展開後にその行が空行になってしまう。

user:
{{ if eq .Values.hoge "aaa"}}
  hoge: aaa
{{ end }}
user:

  hoge: aaa

{{- IF ~~~ }}のようにハイフンを書くとこの空白を取り除ける。

user:
{{- if eq .Values.hoge "aaa"}}
  hoge: aaa
{{- end }}
user:
  hoge: aaa

Functions

tpl

helmテンプレートを展開する。外部設定ファイルでhelmテンプレートを使いたいときに。

Springのapplication.ymlをテンプレートで書けるようにする例:

apiVersion: v1
kind: ConfigMap
metadata:
    name: 'my-conf'
    namespace: 'my-namespace'
data:
{{ (tpl (.Files.Glob "config/app/application.yml").AsConfig . ) | indent 2 }}

Ref:
https://helm.sh/docs/charts_tips_and_tricks/#using-the-tpl-function

FAQ

作業ディレクトリを変えたらhelm installできなくなった

新しい作業ディレクトリに移動してからhelm initする。

helm init --upgrade

VSCode拡張

  • vscode-helm