はじめに
こんにちは!
本記事は「本気で学ぶKubernetes」シリーズの第13回です。このシリーズでは、Kubernetesの基礎から実践まで、段階的に学んでいきます。
このシリーズは、第1回から順に読むことで体系的に学べる構成にしています。
まだご覧になっていない方は、ぜひ最初からご覧ください!
今回は、Helmを使ったパッケージ管理について学んでいきます。
この記事は人間がKubernetesの公式ドキュメントを読み漁りながら、人間の手で書いていますのでご安心ください!
マニフェスト管理の課題について
これまでの記事でPodやDeployment、Serviceなどさまざまなマニフェストを書いてきましたが、それら全てを何も使わず管理しようとすると非常に大変です。
実際の運用では、もっと細かく多くのファイルを管理する必要も場合によっては出てきます。
例えば環境ごとに設定を変えたり、複雑なアプリケーションをデプロイしたり、またはバージョンアップを行った際に複数のマニフェストを更新する必要が出てきたりします。
これらを全て一つずつkubectl applyしていくのは大変ですし、依存関係を理解してデプロイ順序を考える必要もあります。
Helmとは
HelmはKubernetesのパッケージマネージャーです。
イメージとしてはLinuxのaptやyum、macOSのHomebrewのようなもので、アプリケーションを簡単にインストールしたりアップデートができます。
Helmでは複数のマニフェストを一つのパッケージ(Chart)として管理できるようになります。
また、テンプレート機能が備わっているためで設定値を変えるだけで環境ごとに異なる設定を簡単に適用することができます。
出典: Helm公式ドキュメント
Helmの基本概念
Helmを使う上で、必ず押さえておくべき重要な概念が4つあります。
これらの関係を図で表すと以下のようになります。
Chart
Chartは複数のマニフェストのテンプレートとデフォルト設定をまとめたパッケージです。
nginxをデプロイする場合、通常はDeployment、Service、ConfigMapなど複数のマニフェストを書く必要がありますが、nginx Chartを使えばこれらがすでにテンプレートとして用意されています。
nginx Chart、WordPress Chart、Prometheus Chartなど、有名なアプリケーションはほとんどChartが用意されています。
Repository
RepositoryはChartの保管場所です。
Helm公式リポジトリやBitnamiなどのコミュニティリポジトリが存在していて、helm repo addコマンドでリポジトリを追加することで、そこから好きなChartをインストールできます。自分でリポジトリを作成して保管することもできます。
Release
ReleaseはChartをKubernetesにインストールした実体を指します。
一つのChartから複数のReleaseを作成することができるので、同じnginx Chartから「nginx-dev」「nginx-prod」という2つの異なるReleaseを作ることも可能です。各Releaseは独立して管理され、それぞれ異なる設定を持つことができます。
Values
ValuesはChartのカスタマイズ設定です。
Chartにはデフォルトの設定がありますが、values.yamlファイルを作成して設定を上書きすることでレプリカ数、イメージタグ、リソース制限などを柔軟に変更できます。これにより同じChartを使いながら環境ごとに異なる設定を適用することが可能です。
Helmのインストール
ここからは実際にHelmをインストールしてマニフェスト管理とデプロイを行なっていきたいと思います。
*筆者の環境がMacOSのためMacOS版だけ記載しております。Win版やLinux版は別途ご確認ください。
macOS (Homebrew)
brew install helm
helm version
# version.BuildInfo{Version:"v3.18.6", GitCommit:"b76a950f6835474e0906b96c9ec68a2eff3a6430", GitTreeState:"clean", GoVersion:"go1.24.6"}
インストール後、バージョンが表示されれば無事にインストール完了です。
実際にHelmを使ってみる
今回は、Helmを使ってシンプルなnginxをデプロイしてみます。
まず、minikubeクラスタを起動しておきます。
minikube start
HelmではChartを配布するリポジトリを追加しておく必要があります。
helm repo add bitnami https://charts.bitnami.com/bitnami
# "bitnami" has been added to your repositories
helm repo update
# Hang tight while we grab the latest from your chart repositories...
# ...Successfully got an update from the "kubernetes-dashboard" chart repository
# ...Successfully got an update from the "bitnami" chart repository
# Update Complete. ⎈Happy Helming!⎈
nginxをインストールしてみます。
helm install my-nginx bitnami/nginx
# NAME: my-nginx
# LAST DEPLOYED: Thu Dec 11 10:30:00 2025
# NAMESPACE: default
# STATUS: deployed
# REVISION: 1
# TEST SUITE: None
# NOTES:
# CHART NAME: nginx
# ...省略...
今まではnginxを立てる際に手作業でマニフェストを用意していましたが、リポジトリを指定してインストールするだけDeployment、Serviceなどがまとめて作成されます。
Helmでインストールしたアプリケーションを確認してみます。
helm list
# NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
# my-nginx default 1 2025-12-11 10:30:00.123456 +0900 JST deployed nginx-22.3.8 1.29.4
kubectl get all
# NAME READY STATUS RESTARTS AGE
# pod/my-nginx-5d4cf56db-xxxxx 1/1 Running 0 30s
#
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 10m
# service/my-nginx LoadBalancer 10.96.123.456 <pending> 80:30080/TCP 30s
#
# NAME READY UP-TO-DATE AVAILABLE AGE
# deployment.apps/my-nginx 1/1 1 1 30s
# NAME DESIRED CURRENT READY AGE
# replicaset.apps/my-nginx-758699d99 1 1 1 60s
kubectlコマンドで確認してみると実際にDeployment、Service、Podがすべて作成されていることがわかりまあした。
Values.yamlでのカスタマイズ
次はHelmのデフォルト設定を変更していきますが、冒頭で触れた通りvalues.yamlを作成することで細かくカスタマイズができます。
helm show values bitnami/nginx
# ## @section Global parameters
# ...省略...
# replicaCount: 1
# ...省略...
上記はデフォルト設定ですがレプリカ数が1に設定されています。nginxのレプリカ数を2に変更してServiceタイプをNodePortにしたい場合、以下のようにvalues.yamlを作成します。
replicaCount: 2
service:
type: NodePort
続いて作成したcustom-values.yamlのファイル名を指定してアップグレードコマンドを実行します。
helm upgrade my-nginx bitnami/nginx -f custom-values.yaml
# Release "my-nginx" has been upgraded. Happy Helming!
# NAME: my-nginx
# ...省略...
kubectl get pods
# NAME READY STATUS RESTARTS AGE
# my-nginx-xxxxxxxxxx-xxxxx 1/1 Running 0 2m
# my-nginx-xxxxxxxxxx-xxxxx 1/1 Running 0 30s
kubectl get svc
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# my-nginx NodePort 10.96.123.456 <none> 80:30080/TCP 2m
レプリカ数が2に増えて、ServiceタイプもNodePortに変更されました。
クリーンアップ
実行確認は終わりですので、今回作成したリソースを削除しておきます。
helm uninstall my-nginx
# release "my-nginx" uninstalled
Helmの便利なコマンド
Helmには運用で役立つコマンドがいくつかあります。
| コマンド | 説明 |
|---|---|
helm list |
インストール済みのReleaseを一覧表示 |
helm status <release名> |
Releaseの詳細を確認 |
helm upgrade <release名> <chart名> -f <values.yaml> |
設定を変更してアップグレード |
helm rollback <release名> <リビジョン番号> |
指定したリビジョンにロールバック |
helm search repo <キーワード> |
リポジトリからChartを検索 |
helm show values <chart名> |
Chartのデフォルト設定を確認 |
helm show chart <chart名> |
Chartの情報を確認 |
Helmを使うメリット
Helmは複数のマニフェストをまとめてインストール・削除できるため、ファイルが散らばることがありませんしhelm installでアプリケーションがデプロイされるため、コマンドを色々実行していく手間も省けます。
またvalues.yamlで環境ごとに設定を変更できるため、テンプレートは共通にして設定だけ変えるという運用が可能です。
公式やコミュニティで公開されているChartを活用すればWordPressやMySQL、Prometheus、Grafanaなどの代表的なアプリケーションをお手軽に利用できます。
まとめと次回予告
今回はHelmを使ったパッケージ管理について学びましたが、マニフェスト管理を楽にしてくれる便利なツールでした。
values.yamlで設定をカスタマイズして環境ごとに異なる設定を適用したり、アップグレードとロールバックが簡単なので運用がとても楽になると思います。
新規開発で1から構成を考えていく際、Helmを使ってマニフェスト管理は役に立つことが多そうですのでぜひ使い方に慣れていければと思います。
次回は、PrometheusやGrafanaを使ってメトリクス監視する方法について学習していきたいと思います。
それでは、また次回!
