コンテンツにスキップ

Helm@マニフェスト管理

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. Helmの仕組み

アーキテクチャ

Helm は、helm クライアント、チャートレジストリ、複数のチャートリポジトリ、チャート、といったコンポーネントから構成される。

helm_architecture


バージョン管理戦略

▼ バージョン管理戦略とは

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

...