helmとは & helmの使い方

# helmとは

https://github.com/kubernetes/helm

Kubernetes Helm(以降Helm)とはKubernetesのパッケージマネージャーです。HelmはKubernetesのSIG-Appsで開発がされています。パッケージはChart(s)と呼ばれ、公式でレポジトリkubernetes/chartsが用意されています。Kubernetesクラスタに側にはtillerと呼ばれるデプロイ用のコンポーネントを配置して使用します。

# 用語

|用語| 	意味| 	役割|
|:---|:---|:---|
|helm |	船のかじ| 	yum, aptに相当するパッケージマネージャー。Linux, OSXのバイナリが用意されている|
|chart |	海図 	|deb, rpmに相当するパッケージ。Kubernetesのマニフェストのテンプレートをまとめたもの|
|tiller| 	舵柄 	|デプロイを担うサーバーコンポーネント|
|Package| パッケージ |	Jenkins, Sparkなどのhelmを使ってk8s上にインストールアプリケーション|
|Release| リリース	|k8s上にインストールされたパッケージ|
|Repository|リポジトリ|チャートが保存される場所|


# 構成と通信方法

主な構成要素はhelm, Repository, tillerの3つです。
helmはChartの、tillerはReleaseの管理を行っていて、ざっくり機能を挙げるとこんな感じ。

### Helm

* ローカルの`chart`開発
* レポジトリの管理
* `Tiller`サーバとの通信
  * インストールする`chart`の送信
  * `Release`情報の取得
  * `Release`に対するアップグレードやアンインストールの要求

### Tiller

* Helmクライアントからのリクエスト受付
* `chart`と`configuration`を組み合わせた`release`のビルド
* `chart`をk8sへインストールし、`release`をトラックする
* k8sへ`chart`のアップグレードとアンインストールをする
 

# コマンド

### helm init

Kubernetesクラスタ上にtillerをデプロイする。
つまり以下のようになる。

```
$ kc get po,deploy,svc  -n kube-system -l name=tiller
NAME                               READY     STATUS    RESTARTS   AGE
po/tiller-deploy-7777bff5d-smpx5   1/1       Running   2          2d

NAME                   DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deploy/tiller-deploy   1         1         1            1           2d

NAME                TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)     AGE
svc/tiller-deploy   ClusterIP   10.103.130.98   <none>        44134/TCP   2d
```
また$HOME/.helm ディレクトリ以下に設定ファイルが設置される



### helm repo list

レポジトリの一覧表示

### helm repo update

レポジトリのアップデート

### helm serve

serveを実行すると$HELM_HOME/repository/local内のchartsが呼び出せるようになります。

```
$ helm serve
Regenerating index. This may take a moment.
Now serving you on 127.0.0.1:8879
```

別タブで
`curl http://127.0.0.1:8879/charts`

### helm search 

インストール可能なchart一覧が表示される

### helm search xxx

例

```
$ helm search redis
NAME           	VERSION	DESCRIPTION
stable/redis   	1.1.7  	Open source, advanced key-value store. It is of...
stable/redis-ha	2.0.0  	Highly available Redis cluster with multiple se...
stable/sensu   	0.2.0  	Sensu monitoring framework backed by the Redis ...
```

### helm install xxx

例

```
helm install stable/redis
helm install helloworld
helm install helloworld-0.1.0.tgz
```

また`helm install .`でローカルのchartをインストールできる


`--name hogehoge`とすると、release-name(helm lsの左側のNAME)が指定できる。



### helm upgrade #release-name #chart-path
 
helm upgrade oily-terrier helloworld # helloworldはchartディレクトリ

### helm delete #release-name

インストール済みリリースを削除
ただ、deleteしても削除済みデータとして残っている。
なのでhelm install hoge --name hogehogeと同じnameでインストールするとすでに存在しているエラーになる。
helm delete --purge hogehoge とするとデータが削除され同じ名前でインストールできる。
`--purge`しなくても` helm install helloworld --name hogehoge --replace`のように`--replace`をつければインストールできる。

なんで削除済みリリースが残っているかというと、削除済みリリースをrollbackして再度有効にできるから。

### helm create #chart-name

でscaffoldが作成できる

```
helloworld/
  Chart.yaml    # chartの情報を記載するyaml
  values.yaml   # chartのデフォルト設定
  charts/       # chartの依存を含めるディレクトリ
  templates/    # マニフェストファイルのテンプレートを配置するディレクトリ
```

### helm package #chart-name

でchartをtgzにパッケージできる。


### helm list

インストール済みリリース一覧を表示

```
helm list
NAME     	REVISION	UPDATED                 	STATUS  	CHART           	NAMESPACE
rude-pike	1       	Sun Jan 21 17:15:49 2018	DEPLOYED	helloworld-0.1.0	default
```

`helm list --all`で削除済みリリースも表示
`helm list --deleted`で削除済みリリースのみ表示

`heml ls`でもok

### helm status #release-name

ステータス表示。
削除済みリリースだったら`Status: DELETED`と表示される。


### helm inspect values #chart-name

`helm inspect values helloworld`
`helm inspect values stable/mariadb`
で設定値が見れる

### helm history #release-name

Releaseのリビジョン遷移はhistoryコマンドで確認することができます。


```
$ helm history angry-bird
REVISION   UPDATED                      STATUS           CHART
1           Mon Oct 3 10:15:13 2016     SUPERSEDED      alpine-0.1.0
2           Mon Oct 3 10:15:13 2016     SUPERSEDED      alpine-0.1.0
3           Mon Oct 3 10:15:13 2016     DEPLOYED        alpine-0.1.0
```

### helm rollback #release-name #revision

指定するrevisionは helm history #chart-hame でみれる

例:
`helm rollback happy-panda 1`


### helm init --upgrade

https://docs.helm.sh/using_helm/#upgrading-tiller

### helm reset

ただkubernetesのConfigMapsに保存されているデータは消えないっぽい。
helm initで再インストールできる。

### helm home

macでは
$HOME/.helm
が表示された。ここに設定やpluginが入っているっぽい。