Ubuntu Weekly Recipe

第470回 Kubernetesのパッケージ管理ツール「Helm」

この記事を読むのに必要な時間:およそ 6 分

第469回ではKubernetesの環境を構築しました。今回はそのKubernetes上にソフトウェアスタックを構築する上で便利なパッケージ管理ツール「Helm」について紹介します。

Kubernetesでパッケージ管理ツールを使う理由

HelmはKubernetes用のパッケージ管理ツールです※1)⁠パッケージそのものは「Chart」と呼ばれるYAMLファイルの集合体で,独自のパッケージリポジトリとしてKubernetes Chartsを提供しています。

※1
EmacsにもHelmと呼ばれるパッケージが存在しますが,今回のHelmとは関係ありません。

UbuntuのAPTシステムでいうところのDebパッケージファイルがChartで,Kubernetes Chartsは公式パッケージリポジトリ,そのリポジトリやローカルシステムからDebパッケージファイルをダウンロード・インストールするコマンドがhelmだとイメージすれば良いでしょう。

Kubernetesにはその役割に応じてさまざまなリソースの概念が存在します。たとえばPodsはひとつないし複数のDockerコンテナを細分化不可なひとつのリソースとしてまとめたものですし,Servicesはレプリケーションされた複数のPodsが提供するサービスを抽象化するリソースです。Deploymentsはレプリケーションコントローラーとして,Podsの生死を監視し必要に応じてPodsの再起動を行います。また永続的なデータはVolumesで管理します。サービスやコンテナの実体を分離することで,サービスを維持したままPodsのアップデートやスケールを実現できるのです。

kubectlコマンドはこれら個々のリソースを区別することなく,kubectl create -f YAMLで一括して作成します。リソースごとにYAMLファイルを作成する場合もありますし,前回使用したGuestbookのall-in-oneのようにひとつのYAMLファイルにまとめることもできます。

ただし,実際にKubernetesのサンプルを使ってみるとわかるのですが,ソフトウェアスタックが提供するYAMLファイルをそのまま使えることはまれです。大抵の場合は,秘密鍵をどうするのか,ストレージはどのように準備するのか,ロードバランサーは何を使うのかなど,デプロイするサイト固有の環境に応じてYAMLファイルをカスタマイズする必要があります。

そこで出てくるのが今回紹介するHelmです。Helmでは,kubectlコマンドが使うYAMLファイルから設定可能な部分を別YAMLファイルとして分離できます。テンプレートエンジンを使って,インストール時にサイト固有の設定をkubectlコマンドに提供するYAMLファイルに反映するのです。また,Hook機能によってパッケージのライフサイクルや定義済みのイベントの途中に,別の処理を行うことも可能ですし,他のパッケージ(Chart)との依存関係も構築できます。

パッケージそのものはひとつのアーカイブファイルとして構築します。アクセス可能な箇所であればネットワーク越しにダウンロードしてインストールすることも可能ですし,git cloneしたディレクトリをインストール対象としても指定できます。またローカルパッケージリポジトリをKubernetes上に構築可能です。

いずれにせよKubernetesを使うのであれば,Helmの使い方もセットで覚えておくと,さまざまなソフトウェアスタックの作成・構築・削除が簡単になることでしょう。

Helmのインストールと初期設定

HelmそのものはGo言語で構築されたひとつのバイナリファイルとして提供されています。よってそのインストール方法は,最新のバイナリファイルをダウンロードしてbinディレクトリに展開するだけです。

$ wget https://storage.googleapis.com/kubernetes-helm/helm-v2.4.1-linux-amd64.tar.gz
$ tar xvf helm-v2.4.1-linux-amd64.tar.gz
$ cp linux-amd64/helm ~/bin/
$ which kubectl
/home/willem/bin/helm

Helmを使う前に,リポジトリなどのメタデータセットをホームディレクトリ以下に作成しhelm init)⁠Kubernetes Chartsのリポジトリデータをダウンロードしますhelm repo update)⁠

$ helm init
Creating /home/willem/.helm
Creating /home/willem/.helm/repository
Creating /home/willem/.helm/repository/cache
Creating /home/willem/.helm/repository/local
Creating /home/willem/.helm/plugins
Creating /home/willem/.helm/starters
Creating /home/willem/.helm/repository/repositories.yaml
$HELM_HOME has been configured at /home/willem/.helm.

Tiller (the helm server side component) has been installed into your Kubernetes Cluster.
Happy Helming!

$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈ Happy Helming!⎈

この時点でのリポジトリのパッケージリストは,~/.helm/repository/cache/stable-index.yamlです。

helm initによってローカルリポジトリサーバーにインスタンス(Tiller)が自動的にKubernetes上に構築されます※2)⁠

※2
「helm」は船の舵のうち操舵手(helmsman)が扱う機構(操舵輪や舵柄)を指します(水中にある舵は「rudder」⁠⁠tiller」は舵(rudder)の向きを変えるために主に小さな船にある取っ手(舵柄)です。このように海事関連の単語が使われているため「chart」はおそらく「海図」を意識しています。
$ kubectl --namespace=kube-system get pods
NAME                             READY     STATUS    RESTARTS   AGE
kube-dns-806549836-nmn71         3/3       Running   0          8d
tiller-deploy-1491950541-h3g40   1/1       Running   0          8m

$ kubectl --namespace=kube-system get services
NAME            CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
kube-dns        10.152.183.10    <none>        53/UDP,53/TCP   8d
tiller-deploy   10.152.183.252   <none>        44134/TCP       8m

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。

コメント

コメントの記入