[Helm]依存関係(dependency)のあるChartをインストールしない方法

本記事はHelmの依存関係(dependency)を条件によって、有効もしくは無効にしたいと考えている人を対象としています。

はじめに

HelmはKubernetesのパッケージ管理ソフトウェアです。Helm Hubと呼ばれるChartのリポジトリを利用することで、Kubernetesの利用で手間がかかるマニフェストファイルの作成や確認を楽にすることができます。Helm Hubを活用する方法のひとつとして、dependencyがあります。

Helmでは、依存関係のあるChartをdependencyとして記述することで、Chartの依存関係を定義することができます。例えばwordpressというChartにNginxとMySQLのChartが必要な場合、dependencyとしとnginxとmysqlのChartを定義します。

しかし、環境によっては依存関係がいらない場合もあります。例えば、Ingressを使う場合、開発環境では依存関係としてNginx Ingressが必要だが、本番環境ではNginx Ingressはいらな場合などです。

本記事ではHelmのdependencyを条件によって有効もしくは無効にする方法を紹介します。

TL;DR

  • Helm Chartの依存関係はrequirements.yamlに定義する。
  • requirements.yamlのオプションであるtagconditionを利用することで、依存関係のChartを有効にするか無効にするかの制御ができる。
  • tagconditionのboolean値は、親のvalues.yamlで定義する。

目次

  1. 検証環境
  2. Helm Chartの依存関係の定義方法
  3. 条件によって依存関係をインストールさせない方法
  4. まとめ
  5. さいごに

検証環境

検証はDocker Desktop for WindowsのKubernetesで行いました。

$ kubectl version --short
Client Version: v1.14.1
Server Version: v1.10.11

Helm Chartの依存関係の定義方法

はじめにHelm Chartでの依存関係の定義方法を確認しておきましょう。Chart名はdependencyとし、任意のdependencyディレクトリで以下の作業をおこないます。

Helm ChartではChartの依存関係をrequirements.yamlファイルの記述します。dependencyディレクトリにrequirements.yamlファイルを作成します。

# file: requirements.yaml
dependencies:
  - name: memcached
    version: 2.8.3
    repository: "@stable"
  - name: redis
    version: 8.0.8
    repository: "@stable"

Chart.yamlも作成します。

# file: Chart.yaml
apiVersion: v1
appVersion: "1.0"
description: A Helm chart for Kubernetes
name: dependency
version: 0.1.0

helm dependency updateコマンドでChartの依存関係を更新します。コマンドを実行すると依存関係で定義したChartがchartsディレクトリにダウンロードされます。

$ helm dependency update .
...(省略)...
...Successfully got an update from the "stable" chart repository
Update Complete. ?Happy Helming!?
Saving 2 charts
Downloading memcached from repo https://kubernetes-charts.storage.googleapis.com
Downloading redis from repo https://kubernetes-charts.storage.googleapis.com
Deleting outdated charts

helm installコマンドでインストールを実行します。

$ helm install --name test .
NAME:   test
...(省略)...

==> v1/Pod(related)
NAME                 READY  STATUS             RESTARTS  AGE
test-memcached-0     0/1    ContainerCreating  0         1s
test-redis-master-0  0/1    Pending            0         1s
test-redis-slave-0   0/1    Pending            0         0s

...(省略)...

依存関係に定義したMemcachedとRedisのインストールが実行されています。このように通常は依存関係に定義したChartのすべてがインストールされます。

依存関係の確認ができたら、インストールしたChartを削除しておきましょう。依存関係のあるChartも通常のChartと同じくhelm deleteコマンドで削除できます。

$ helm delete --purge test
release "test" deleted

それでは条件によって依存関係のChartをインストールしたくない場合は、どのようにしたらよいのでしょうか。

条件によって依存関係をインストールさせない方法

Helm Chartの依存関係はrequirements.yamlに定義します。requirements.yamlにはtagconditionという2つのオプションがあります。本記事ではconditionを利用して依存関係の有効、無効化を行う方法を紹介します。

はじめに先ほど用意したrequirements.yamlにconditionを追加します。

# file: requirements.yaml
dependencies:
  - name: memcached
    version: 2.8.3
    repository: "@stable"
    condition: memcached.enabled
  - name: redis
    version: 8.0.8
    repository: "@stable"
    condition: redis.enabled

次に、values.yamlファイルを用意します。enabledはbooleanの値を指定します。values.yamlは依存元(親)のファイルで、依存Chartのvalues.yaml(この例の場合はmemcachedもしくはredis)ではないことに注意してください。

# file: values.yaml
memcached:
  enabled: true

redis:
  enabled: false

この条件でインストールをしてみると、どのようになるでしょうか。

$ helm install --name test .
NAME:   test
...(省略)...

RESOURCES:
==> v1/Pod(related)
NAME              READY  STATUS             RESTARTS  AGE
test-memcached-0  0/1    ContainerCreating  0         1s

==> v1/Service
...(省略)...

tureに設定したMemcachedだけインストールされ、falseに設定したRedisはインストールされませんでした。このようにrequirements.yamlのconditonを指定することにより、条件に応じて依存関係のChartのインストールを行うことができます。

memcached.enabled redis.enabled installed
true true memcahced, redis
true false memcached
false true redis
false false None

その他の依存関係を制御しているHelmチャートのサンプルを、以下のURLで公開しています。
https://github.com/easydoggie/EasyDoggie/tree/master/ingress/ingress
このチャートは条件によってNginx-Ingressのインストールの有無を制御しています。
インストール方法の詳細は、別ページを参照してください。

まとめ

  • Helm Chartの依存関係はrequirements.yamlに定義する。
  • requirements.yamlのオプションであるtagconditionを利用することで、依存関係のChartを有効にするか無効にするかの制御ができる。
  • tagconditionのboolean値は、親のvalues.yamlで定義する。

さいごに

本記事ではHelm Chartの依存関係を条件によって制御する方法を紹介しました。コンテナはポータビリティがメリットの一つですが、ローカルの開発環境などは機能の制限などがあり本番環境の代替ソフトウェアが必要な場合があります。このような環境間の差異をアプリケーション開発者に意識させないために、今回紹介した依存関係の制御方法などを上手に活用していきたいですね。

投稿者プロフィール

石川 淳
スカイアーチネットワークスで、新しいサービスの企画を行っています。
元SIer、元スマフォ向けゲームインフラの経験を生かして、新しいサービスをリリースしていきます。現在企画中のサービスはこちら。
https://github.com/easydoggie
コメントを頂けると嬉しいです。

ABOUTこの記事をかいた人

スカイアーチネットワークスで、新しいサービスの企画を行っています。 元SIer、元スマフォ向けゲームインフラの経験を生かして、新しいサービスをリリースしていきます。現在企画中のサービスはこちら。 https://github.com/easydoggie コメントを頂けると嬉しいです。