Helm@マニフェスト管理¶
はじめに¶
本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。
01. Helmの仕組み¶
アーキテクチャ¶
Helm は、helm クライアント、チャートレジストリ、複数のチャートリポジトリ、チャート、といったコンポーネントから構成される。

バージョン管理戦略¶
▼ バージョン管理戦略とは¶
Helm の Helm リリースでは、バージョン管理に関する戦略を採用している。
▼ 2方向の戦略的マージパッチ¶
Helm の v2 では、2 方向の戦略的マージパッチを採用している。
この戦略では、『前回の Helm リリースによるマニフェスト』『今回の Helm リリースによるマニフェスト』の 2 つを比較する。
そのため、Helm 以外の方法 (例:kubectl edit コマンド、kubectl apply コマンド) でマニフェストが変更されたことを検知できず、チャートの宣言通りに Helm リリースやロールバックを実施できなかった。
▼ 3方向の戦略的マージパッチ¶
Helm の v3 では、3 方向の戦略的マージパッチを採用している。
この戦略では、『前回の Helm リリースによるマニフェスト』『今回の Helm リリースのマニフェスト』『前回の Helm リリース後の Helm 以外の方法によるマニフェスト』の 3 つを比較する。
そのため、Helm 以外の方法 (例:kubectl edit コマンド、kubectl apply コマンド) でマニフェストが変更されたことを検知でき、チャートの宣言通りに Helm リリースやロールバックを実施できる。
ただし、すでに Helm 以外 (例:kubectl apply コマンド、Kustomize) で作成されているマニフェストから Helm に移行する場合、前回の Helm リリースによるマニフェスト自体が存在せず、新規の Helm リリースとなる。
そのため、チャートと現在のマニフェストと比較できない。
02. helmクライアント¶
helmクライアントとは¶
helm クライアントは、リポジトリからインストールしたチャートアーカイブ (.tgz 形式ファイル) に基づいて、現在のコンテキストで指定されている Cluster の kube-apiserver にリクエストを送信する。
これにより、Kubernetes 上に Kubernetes リソースを作成する。
バージョン¶
Helm は、バージョンごとに対応する Kubernetes バージョンが異なる。
Kubernetes をアップグレードした場合に、Helm もアップグレードする必要がある。
注意点として、Helm が対応する Kubernetes のバージョンに応じて、Helm テンプレートの異なるロジックに入る可能性がある。
このロジックでは、Kubernetes の新しいバージョンでコントロールプレーンコンポーネントに変更があった場合に、それに対応するような処理を実行する。
03. チャートレジストリ¶
チャートレジストリとは¶
チャートレジストリとして使用できるものの一覧を示す。
チャートレジストリ内にリポジトリを配置する。
| レジストリ | 補足 |
|---|---|
| ArtifactHub (Helm公式) | ・https://helm.sh/docs/topics/chart_repository/ |
| GitHub、GitHub Pages | ・https://zenn.dev/mikutas/articles/2ab146fa1ea35b |
| AWSリソース (ECR、S3) | |
| Google Cloudリソース |
04. チャートリポジトリ¶
チャートリポジトリとは¶
チャートをリモートに配置して、インストールできるようになる。
チャートのプッシュやプル時に、チャートレジストリ内のリポジトリを指定する場合は、HTTPS プロトコルを使用する。
リポジトリにリモートからインストールできないチャートが配置されている場合、そのリポジトリはチャートリポジトリではなく、マニフェストリポジトリである。
| URL | |
|---|---|
| 形式 | https://<チャートレジストリのドメイン名>/<チャートリポジトリ名> |
| 例 | https://example.com/foo-chart |
OCIリポジトリ¶
チャートリポジトリのように、リモートにあるチャートをインストールできるようになる。
チャートのプッシュやプル時に、OCI レジストリ内のリポジトリを指定する場合は、OCI プロトコルを使用する。
| URL | |
|---|---|
| 形式 | oci://<チャートレジストリ名>/<チャートリポジトリ名> |
| 例 | oci://foo-registry/foo-repository |
チャートリポジトリ化¶
▼ リポジトリをチャートリポジトリとして扱う場合¶
リポジトリをチャートリポジトリとして扱う場合、チャートリポジトリのルートディレクトリ配下に、index.yaml ファイル、各バージョンのチャートアーカイブ (.tgz 形式ファイル) を配置する。
これらにより、リモートからチャートリポジトリの URL を指定し、チャートをインストールできるようになる。
ArtifactHub や、GitHub リポジトリにて gh-pages ブランチ上で複数のバージョンのチャートを管理するような使い方は、このチャートリポジトリに相当する。
repository/ # チャートリポジトリ
├── index.yaml
├── foo-chart-1.0.0.tgz # fooチャートアーカイブ
├── foo-chart-2.0.0.tgz
├── bar-chart-1.0.0.tgz # barチャートアーカイブ
├── bar-chart-2.0.0.tgz
├── baz-chart-1.0.0.tgz # bazチャートアーカイブ
├── baz-chart-2.0.0.tgz
│
...
▼ リポジトリをマニフェストリポジトリとしてのまま扱う場合¶
リポジトリをチャートリポジトリとして扱わず、ローカルのチャートとして操作する場合、index.yaml ファイルとチャートアーカイブ (.tgz 形式ファイル) が不要になる。
リモートからは、チャートをインストールできない。
repository/ # マニフェストリポジトリ
├── foo-chart # fooチャート
├── bar-chart # barチャート
├── baz-chart # bazチャート
│
...
05. チャート¶
チャートとは¶
必要な Kubernetes リソースを作成するためのマニフェストのセットをパッケージ化し、管理しやすくしたもの。
ルートディレクトリに Chart.yaml ファイルと template ディレクトリを配置する必要がある。
また、チャートのコントリビュート要件も参考にすること。
repository/
├── foo-chart/ # fooチャート
│ ├── charts/ # 依存対象のサブチャートを配置する。
│ ├── templates/ # ユーザー定義のチャートを配置する。ディレクトリ構造は自由である。
│ │ ├── tests/
│ │ ├── _helpers.tpl # ヘルパー関数のみを設定する。
│ │ └── template.yaml # チャートの共通ロジックを設定する。
│ │
│ ├── .helmignore # チャートアーカイブの作成時に無視するファイルを設定する。
│ ├── Chart.yaml # チャートの概要を設定する。頭文字は大文字である必要がある。
│ └── values.yaml # テンプレートの変数に出力する値を設定する。
│
├── bar-chart/ # barチャート
│
...
チャートアーカイブ¶
.tgz 形式で圧縮されたチャートのパッケージ。
Helmリリース¶
実際にインストールされたチャートのインスタンスのこと。
インスタンスの実体は、Secret のデータとして管理している。
$ kubectl get secret -n foo-namespace
NAME TYPE DATA AGE
...
sh.helm.release.v1.foo-chart.v1 helm.sh/release.v1 1 122d
sh.helm.release.v1.foo-chart.v2 helm.sh/release.v1 1 122d
sh.helm.release.v1.foo-chart.v3 helm.sh/release.v1 1 122d
sh.helm.release.v1.foo-chart.v4 helm.sh/release.v1 1 122d
sh.helm.release.v1.foo-chart.v5 helm.sh/release.v1 1 119d
sh.helm.release.v1.bar-chart.v1 helm.sh/release.v1 1 97d
sh.helm.release.v1.bar-chart.v2 helm.sh/release.v1 1 84d
sh.helm.release.v1.bar-chart.v3 helm.sh/release.v1 1 74d
sh.helm.release.v1.bar-chart.v4 helm.sh/release.v1 1 60d
sh.helm.release.v1.bar-chart.v5 helm.sh/release.v1 1 49d
...