こんにちは。KOUKIです。
とある企業でWebエンジニアをやっています。
前回は、HelmのTemplateについて学習をしました。
今回は、 Helm Chartの依存関係やライブラリ化、レポジトリについて深く学びましょう!
<目次>
検証環境
- helm v3
- mac
- minikube
Kubernetesに関しては、こちらも参考にしてください。
Dependencies
helm Chartをインストールする前に、使用できるチャートを検索する必要があるかと思います。
例えば、こんな感じにです。
1 2 3 4 5 6 7 8 |
$ helm search repo "redis" NAME CHART VERSION APP VERSION DESCRIPTION bitnami/redis 15.5.5 6.2.6 Open source, advanced key-value store. It is of... bitnami/redis-cluster 7.0.10 6.2.6 Open source, advanced key-value store. It is of... $ helm search repo "redis" --versions NAME CHART VERSION APP VERSION DESCRIPTION bitnami/redis 15.5.5 6.2.6 Open source, advanced key-value store. It is of... |
通常は、下記のコマンドでアプリをデプロイします。
1 |
helm install redis01 bitnamiii/redis |
しかし、Dependencies(依存)という形で、Chart.yamlに記載することができます。
以前作成したmyapp ChartのChart.yamlに下記を記載しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
apiVersion: v2 # 必須 - Helm3の場合はv2, Helm2の場合はv1 name: myapp # 必須 - Chartのタイトル description: A Helm chart for Kubernetes type: application version: 0.1.0 # 必須 - Chartのバージョン appVersion: "1.0.0" # アプリケーションのバージョン dependencies: - name: redis # 15.0.0.0 >= verrsion 16.0.0.0 version: ^15.x # 15.3.0 => version < 15.4.0 # version: ~15.3.x repository: https://charts.bitnami.com/bitnami |
下記のようにupdateします。
1 2 3 4 5 6 7 |
$ helm dependency update . Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "bitnami" chart repository Update Complete. ⎈Happy Helming!⎈ Saving 1 charts Downloading redis from repo https://charts.bitnami.com/bitnami Deleting outdated charts |
このコマンドが無事に実行されたら今まで空だったchartsディレクトリに下記のファイルができていることが確認できます。
1 2 3 |
$ tree charts/ charts/ └── redis-15.6.1.tgz |
更に、Chart.lockというファイルもできてます。
1 2 3 4 5 6 7 |
$ cat Chart.lock dependencies: - name: redis repository: https://charts.bitnami.com/bitnami version: 15.6.1 digest: sha256:269df04a0328a1ed1c792ccafd9804b2fd1b6d61cf429afd8167078243eb24ed generated: "2021-11-26T14:01:31.927949+09:00" |
これがあれば、勝手にバージョンアップされるといったことも無くなりそうですね。
chartsフォルダの中身を消してしまっても、buildで再作成できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ rm -rf charts/redis-15.6.1.tgz $ helm dependency build Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "bitnami" chart repository Update Complete. ⎈Happy Helming!⎈ Saving 1 charts Downloading redis from repo https://charts.bitnami.com/bitnami Deleting outdated charts $ tree charts/ charts/ └── redis-15.6.1.tgz |
また、Artifact HubのRedisに、「Redis™ master configuration parameters」というものがあります。
これは、コンテナに割り当てられているパラメーターの一覧のようです。
ここから知りたいパラメータを表示させることもできそうですね。
Library Charts
Helmには、Library Chartsというものがあります。
既に纏められたChartを他のChartで流用したいなど、再利用性が求められる場面で活躍します。
それでは、Libraryを自作しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# chartの作成 $ helm create libpolicy Creating libpolicy $ cd libpolicy/ # 破棄 $ rm -rf templates/* $ rm values.yaml # Chart.yalmのtypeをlibraryに変更 apiVersion: v2 name: libpolicy description: A Helm chart for Kubernetes # type: application type: library version: 0.1.0 appVersion: "1.16.0" # 適当なファイルを作成する $ touch templates/_imagepullpolicy.tpl # 中身を記述 {{- define "libpolicy.imagePullPolicy" -}} {{- $environment := default "production" .Values.environment }} {{- if not (eq $environment "production") }} {{- "IfNotPresent" }} {{- else }} {{- "Always" }} {{- end }} {{- end}} $ tree . ├── Chart.yaml ├── charts └── templates └── _imagepullpolicy.tpl |
libpolicy Libraryを作成しました。これをmyApp Chartから利用します。
ちなみに今のフォルダ構成はこんな感じになっているので、myappに移動しておいて下さい。
1 2 3 4 5 6 7 |
$ tree -L 1 . ├── libpolicy ├── myapp └── playground cd myapp |
Chart.yamlを開いて、libpolicyを追加して下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
apiVersion: v2 name: myapp description: A Helm chart for Kubernetes type: application version: 0.1.0 appVersion: "1.0.0" dependencies: - name: redis version: ^15.x repository: https://charts.bitnami.com/bitnami import-values: - child # libpolicy - name: libpolicy version: 0.1.0 repository: file://../libpolicy |
依存関係をアップデートします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$ helm dependency update Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "bitnami" chart repository Update Complete. ⎈Happy Helming!⎈ Saving 2 charts Downloading redis from repo https://charts.bitnami.com/bitnami Deleting outdated charts # Chart.lockを元にリビルド $ helm dependency build . Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "bitnami" chart repository Update Complete. ⎈Happy Helming!⎈ Saving 2 charts Downloading redis from repo https://charts.bitnami.com/bitnami Deleting outdated charts $ tree charts/ charts/ ├── libpolicy-0.1.0.tgz └── redis-15.6.1.tgz |
おお、すごいですね。Chartごとにモジュールっぽくするのもありかもですね。
Helmレポジトリを作成する
ローカルに自分専用のHelm レポジトリを作成しましょう。
1 2 3 4 5 6 7 |
$ mkdir myrepo $ tree -L 1 . ├── libpolicy ├── myapp ├── playground └── myrepo |
myappフォルダに移動して、helm packageコマンドを実行します。
1 2 3 4 5 6 7 8 |
$ cd myapp $ helm package --destination ../myrepo/ . Successfully packaged chart and saved it to: ../myrepo/myapp-0.1.0.tgz $ ls -l ../myrepo/ total 176 -rw-r--r-- 1 hoge staff 89916 11 27 04:51 myapp-0.1.0.tgz |
myapp Chartがパッケージングされました。
続いて、以下のコマンドを実行します。
1 2 3 4 5 6 7 |
# myrepoのindex.yamlファイルを生成する $ helm repo index ../myrepo/ $ ls -l ../myrepo/ total 184 -rw-r--r-- 1 hoge staff 605 11 27 04:53 index.yaml -rw-r--r-- 1 <meta charset="utf-8">hoge staff 89916 11 27 04:51 myapp-0.1.0.tgz |
index.yamlが生成されました。これは一体何なのでしょうか?
中身を見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
apiVersion: v1 entries: myapp: - apiVersion: v2 appVersion: 1.0.0 created: "2021-11-27T04:53:38.326863+09:00" dependencies: - import-values: - child name: redis repository: https://charts.bitnami.com/bitnami version: ^15.x - name: libpolicy repository: file://../libpolicy version: 0.1.0 description: A Helm chart for Kubernetes digest: 639b006774efbd451b68c2f79dc8453231bf14968624aaa0761f51d2b3141e94 name: myapp type: application urls: - myapp-0.1.0.tgz version: 0.1.0 generated: "2021-11-27T04:53:38.317439+09:00" |
myapp Chartの詳細が載ってますね。特に「repository」の箇所が重要で、どこにChartが存在しているか記述されています。これによりダウンロードができる様ですね。
ちなみに、「https://charts.bitnami.com/bitnami」をブラウザからアクセスするとAccessDeniedの画面になります。

