helm を複数クラスタで使い分ける

helm を使っているときに、複数クラスタで使いたきときどうするか？についてちょっと試して見た。結論としては、kubectl 側でコンテキストを切り替えれば、自動で切り替わる。

この経緯で得た Tips をメモがわりとして、ブログにしておく。

# Tiller のインストール

既存のクラスターがあり、そこに新規で tiller をインストールする場合どうするかというと、単にコンテキストを切り替えてインストールすれば良い。私は今、`sacluster` と `sasbrk` という二つのクラスタを持っている。現在使っているのが `sacluster` で`sasbrk` を追加したい場合は次の通り。ただし、コンテキストのが実施できるような設定がされているのが前提。詳細は、[こちら](https://qiita.com/TsuyoshiUshio@github/items/e1c4eca7e601bbeec088)。

```
$ kubectl config use-context sasbrk // コンテキストの切り替え
$ helm init // これで、client / server(tiller) がインストール。ある場合は、再インストール
```

ところが、実際にやると問題が起きた。サーバー(Tiller) のバージョンが古いらしい。

```
$ helm install stable/mongodb
Error: incompatible versions client[v2.7.0] server[v2.6.2]
$ helm version
Client: &version.Version{SemVer:"v2.7.0", GitCommit:"08c1144f5eb3e3b636d9775617287cc26e53dba4", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.6.2", GitCommit:"be3ae4ea91b2960be98c07e8f73754e67e87963c", GitTreeState:"clean"}
```

# Tillter のアップグレード

Tiller をアップグレードすることにした。docker コンテナのバージョンをあげているだけ。

```
$ export TILLER_TAG=v2.7.0
invincible:service-catalog ushio$ kubectl --namespace=kube-system set image deployments/tiller-deploy tiller=gcr.io/kubernetes-helm/tiller:$TILLER_TAG
$ helm install stable/mongo
```

# 動作確認

ちゃんと動いている。

```
$ helm list
NAME               	REVISION	UPDATED                 	STATUS  	CHART         	NAMESPACE
steely-waterbuffalo	1       	Sat Nov 18 23:59:37 2017	DEPLOYED	mongodb-0.4.18	default 
```

じゃあ、次にコンテキスト切り替えたらOKか？

```
$ kubectl config use-context sacluster
$ helm search mysql
NAME                  	VERSION	DESCRIPTION                                       
stable/mysql          	0.3.0  	Fast, reliable, scalable, and easy to use open-...
stable/percona        	0.3.0  	free, fully compatible, enhanced, open source d...
stable/gcloud-sqlproxy	0.2.1  	Google Cloud SQL Proxy                            
stable/mariadb        	2.0.1  	Fast, reliable, scalable, and easy to use open-...
$ helm install stable/mysql
$ helm list
NAME            	REVISION	UPDATED                 	STATUS  	CHART      	NAMESPACE
looming-aardvark	1       	Sun Nov 19 00:02:00 2017	DEPLOYED	mysql-0.3.0	default  
```
よし入った。再度切り替え。完璧。

```
$ kubectl config use-context sasbrk
$ helm list
NAME               	REVISION	UPDATED                 	STATUS  	CHART         	NAMESPACE
steely-waterbuffalo	1       	Sat Nov 18 23:59:37 2017	DEPLOYED	mongodb-0.4.18	default 
```

# ~/.helm ディレクトリ

一つ謎だったのが、`~/.helm` ディレクトリ。クライアント部分のディレクトリ。サーバーは、tiller が別のクラスタにそれぞれデプロイされる。

```
$ kubectl get pods --namespace kube-system
NAME                                            READY     STATUS    RESTARTS   AGE
heapster-342135353-2kzf7                        2/2       Running   0          1h
kube-addon-manager-k8s-master-27305297-0        1/1       Running   0          1h
kube-apiserver-k8s-master-27305297-0            1/1       Running   2          1h
kube-controller-manager-k8s-master-27305297-0   1/1       Running   0          1h
kube-dns-v20-3003781527-1p9kw                   3/3       Running   0          1h
kube-dns-v20-3003781527-51ld5                   3/3       Running   0          1h
kube-proxy-26h6f                                1/1       Running   0          1h
kube-proxy-fbmrb                                1/1       Running   0          1h
kube-proxy-k2rgn                                1/1       Running   0          1h
kube-proxy-r57gj                                1/1       Running   0          1h
kube-scheduler-k8s-master-27305297-0            1/1       Running   0          1h
kubernetes-dashboard-3617030121-bk9wv           1/1       Running   1          1h
tiller-deploy-2745651589-89q25                  1/1       Running   0          1h
```
コンテキストを変えると違うものが動いているのがわかる。

```
$ kubectl get pods --namespace kube-system
NAME                                    READY     STATUS    RESTARTS   AGE
heapster-342135353-02zrq                2/2       Running   0          4d
kube-dns-v20-1654923623-7v34r           3/3       Running   0          4d
kube-dns-v20-1654923623-x4qwq           3/3       Running   0          4d
kube-proxy-cd6dh                        1/1       Running   0          4d
kube-proxy-sqgds                        1/1       Running   0          4d
kube-proxy-szq0v                        1/1       Running   0          4d
kube-svc-redirect-v97v6                 1/1       Running   2          4d
kube-svc-redirect-vv3nt                 1/1       Running   0          4d
kube-svc-redirect-xq5vw                 1/1       Running   0          4d
kubernetes-dashboard-1672970692-plmdv   1/1       Running   0          4d
tiller-deploy-1114875906-n0x93          1/1       Running   0          3d
tunnelfront-653476575-bx1sl             1/1       Running   0          4d
```
しかし、ローカルの`~/.helm/` ディレクトリは共通のはず。

実際に、`~/.helm` の下をのぞいて見たが、各クラスタのはなかった。それらは、各tiller で管理していると思われる。だから、kubectl の context を切り替えるだけで切り替わる感じ。ローカルにあるのは、キャッシュだけの模様。

<img width="195" alt="Screen Shot 2017-11-19 at 12.22.15 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/7419b737-a1d9-c0d7-32e1-3292fa63abdd.png">

両方のクラスタでデプロイしたものが両方格納されている。キャッシュだけ共通という感じですね。

# Resource

* [Kubernetes の config フィアルをマージする](https://qiita.com/TsuyoshiUshio@github/items/e1c4eca7e601bbeec088)
* [Upgrading Tiller](https://github.com/kubernetes/helm/blob/master/docs/install.md)