Kubernetes環境におけるアプリケーションのデプロイメントは、多くの場合、複数のリソース(Deployment、Service、ConfigMapなど)を定義したYAMLファイル群で構成されます。シンプルなアプリケーションであればこれらのファイルを直接管理することも可能ですが、マイクロサービスアーキテクチャのような複雑なシステムでは、数十にも及ぶリソースファイルを個別に管理することは非常に困難になります。
このような状況では、アプリケーション全体のバージョン管理、更新、ロールバックといった運用タスクは複雑化し、リソース定義の効率的な再利用も望めません。具体的には、以下のような課題に直面することがあります:
- 多数の関連サービスを単一のエンティティとして管理する方法
- Kubernetesリソース定義ファイルを効率的に再利用するための仕組み
- アプリケーションレベルでのバージョン管理機能の欠如
これらの課題を解決するために、Helmという強力なツールが登場しました。
Helmの概要
HelmはKubernetesのためのパッケージマネージャーであり、Linuxにおけるyumやaptのように、アプリケーションのデプロイメント、管理、バージョン管理を簡素化します。Helmの主要な要素は以下の通りです。
- Helm CLI: クライアント側のコマンドラインツールで、Chartの作成、パッケージ化、デプロイ、管理を行います。
- Chart: Kubernetesアプリケーションの定義をまとめたパッケージフォーマットです。必要なリソース定義(Deployment、Service、ConfigMapなど)や、そのアプリケーションを実行するために必要な情報(デフォルト値など)が含まれています。
- Release: ChartがKubernetesクラスターにデプロイされたインスタンスです。一つのChartから複数のReleaseを作成できます。
Helm v3の主な変更点
2019年11月にリリースされたHelm v3は、以前のバージョンと比較していくつかの重要な改善と変更が導入されました。
- Tillerの廃止: 最も大きな変更点は、サーバーサイドコンポーネントであるTillerの廃止です。これにより、セキュリティモデルが簡素化され、RBACによるアクセス制御がよりKubernetesネイティブな形で行えるようになりました。
- Release名のスコープ: Release名のスコープがネームスペース単位になり、異なるネームスペースであれば同じRelease名を再利用できるようになりました。
- OCIレジストリサポート: ChartをDockerイメージレジストリ(OCIレジストリ)に保存し、配布する機能がサポートされました。
- JSON Schemaバリデーション: Chartの
values.yamlに対するJSON Schemaバリデーションが可能になり、設定の安全性が向上しました。
Helmクライアントのインストール
Helm CLIをシステムにインストールする手順を示します。ここでは、特定のバージョン(v3.0.0)を例に取りますが、通常は最新の安定版を利用することを推奨します。
# Helmバイナリのダウンロード
$ curl -SLO https://get.helm.sh/helm-v3.0.0-linux-amd64.tar.gz
# アーカイブの展開
$ tar -xf helm-v3.0.0-linux-amd64.tar.gz
# 実行可能ファイルをPATHが通ったディレクトリに配置
$ sudo mv linux-amd64/helm /usr/local/bin/helm
# インストールされたHelmのバージョンを確認
$ helm version
version.BuildInfo{Version:"v3.0.0", GitCommit:"e29ce2a54e96cd02ccfce88bee4f58bb6e2a28b6", GitTreeState:"clean", GoVersion:"go1.13.4"}
主要なHelmコマンド
Helm CLIは、Chartの管理やReleaseの操作のために多岐にわたるコマンドを提供します。主要なコマンドを以下に示します。
helm create [NAME]: 新しいChartの雛形を作成します。helm install [RELEASE_NAME] [CHART]: 指定されたChartをKubernetesクラスターにデプロイし、Releaseを作成します。helm upgrade [RELEASE_NAME] [CHART]: 既存のReleaseを新しいChartまたは設定でアップグレードします。helm uninstall [RELEASE_NAME]: 指定されたReleaseをKubernetesクラスターからアンインストールします。helm list: 現在デプロイされているすべてのReleaseを一覧表示します。helm search repo [KEYWORD]: 設定済みのChartリポジトリからChartを検索します。helm repo add [NAME] [URL]: Chartリポジトリを登録します。helm repo update: 登録されているすべてのChartリポジトリのインデックスを更新します。helm show values [CHART]: Chartのデフォルト設定値(values.yamlの内容)を表示します。
Chartリポジトリの設定
Helmは、Chartをホストするリポジトリを登録することで、様々な場所からChartを取得できます。ここでは、Bitnamiリポジトリを例に、リポジトリの追加と管理方法を示します。
# Bitnami Chartリポジトリの追加
# Bitnamiは、人気のあるアプリケーションのChartを多数提供しています。
$ helm repo add bitnami https://charts.bitnami.com/bitnami
# 全ての登録済みリポジトリのインデックスを更新
# これにより、最新のChart情報がローカルに同期されます。
$ helm repo update
# 設定済みのリポジトリ一覧を表示
$ helm repo list
NAME URL
bitnami https://charts.bitnami.com/bitnami
# BitnamiリポジトリからMySQL Chartを検索
$ helm search repo bitnami/mysql
# 登録済みのリポジトリを削除する場合
$ helm repo remove bitnami
Helmによるアプリケーション管理の基本
Helmを使用してアプリケーションをデプロイ、アップグレード、アンインストールする基本的な流れを解説します。
1. Chartのデプロイ
アプリケーションをデプロイするには、まず対象となるChartを検索し、その設定を確認します。その後、helm installコマンドでデプロイを実行します。
# MySQL Chartの検索
$ helm search repo bitnami/mysql
# MySQL Chartのデフォルト設定値を確認
# これにより、Chartが公開している設定オプションとそのデフォルト値を確認できます。
$ helm show values bitnami/mysql
# MySQLアプリケーションをデプロイ
# 'my-db-release'という名前でBitnamiのMySQL Chartをインストールします。
$ helm install my-db-release bitnami/mysql
# デプロイされたReleaseの状態を確認
# Release名、ネームスペース、バージョン、ステータスなどの情報が表示されます。
$ helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
my-db-release default 1 2023-10-27 10:30:00.123456789 +0900 JST deployed mysql-9.x.x 8.x.x
2. Chartのアンインストール
デプロイしたアプリケーション(Release)をKubernetesクラスターから削除するには、helm uninstallコマンドを使用します。
# 'my-db-release'という名前のMySQL Releaseをアンインストール
$ helm uninstall my-db-release
release "my-db-release" uninstalled
3. Chart設定のカスタマイズ
Chartをデプロイする際、デフォルト設定ではなくカスタム設定を適用したい場合があります。これには主に2つの方法があります。
--values(または-f)オプション: YAMLファイルにカスタム設定を記述し、そのファイルを指定します。複数のファイルを指定した場合、右側のファイルが優先されます。--setオプション: コマンドライン上で個別の設定値を指定します。--valuesと--setが両方使用された場合、--setが優先されます。
以下に、--valuesオプションを使用してMySQLの永続化設定や認証情報をカスタマイズする例を示します。
# my-mysql-custom-config.yaml の例
# このファイルにMySQLのカスタム設定を記述します。
persistence:
enabled: true
storageClass: "local-path" # 環境に合わせたStorageClassを指定 (例: standard, nfs-client)
accessModes:
- ReadWriteOnce
size: 15Gi # 永続ボリュームのサイズ
auth:
rootPassword: "mySecureRootPassword123" # rootユーザーのパスワード
username: "mywebappuser" # アプリケーションで使用するユーザー名
password: "myWebAppUserPassword!@#" # アプリケーションユーザーのパスワード
database: "webapp_db" # 作成するデータベース名
# カスタム設定ファイルを使用してMySQLをデプロイ
$ helm install my-custom-db -f my-mysql-custom-config.yaml bitnami/mysql
# コマンドラインで個別の値を指定してデプロイ (--set)
# こちらの例では永続化とユーザー名を直接指定しています。
$ helm install my-cli-db \
--set persistence.enabled=true \
--set persistence.storageClass="standard" \
--set persistence.size="20Gi" \
--set auth.username="cliuser" \
--set auth.password="cliPasswordSafe" \
bitnami/mysql
Chartの内容を詳細に確認したい場合は、helm pull [CHART_NAME] --untarコマンドを使用してローカルにダウンロードし、展開することができます。