kubernetes

helmの過去、現在、未来

More than 1 year has passed since last update.


はじめに

Kubernetesのhelmご存知でしょうか?

helmは、aptyumの様なKubernetes版パッケージマネージャです。

今年の6月ごろにk8s meetup Tokyo #2でhelmの話をした時はまだ使える状態ではなく

helmの元となっているDeisのhelm-classicをオススメしていました。[参照]

現在のhelmバージョンは2.1.3、十分に使るようになってます。

helm-classicにはPetSetScheduledJobなど新機能に対応し無いのでhlemへの移行をオススメします。


用語

読み進めていくにあたり最低限必要な用語の定義です。

Name
Description

Package

Jenkins, Sparkなどのhelmを使ってk8s上にインストールアプリケーション

Chart
パッケージを構築するために必要になService/Deployment/ConfigMapなどのYAML(JSON)のファイル群

Release
k8s上にインストールされたパッケージ


使いかた


helmをインストールする

インストール方法はGithubのreleaseページからディストリビューションにあったバイナリを落としてきてよしなに配置するだけ。

ただし、初回のみ初期設定コマンドの実行が必要になります。

helm init

を実行すると$HOME/.helmディレクトリの中に設定ファイルが配置され

tailerがk8s上にコンテナとして起動します。(こちらの詳細は次章)


注意

kubectlがhelm initを実行する環境に設定されていること

k8sはバージョン1.4以降であること



レポジトリを確認する

パッケージの追加の前に一旦レポジトリの確認とアップデートをしておきます。

デフォルトはGCPを向いてますが、この中身はchartsで管理されています。

# レポジトリの一覧表示

$ helm repo list
NAME URL
stable https://kubernetes-charts.storage.googleapis.com/
local http://127.0.0.1:8879/charts

# レポジトリのアップデート
$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈ Happy Helming!⎈

レポジトリ一覧の中にlocalが含まれていますが、単純に該当アドレスにアクセスしても繋がりません。

これを動かすためにはserveコマンドを実行する必要があります。

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

# デフォルトでは起動していない

$ curl http://127.0.0.1:8879/charts
curl: (7) Failed to connect to 127.0.0.1 port 8879: Connection refused

# ローカルのchartsサーバを起動する
$ helm serve
Regenerating index. This may take a moment.
Now serving you on 127.0.0.1:8879

# 別のプロンプト上で実行
$ curl localhost:8879
<html>
<head>
<title>Helm Repository</title>
</head>
<h1>Helm Charts Repository</h1>
<ul>

</ul>
<body>
<p>Last Generated: 2016-12-25 17:40:23.95566401 &#43;0900 JST</p>
</body>
</html>


k8sにパッケージをインストールする

試しにgrafanaをk8sにインストールしてみます。

名前がわからないのでとりあえずsearchコマンドを実行。

# searchになにも引数を渡さないと全パッケージが表示されます

$ helm search grafana
NAME VERSION DESCRIPTION
stable/grafana 0.2.0 A Helm chart for Kubernetes

stabl/grafanaというのが見つかりました。

このstableという部分は、レポジトリ名と一致しています。

よって、前章で出てきたstableレポジトリの中に存在していることが分かります。

では、これをinstallコマンドでk8s上に立ち上げてみます。

# grafanaをインストールする

$ helm install stable/grafana

NAME: auxilliary-leopard
LAST DEPLOYED: Sun Dec 25 17:57:19 2016
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Service
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
auxilliary-leopard-grafana 10.108.32.18 <none> 80/TCP 1s

==> extensions/Deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
auxilliary-leopard-grafana 1 1 1 0 1s

==> v1/PersistentVolumeClaim
NAME STATUS VOLUME CAPACITY ACCESSMODES AGE
auxilliary-leopard-grafana Pending 1s

==> v1/Secret
NAME TYPE DATA AGE
auxilliary-leopard-grafana Opaque 2 1s

==> v1/ConfigMap
NAME DATA AGE
auxilliary-leopard-grafana-config 1 1s
auxilliary-leopard-grafana-dashs 0 1s

NOTES:
1. Get your 'admin' user password by running:

printf $(printf '\%o' `kubectl get secret --namespace default auxilliary-leopard-grafana -o jsonpath="{.data.grafana-admin-password[*]}"`);echo

2. The Grafana server can be accessed via port 80 on the following DNS name from within your cluster:

auxilliary-leopard-grafana.default.svc.cluster.local

Get the Grafana URL to visit by running these commands in the same shell:

export POD_NAME=$(kubectl get pods --namespace default -l "app=auxilliary-leopard-grafana,component=grafana" -o jsonpath="{.items[0].metadata.name}")
kubectl --namespace default port-forward $POD_NAME 3000

3. Login with the password from step 1 and the username: admin

# k8s上で立ち上がっていることを確認する
$ kubectl get po
NAME READY STATUS RESTARTS AGE
auxilliary-leopard-grafana-2846005379-p35ss 0/1 Running 0 2m

# helmでリリースしたものを一覧表示する
$ helm list
NAME REVISION UPDATED STATUS CHART
auxilliary-leopard 1 Sun Dec 25 17:57:19 2016 DEPLOYED grafana-0.2.0

# ステータスを表示する
$ helm status auxilliary-leopard
LAST DEPLOYED: Sun Dec 25 17:57:19 2016
NAMESPACE: default
~~ 省略 ~~

インストールを実行すると、

grafanaでは、Service/Deployment/PersistentVolumeClaim/Secret/ConfigMapの5つが追加されました。

これは、標準出力に吐き出されるリソースの一覧からわかります。

また、listコマンドでリリースしたパッケージを一覧や、statusで単体の状態を見ることができます。


helmのアーキテクチャ


思想とライフサイクル

helm12FactorAppに則っていて、Chart(Template + Config)をRelaseとして管理されています。

Releaseはupgradeコマンドで修正内容の適用、問題があればrollbackコマンドで元に戻すこともできます。

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, Repository, tillerの3つです。

helmChartの、tillerReleaseの管理を行っていて、ざっくり機能を挙げるとこんな感じ。


Helm


  • ローカルのchart開発

  • レポジトリの管理


  • Tillerサーバとの通信


    • インストールするchartの送信


    • Release情報の取得


    • Releaseに対するアップグレードやアンインストールの要求




Tiller


  • Helmクライアントからのリクエスト受付


  • chartconfigurationを組み合わせたreleaseのビルド


  • chartをk8sへインストールし、releaseをトラックする

  • k8sへchartのアップグレードとアンインストールをする

image

helmtiller間の通信はgRPCが使用されていて、tillerがgRPCサーバの役目をもっています。

k8stailler間は単純にK8sのクライアントライブラリを叩いているのでREST+JSONで通信されています。

また、tillerの情報はk8sのConfigMapに保存されているので、DBは保持していません。


力尽きたのでここら辺で止めておきます。

Chartsの作り方やhelmcからの移行はまたどこかで...



今後どうなるのか?

ロードマップはGithubのWikiで公開されてます。

https://github.com/kubernetes/helm/wiki/Roadmap

大きな変更としては、Manページを作れるようにするdocコマンドやレポジトリへの認証機能の追加です。


おわりに

helmは開発も活発なので今後もどんどん便利になっていきそうです。

⎈ Happy Helming!⎈