helmの使い方について改めて調べ直してみた

# はじめに
普段kubernetesについて何か調べたり作業したりするとき、インプレス社のKubernetes完全ガイドという本の初版を参考にしています。非常に内容の充実した頼りになる書籍なのですが、発行が2018年9月ということもあり、ところどころ記述が古いです。特にhelm周りの記述が現行と随分異なっており、その都度helpをみたりググったりしてたのですが、やはり理解が不完全な部分が多かったので、この際調べ直してみることにしました。
なお、本記事ではhelmを利用する側の立場から書かれており、自分でchartを作成したりリポジトリを用意するところまでは触れてませんので、あらかじめご了承ください。

## Helmとは
HelmはKubernetesのパッケージマネージャで、yumやaptなどに相当する。インターネットに公開されたリポジトリに多数のパッケージが用意されており、これらのパッケージはChartと呼ばれている。
HelmはCNCF(Cloud Native Computing Foundation)傘下で進められており、Kubernetes自体もCNCF傘下で開発が進められていた経緯から、Kubernetesのパッケージマネージャのデファクトスタンダートとしての地位を確立している[^1]。
Helmのアーキテクチャはv2までとv3からで異なっており、v2まではHelmクライアントからの要求を処理するサーバであるTillerをクラスタにデプロイする必要があったが、v3ではTillerが果たすべき役割はTillerなしでも実現できたとのことで、削除されている。したがって、以前はTillerの初期化のために以下のようなコマンドが必要だったが、現在ではこれを実行する必要はない。

```
helm init
```

また、Helmはパッケージマネージャとしてchartを管理する他に、マニフェストを作成するテンプレートエンジンとしても利用されている。

## Helmの使い方
### リポジトリの追加
Helmのchartは特定のリポジトリで管理されている。このリポジトリとはgithubのリポジトリを指すわけではなく(そういう場合もあるのかもしれない)、それぞれのchartの開発元が管理しているchartのストアを指す。
Helmでchartをインストールする際は、yumやaptと同じくリポジトリからchartのリストを取得する必要がある。したがって、まずは目的のchartが保存されているリポジトリを追加しなければならない。
リポジトリを探す際は、各chartのドキュメントに記載されている場合もあるが、helmhubというサイトを使用して検索することもできる[^2]。helmhubにはリポジトリの追加手順や、chartのインストール方法が記載されている。イメージ的にはdockerhubがわかりやすい。
Helmhubからchartを検索する場合は、ブラウザでhelmhubを開いて検索することもできるが、以下のコマンドでhelmコマンドから検索することもできる。

```
# サンプルとしてdatadogを検索する
$ helm search hub datadog
URL                                               	CHART VERSION	APP VERSION	DESCRIPTION                                       
https://hub.helm.sh/charts/datadog/datadog        	2.6.7        	7          	Datadog Agent                                     
https://hub.helm.sh/charts/datadog-test/datadog   	2.4.23       	7          	Datadog Agent                                     
https://hub.helm.sh/charts/datadog/datadog-crds   	0.1.1        	1          	Datadog Kubernetes CRDs chart                     
https://hub.helm.sh/charts/datadog/datadog-oper...	0.4.0        	0.4.0      	Datadog Operator                                  
https://hub.helm.sh/charts/deliveryhero/datadog...	1.0.0        	0.1        	This is a simple [Kubernetes Controller](https:...
https://hub.helm.sh/charts/datadog-test/datadog...	0.1.2        	0.3.1      	Datadog Operator                                  
https://hub.helm.sh/charts/datadog/synthetics-p...	0.2.0        	1.4.0      	Datadog Synthetics Private Location               
https://hub.helm.sh/charts/fairwinds-stable/astro 	1.0.7        	1.5.3      	Emit datadog monitors based on kubernetes state.  
$
```

上記の例では`https://hub.helm.sh/charts/datadog/datadog`にアクセスすると、以下のようにリポジトリの追加手順からchartのインストールコマンドまでまとめられている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144563/c4a19382-5dc2-ea9c-3376-6ae68a2c450a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144563/7a13f5d9-14c1-2048-3a90-5af4ab14f634.png)

ちなみに、以前はstableやincubatorというリポジトリが存在していたが、現在は他のリポジトリにchartが移動しており、存在しない[^3]。以前はhelmにデフォルトでstableリポジトリが追加されていたらしいが、現在はそのようなことはない(デフォルトでは何も登録されていない)。

### テンプレートエンジンとして使う
Helmをテンプレートエンジンとして使う場合、以下のコマンドを使用する。

```
helm template [NAME] [CHART] [flags]
```

このコマンドを使用すると、指定のchartをインストールするためのマニフェストファイルを標準出力に出力する。直接クラスタに適用したい場合は、出力を`kubectl apply -f -`にパイプすればよい。
以下はdatadogのchartをレンダリングする例。

```
# 標準出力に出力する例
$ helm template datadog-template datadog/datadog --set datadog.apiKey=my_key,datadog.logLevel=DEBUG
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
(以下略)
$
# 直接クラスタに適用する例
$ helm template datadog-template datadog/datadog --set datadog.apiKey=my_key,datadog.logLevel=DEBUG | kubectl apply -f -
```

ちなみに、以前はテンプレートエンジンとして使う際はあらかじめchartをダウンロードしておく必要があったらしいが、現在は上記のようにリポジトリ上のchartを直接指定できる。

### パッケージマネージャとして使う
Helmをパッケージマネージャとして使う場合、以下のコマンドを使用する。

```
helm install [NAME] [CHART] [flags]
```

NAMEはリリース名を指定する。リリースとは、クラスタ上で実行されているchartのインスタンスである[^4]。helmでは同じchartを異なるリリース名で複数インストールすることができ、例えば異なるネームスペースにインストールしたり、異なるパラメータでインストールしたりすることができる。
Chartをインストールする際、chart側が変数の指定を要求してくる場合がある。上記のdatadogの例でいうと、`datadog.apikey`などがそれに当たる。変数を指定する場合は、`--set`オプションに与えるか、変数をyamlで記載したvaluesファイルを作成して`--values`オプションで指定する。

```
$ cat values.yaml
datadog:
 apikey: XXXXX
$ helm install datadog datadog/datadog --values ./values.yaml
```

インストールしたchartを削除する場合は、`helm uninstall`コマンドに削除したいリリース名を指定する。

```
$ helm uninstall datadog
```

# まとめ
Helmはchartと呼ばれるパッケージを管理するkubernetes用のパッケージマネージャである。各chartはそれぞれのリポジトリで管理されており、helmを利用する際はリポジトリを追加する必要がある。リポジトリの検索はhelmhubを利用して行う。
Helmはchartを直接インストールするパッケージマネージャとしての利用のほかに、マニフェストをレンダリングするテンプレートエンジンとしての利用法もある。

Helmはv2からv3にメジャーアップデートされた際にTillerが不要になった他、様々な変更が加えられているので、過去の記事を参考にする際は適宜読替えが必要になる。

[^1]: https://knowledge.sakura.ad.jp/23603/
[^2]: どうもartifacthubというサイト名に変わった？
[^3]: https://helm.sh/blog/new-location-stable-incubator-charts/
[^4]: https://helm.sh/ja/docs/intro/using_helm/