第469回ではKubernetesの環境を構築しました。今回はそのKubernetes上にソフトウェアスタックを構築する上で便利なパッケージ管理ツール
Kubernetesでパッケージ管理ツールを使う理由
「Helm」
- ※1
- EmacsにもHelmと呼ばれるパッケージが存在しますが,
今回のHelmとは関係ありません。
UbuntuのAPTシステムでいうところのDebパッケージファイルがChartで,helm
だとイメージすれば良いでしょう。
Kubernetesにはその役割に応じてさまざまなリソースの概念が存在します。たとえば
kubectl
コマンドはこれら個々のリソースを区別することなく,kubectl create -f YAML
」
ただし,
そこで出てくるのが今回紹介するHelmです。Helmでは,kubectl
コマンドが使うYAMLファイルから設定可能な部分を別YAMLファイルとして分離できます。テンプレートエンジンを使って,kubectl
コマンドに提供するYAMLファイルに反映するのです。また,
パッケージそのものはひとつのアーカイブファイルとして構築します。アクセス可能な箇所であればネットワーク越しにダウンロードしてインストールすることも可能ですし,git clone
したディレクトリをインストール対象としても指定できます。またローカルパッケージリポジトリをKubernetes上に構築可能です。
いずれにせよKubernetesを使うのであれば,
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
),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/
です。
helm init
によってローカルリポジトリサーバーにインスタンス
- ※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