y-ohgi's blog

しがないSREなフリーランスの徒然

helm覚書

概要

Kubernetesのパッケージ管理ツール。LinuxでいうaptやyumのKubernetes版のイメージ。
公開されているManifestファイル(HelmではChartと呼ぶ。)をもとにアプリケーションをデプロイすることが可能
デフォルトで使用可能なChartは kubernetes/chartsstableディレクトリ で確認可能

構成要素

name description
helm 日本語で「舵」。helmのクライアントコマンド
tiller 日本語で「舵柄」。helmのサーバークライアント
chart 日本語で「海図」。helmのテンプレート
package 1つのアプリケーションとして成り立つchartの単位。この単位でデプロイを行う
release packageがデプロイされて、k8s上でpodとして実際に動作しているものを指す。
repository chartの置き場所。yumリポジトリのようなイメージ

Kubernetes: パッケージマネージャHelm - Qiita

デプロイの流れ

  1. デプロイしたいChartを記述(or repisitoryから探し)、packageを取得
  2. 1で取得したpackageをhelmコマンドでKubernetesへデプロイ
  3. tillerがhelmコマンドからのリクエストを受け取り、kube-apiserver経由でKubernetes上へ展開(release)

Hook

packageのデプロイ/アップデート/削除etcのライフサイクルの前後にフックをはさみ、処理を行うことも可能

helm/charts_hooks.md at master · kubernetes/helm

試す

環境

$ 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

参考