概要
Kubernetesのパッケージ管理ツール。LinuxでいうaptやyumのKubernetes版のイメージ。
公開されているManifestファイル(HelmではChartと呼ぶ。)をもとにアプリケーションをデプロイすることが可能
デフォルトで使用可能なChartは kubernetes/charts の stableディレクトリ で確認可能
構成要素
name | description |
---|---|
helm | 日本語で「舵」。helmのクライアントコマンド |
tiller | 日本語で「舵柄」。helmのサーバークライアント |
chart | 日本語で「海図」。helmのテンプレート |
package | 1つのアプリケーションとして成り立つchartの単位。この単位でデプロイを行う |
release | packageがデプロイされて、k8s上でpodとして実際に動作しているものを指す。 |
repository | chartの置き場所。yumのリポジトリのようなイメージ |
デプロイの流れ
- デプロイしたいChartを記述(or repisitoryから探し)、packageを取得
- 1で取得したpackageをhelmコマンドでKubernetesへデプロイ
- tillerがhelmコマンドからのリクエストを受け取り、kube-apiserver経由でKubernetes上へ展開(release)
Hook
packageのデプロイ/アップデート/削除etcのライフサイクルの前後にフックをはさみ、処理を行うことも可能
helm/charts_hooks.md at master · kubernetes/helm
試す
環境
- macOS Sierra
- GKE v1.8.8-gke.0
- helm v2.9.0
$ helm version Client: &version.Version{SemVer:"v2.9.0", GitCommit:"f6025bb9ee7daf9fee0026541c90a6f557a3e0bc", GitTreeState:"clean"} Server: &version.Version{SemVer:"v2.9.0", GitCommit:"f6025bb9ee7daf9fee0026541c90a6f557a3e0bc", GitTreeState:"clean"} $ kubectl version Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.1", GitCommit:"d4ab47518836c750f9949b9e0d387f20fb92260b", GitTreeState:"clean", BuildDate:"2018-04-13T22:29:03Z", GoVersion:"go1.9.5", Compiler:"gc", Platform:"darwin/amd64"} Server Version: version.Info{Major:"1", Minor:"8+", GitVersion:"v1.8.8-gke.0", GitCommit:"6e5b33a290a99c067003632e0fd6be0ead48b233", GitTreeState:"clean", BuildDate:"2018-02-16T18:26:58Z", GoVersion:"go1.8.3b4", Compiler:"gc", Platform:"linux/amd64"}
Install
brewでインストール
$ brew install kubernetes-helm
現在選択しているKubernetesクラスターのcontextに対してtillerのインストールを実行
$ kubectl create serviceaccount --namespace kube-system tiller $ kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller $ helm init --service-account tiller $ helm ls # 何も返ってこなければ成功。 lsを打つのがはやすぎる場合 "Error: could not find a ready tiller pod" と返ってくる
インストール可能なチャートを一覧する
$ helm search
Spinnakerを動かしてみる
$ helm install -n my-spinnaker stable/spinnaker # 出力されたコマンドの通り `export` と `kubectl port-forward` を実行
動かしたSpinnakerを削除する
$ helm delete my-spinnaker
helmの削除
$ helm reset
or
$ kubectl delete deploy tiller-deploy -n kube-system $ kubectl delete svc tiller-deploy -n kube-system
troubles shooting
ゾンビpod(?)を消す
helm create
のタイムアウトと、 helm delete
のタイムアウトと、 nodeのオートスケール設定を変更した時にゾンビpodが出来上がった
対応
helmで上げたリソースを全消しで対応
$ export HELM_RESOURCE_NAME kubectl get pods <HELM POD NAME> -o=jsonpath='{.metadata.labels.app}' $ kubectl delete po,svc,deploy,job -l app=$HELM_RESOURCE_NAME
job を見逃してたため焦った
no available release name found
$ helm install . Error: no available release name found
対応
権限不足により出力されるエラー
$ helm init
の際に適切な権限を持ったserviceaccountを指定してあげることで解決
Chart requires kubernetesVersion
https://github.com/kubernetes/helm/tree/master/docs/examples/nginx を試そうとした時に出力された
$ helm install . Chart requires kubernetesVersion: 1.2.0 which is incompatible with Kubernetes v1.9.7-gke.0
対応
GKEのKubernetesはバージョンにサフィックスが付いている通り、GKEに最適化されたものが使用されている模様
そのため、バージョン情報を削除することで対応
https://github.com/kubernetes/helm/blob/master/docs/examples/nginx/Chart.yaml#L4