本記事は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のオプションである
tag
、condition
を利用することで、依存関係のChartを有効にするか無効にするかの制御ができる。 tag
やcondition
のboolean値は、親のvalues.yamlで定義する。
目次
検証環境
検証はDocker Desktop for WindowsのKubernetesで行いました。
1 2 3 |
$ 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
ファイルを作成します。
1 2 3 4 5 6 7 8 |
# file: requirements.yaml dependencies: - name: memcached version: 2.8.3 repository: "@stable" - name: redis version: 8.0.8 repository: "@stable" |
Chart.yaml
も作成します。
1 2 3 4 5 6 |
# 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ディレクトリにダウンロードされます。
1 2 3 4 5 6 7 8 |
$ 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
コマンドでインストールを実行します。
1 2 3 4 5 6 7 8 9 10 11 |
$ 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
コマンドで削除できます。
1 2 |
$ helm delete --purge test release "test" deleted |
それでは条件によって依存関係のChartをインストールしたくない場合は、どのようにしたらよいのでしょうか。
条件によって依存関係をインストールさせない方法
Helm Chartの依存関係はrequirements.yamlに定義します。requirements.yamlにはtag
とcondition
という2つのオプションがあります。本記事ではcondition
を利用して依存関係の有効、無効化を行う方法を紹介します。
はじめに先ほど用意したrequirements.yamlにcondition
を追加します。
1 2 3 4 5 6 7 8 9 10 |
# 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)ではないことに注意してください。
1 2 3 4 5 6 |
# file: values.yaml memcached: enabled: true redis: enabled: false |
この条件でインストールをしてみると、どのようになるでしょうか。
1 2 3 4 5 6 7 8 9 10 11 |
$ 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のオプションである
tag
、condition
を利用することで、依存関係のChartを有効にするか無効にするかの制御ができる。 tag
やcondition
のboolean値は、親のvalues.yamlで定義する。
さいごに
本記事ではHelm Chartの依存関係を条件によって制御する方法を紹介しました。コンテナはポータビリティがメリットの一つですが、ローカルの開発環境などは機能の制限などがあり本番環境の代替ソフトウェアが必要な場合があります。このような環境間の差異をアプリケーション開発者に意識させないために、今回紹介した依存関係の制御方法などを上手に活用していきたいですね。
投稿者プロフィール
最新の投稿
AWS2021年12月2日AWS Graviton3 プロセッサを搭載した EC2 C7g インスタンスが発表されました。
セキュリティ2021年7月14日ゼロデイ攻撃とは
セキュリティ2021年7月14日マルウェアとは
WAF2021年7月13日クロスサイトスクリプティングとは?