しかし、「https://charts.bitnami.com/bitnami/index.yaml」をブラウザに打つこむと、myappのindex.yamlと同様にレポジトリ情報が記されたyamlファイルをダウンロードすることが可能です。
続いて、以下のコマンドを実行して下さい。
1 2 3 4 5 |
$ cd ../myrepo $ docker run -d -p 80:80 -v $(pwd):/usr/local/apache2/htdocs/ httpd $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b2e07ded712c httpd "httpd-foreground" 19 seconds ago Up 15 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp friendly_mclean |
apacheを立てました。ブラウザから「http://localhost/」にアクセスしましょう。

これがレポジトリになるのです。
1 2 3 4 5 6 7 |
# レポジトリを追加 $ helm repo add myrepo http://localhost "myrepo" has been added to your repositories $ helm search repo "myapp" NAME CHART VERSION APP VERSION DESCRIPTION myrepo/myapp 0.1.0 1.0.0 A Helm chart for Kubernetes |
Greatですね。こいつは。
現在、myapp01が動いているので、一旦削除します。
1 2 3 4 5 6 |
$ helm list NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION myapp01 default 6 2021-11-26 05:12:25.89613 +0900 JST deployed playground-0.1.0 2.0.0 $ helm uninstall myapp01 release "myapp01" uninstalled |
続いて、myrepoからmyappをデプロイしましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# rootに戻る $ cd .. $ helm install myapp01 myrepo/myapp dependencies.go:260: Warning: ImportValues missing table: "exports" is not a table NAME: myapp01 LAST DEPLOYED: Sat Nov 27 05:08:49 2021 NAMESPACE: default STATUS: deployed REVISION: 1 NOTES: $ helm list NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION myapp01 default 1 2021-11-27 05:08:49.677307 +0900 JST deployed myapp-0.1.0 1.0.0 |
大丈夫そうですね。Warningが出てますが、何か設定が漏れてるのかも。。
次に、バージョンアップを試してみましょう。
myappのChart.yamlの下記のバージョンをあげて下さい。
1 2 |
# version: 0.1.0 version: 0.2.0 |
パッケージングします。
1 2 3 4 |
$ cd myapp/ $ helm package --destination ../myrepo/ . Successfully packaged chart and saved it to: ../myrepo/myapp-0.2.0.tgz $ helm repo index ../myrepo |
index.yamlを見ると「0.2.0」が追加されていることがわかります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
apiVersion: v1 entries: myapp: - apiVersion: v2 appVersion: 1.0.0 created: "2021-11-27T05:14:52.808927+09:00" dependencies: - import-values: - child name: redis repository: https://charts.bitnami.com/bitnami version: ^15.x - name: libpolicy repository: file://../libpolicy version: 0.1.0 description: A Helm chart for Kubernetes digest: 4681eeadb526623ebcf185f663dc26d32780c2fadd404ae5a20db258914bd0fd name: myapp type: application urls: - myapp-0.2.0.tgz version: 0.2.0 - apiVersion: v2 appVersion: 1.0.0 created: "2021-11-27T05:14:52.80283+09:00" dependencies: - import-values: - child name: redis repository: https://charts.bitnami.com/bitnami version: ^15.x - name: libpolicy repository: file://../libpolicy version: 0.1.0 description: A Helm chart for Kubernetes digest: 639b006774efbd451b68c2f79dc8453231bf14968624aaa0761f51d2b3141e94 name: myapp type: application urls: - myapp-0.1.0.tgz version: 0.1.0 generated: "2021-11-27T05:14:52.793339+09:00" |
レポジトリをアップデートします。
1 2 3 4 5 6 7 8 9 10 |
$ helm repo update Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "myrepo" chart repository ...Successfully got an update from the "bitnami" chart repository Update Complete. ⎈Happy Helming!⎈ $ helm search repo "myapp" --versions NAME CHART VERSION APP VERSION DESCRIPTION myrepo/myapp 0.2.0 1.0.0 A Helm chart for Kubernetes myrepo/myapp 0.1.0 1.0.0 A Helm chart for Kubernetes |
バージョンアップできましたね!
CI/CDパイプラインに組み込みたい
先ほど作成したパッケージをCI/CDパイプライン組み込みたいときの簡単な手順です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# myappにいる $ pwd /Users/hoge/Desktop/helm/mycharts/myapp # ルートにjobフォルダを作成する $ mkdir ../job # jobフォルダに移動 $ cd ../job/ # ファイルをコピー $ cp ../myrepo/myapp-0.2.0.tgz ../myrepo/index.yaml . # ファイル名を変更(これからindexコマンドを実行するので上書きされないように) $ mv index.yaml index-original.yaml # indexコマンドを発行 $ helm repo index . # 差分をマージする $ helm repo index . --merge index-original.yaml |
こんな感じで、index.yamlを作ってやると組み込めそうですね。
AWS S3をレポジトリ化する(補足)
AWS S3のようなストレージをレポジトリ化したい場合、以下のように行います。
※動作検証はしてません
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# バケットを作成 aws s3 mb s3://mycharts # 静的Webサイトのホスティング(実行後、policy.jsonが作成される) aws s3 website s3://mycharts --index-document index.html --error-document error.html # policyをアップロード aws s3api put-bucket-policy --bucket mycharts --policy file://policy.json # myrepoに移動 cd myrepo # アップロード aws s3 cp index.yaml s3://mycharts/ <meta charset="utf-8">aws s3 cp myapp-0.1.0.tgz s3://mycharts/ <meta charset="utf-8">aws s3 cp myapp-0.2.0.tgz s3://mycharts/ # レポジトリを追加する(urlは変更する必要がある) helm repo add mywebcharts http://mycharts.s3-website-us-east-1.amazonaws.com # 確認 helm repo list helm search repo "myapp" --versions |
おわりに
初学者向けの記事は、本記事で終わりになります。
HELMのだいたいの機能は理解できたのではないでしょうか。
後は学習した知識を実務に応用していくだけです。お互い、頑張りましょうね^^
それでは、また!
コメントを残す
コメントを投稿するにはログインしてください。