Help us understand the problem. What is going on with this article?

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!⎈

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away