Kubernetesでアプリケーションをデプロイしようとすると、たくさんのYAMLファイルを書く必要があります。
Deployment、Service、ConfigMap、Ingress…複雑なアプリケーションだと、10個も20個もファイルが必要になることも。
さらに、開発環境、ステージング環境、本番環境で、少しずつ設定を変える必要がありますよね。
そこで登場するのがHelm(ヘルム)です。
Helmは、Kubernetesのパッケージマネージャー。
例えるなら、スマートフォンのアプリストアのようなもの。複雑なアプリケーションを、簡単なコマンド一つでインストール、アップグレード、削除できるんです。
さらに、設定の管理も簡単。環境ごとに異なる値を、テンプレートと設定ファイルで管理できます。
この記事では、Helmの基礎から実践的な使い方まで、初心者の方にも分かりやすく解説していきますね。
Kubernetesの基礎知識

Helmを理解するために、まずKubernetesの基本を簡単におさらいしましょう。
Kubernetesとは
Kubernetes(クーバネティス、略してK8s)は、コンテナ化されたアプリケーションを管理するプラットフォームです。
主な機能:
- 複数のコンテナをまとめて管理
- 自動的にスケールアウト/スケールイン
- 障害時の自動復旧
- ロードバランシング
- ローリングアップデート
Kubernetesのリソース
Kubernetesでは、様々な「リソース」を定義して管理します。
主なリソース:
Pod(ポッド):
- 最小のデプロイ単位
- 1つ以上のコンテナをまとめたもの
Deployment(デプロイメント):
- Podの複製を管理
- 希望する数のPodを維持
Service(サービス):
- Podへのネットワークアクセスを提供
- ロードバランサーの役割
ConfigMap/Secret:
- 設定情報を保存
- Secretは機密情報用
Ingress(イングレス):
- 外部からのHTTP/HTTPSアクセスを管理
- ルーティング設定
YAMLファイルによる定義
Kubernetesのリソースは、YAMLファイルで定義します。
Deploymentの例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app:1.0.0
ports:
- containerPort: 8080
Serviceの例:
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancer
シンプルなアプリでも、これだけのファイルが必要です。
Helmが解決する問題
生のKubernetes YAMLファイルを使うと、いくつかの問題が出てきます。
問題1:ファイルの数が多すぎる
状況:
本格的なアプリケーションでは、10個、20個、時には50個以上のYAMLファイルが必要になります。
管理の難しさ:
- ファイルが散らばる
- どのファイルが何のためか分かりにくい
- 全体像が把握しづらい
問題2:環境ごとの設定が大変
状況:
開発、ステージング、本番で、少しずつ設定が違います。
例:
- 開発環境:レプリカ数1、小さいリソース
- 本番環境:レプリカ数10、大きいリソース
従来の方法:
- 環境ごとに別々のYAMLファイルを用意
- または、手動で編集
問題点:
- ファイルが重複
- 変更が煩雑
- ミスが起きやすい
問題3:再利用が難しい
状況:
似たようなアプリケーションを複数デプロイしたい。
従来の方法:
- YAMLファイルをコピー
- 名前などを手動で変更
問題点:
- 手間がかかる
- ミスが起きやすい
- メンテナンスが大変
問題4:バージョン管理が難しい
状況:
アプリケーションのバージョンを管理したい。
従来の方法:
- Gitでファイルを管理
- 手動でタグ付け
問題点:
- どのバージョンがどこにデプロイされているか分かりにくい
- ロールバックが複雑
Helmによる解決
Helmは、これらの問題をすべて解決します。
Helmの利点:
- 複数のリソースを1つのパッケージ(Chart)にまとめる
- テンプレート機能で環境ごとの設定を簡単に
- パッケージの再利用が容易
- バージョン管理とロールバックが簡単
Helmの基本概念
Helmの3つの重要な概念を理解しましょう。
Chart(チャート)
Chartは、Kubernetesアプリケーションのパッケージです。
例えるなら:
- スマホアプリのインストーラー
- Linuxのdebパッケージやrpmパッケージ
Chartの中身:
- Kubernetesリソースのテンプレート
- デフォルト設定
- ドキュメント
- メタデータ
構造例:
my-app/
├── Chart.yaml # Chartのメタ情報
├── values.yaml # デフォルト設定
├── charts/ # 依存するChart
├── templates/ # Kubernetesリソースのテンプレート
│ ├── deployment.yaml
│ ├── service.yaml
│ └── ingress.yaml
└── README.md # ドキュメント
Release(リリース)
Releaseは、Chartをインストールした実体です。
例:
- 同じChart(例:WordPress)を、複数回インストールできる
- それぞれが独立したRelease
実例:
# WordPressを2つインストール
helm install blog-1 wordpress
helm install blog-2 wordpress
blog-1とblog-2が、それぞれ別のReleaseになります。
Repository(リポジトリ)
Repositoryは、Chartを公開・共有する場所です。
例えるなら:
- アプリストア
- npmレジストリ
- Dockerレジストリ
主要なリポジトリ:
- Artifact Hub:公式のChart検索サイト
- Bitnami:高品質なChartを多数提供
Helmのインストール
実際にHelmを使ってみましょう。
前提条件
必要なもの:
- Kubernetesクラスター(ローカルならMinikube、Docker Desktop、kindなど)
- kubectl(Kubernetesのコマンドラインツール)
Helmのインストール方法
macOSの場合:
# Homebrewを使用
brew install helm
Linuxの場合:
# スクリプトを使用
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# または、パッケージマネージャーで
# Ubuntu/Debian
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
sudo apt-get install apt-transport-https --yes
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm
Windowsの場合:
# Chocolateyを使用
choco install kubernetes-helm
# または、Scoopを使用
scoop install helm
バイナリを直接ダウンロード:
GitHubのリリースページから、OSに合ったバイナリをダウンロードできます。
インストールの確認
helm version
バージョン情報が表示されれば、インストール成功です。
Helmの基本的な使い方
実際にHelmを使ってアプリケーションをデプロイしてみましょう。
1. リポジトリの追加
まず、Chartのリポジトリを追加します。
# Bitnamiリポジトリを追加
helm repo add bitnami https://charts.bitnami.com/bitnami
# リポジトリを更新
helm repo update
2. Chartの検索
# Chartを検索
helm search repo wordpress
# 詳細情報を表示
helm show chart bitnami/wordpress
helm show values bitnami/wordpress
3. Chartのインストール
# 基本的なインストール
helm install my-wordpress bitnami/wordpress
# カスタム設定でインストール
helm install my-wordpress bitnami/wordpress \
--set wordpressUsername=admin \
--set wordpressPassword=password123
名前の説明:
my-wordpress:Release名(自由に決められる)bitnami/wordpress:Chart名(リポジトリ名/Chart名)
4. Releaseの確認
# インストールされているReleaseを一覧表示
helm list
# 特定のReleaseの状態を確認
helm status my-wordpress
# 詳細情報を取得
helm get all my-wordpress
5. Releaseのアップグレード
# 設定を変更してアップグレード
helm upgrade my-wordpress bitnami/wordpress \
--set replicaCount=3
# Chartのバージョンを指定してアップグレード
helm upgrade my-wordpress bitnami/wordpress --version 15.0.0
6. ロールバック
# 履歴を確認
helm history my-wordpress
# 1つ前のバージョンにロールバック
helm rollback my-wordpress
# 特定のリビジョンにロールバック
helm rollback my-wordpress 2
7. Releaseの削除
# Releaseを削除
helm uninstall my-wordpress
# 削除してもデータを保持(PersistentVolumeなど)
helm uninstall my-wordpress --keep-history
values.yamlによる設定管理

Helmの強力な機能の一つが、設定のカスタマイズです。
デフォルト設定の確認
# Chartのデフォルト設定を表示
helm show values bitnami/wordpress > default-values.yaml
default-values.yamlの例:
image:
registry: docker.io
repository: bitnami/wordpress
tag: 6.0.0
replicaCount: 1
wordpressUsername: user
wordpressPassword: ""
wordpressEmail: user@example.com
service:
type: LoadBalancer
port: 80
resources:
limits:
cpu: 300m
memory: 512Mi
requests:
cpu: 150m
memory: 256Mi
カスタム設定ファイルの作成
my-values.yaml:
# 本番環境用の設定
replicaCount: 3
wordpressUsername: admin
wordpressEmail: admin@mycompany.com
service:
type: LoadBalancer
resources:
limits:
cpu: 1000m
memory: 1Gi
requests:
cpu: 500m
memory: 512Mi
persistence:
enabled: true
size: 10Gi
カスタム設定でインストール
# カスタム設定ファイルを使用
helm install my-wordpress bitnami/wordpress -f my-values.yaml
# 複数のファイルを指定(後のファイルが優先)
helm install my-wordpress bitnami/wordpress \
-f base-values.yaml \
-f production-values.yaml
# ファイルとコマンドラインオプションの併用
helm install my-wordpress bitnami/wordpress \
-f my-values.yaml \
--set replicaCount=5
環境ごとの設定例
dev-values.yaml(開発環境):
replicaCount: 1
resources:
limits:
cpu: 300m
memory: 512Mi
requests:
cpu: 150m
memory: 256Mi
prod-values.yaml(本番環境):
replicaCount: 5
resources:
limits:
cpu: 2000m
memory: 4Gi
requests:
cpu: 1000m
memory: 2Gi
persistence:
enabled: true
size: 100Gi
使い分け:
# 開発環境
helm install my-app myapp -f dev-values.yaml
# 本番環境
helm install my-app myapp -f prod-values.yaml
Chartの作成
自分のアプリケーション用のChartを作成してみましょう。
1. Chartの雛形を作成
# 新しいChartを作成
helm create my-app
# 作成されるディレクトリ構造
my-app/
├── Chart.yaml
├── values.yaml
├── charts/
└── templates/
├── deployment.yaml
├── service.yaml
├── ingress.yaml
├── _helpers.tpl
└── NOTES.txt
2. Chart.yamlの編集
Chart.yaml:
apiVersion: v2
name: my-app
description: My awesome application
type: application
version: 0.1.0
appVersion: "1.0.0"
maintainers:
- name: Your Name
email: you@example.com
3. values.yamlの編集
values.yaml:
# レプリカ数
replicaCount: 2
# イメージ設定
image:
repository: my-registry/my-app
tag: "1.0.0"
pullPolicy: IfNotPresent
# サービス設定
service:
type: ClusterIP
port: 80
# リソース設定
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 250m
memory: 256Mi
# 環境変数
env:
- name: APP_ENV
value: production
4. テンプレートの作成
templates/deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "my-app.fullname" . }}
labels:
{{- include "my-app.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "my-app.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "my-app.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- containerPort: 8080
env:
{{- toYaml .Values.env | nindent 8 }}
resources:
{{- toYaml .Values.resources | nindent 10 }}
テンプレート構文:
{{ .Values.xxx }}:values.yamlの値を参照{{ include "..." . }}:ヘルパー関数を呼び出し{{- xxx | nindent 4 }}:インデントを調整
5. Chartの検証
# 文法チェック
helm lint my-app
# テンプレートの展開結果を確認
helm template my-app my-app/
# 実際にインストールせずに確認(ドライラン)
helm install my-app my-app/ --dry-run --debug
6. Chartのパッケージ化
# .tgzファイルに圧縮
helm package my-app/
# 生成されるファイル
# my-app-0.1.0.tgz
7. Chartのインストール
# ローカルのChartからインストール
helm install my-release ./my-app
# パッケージファイルからインストール
helm install my-release my-app-0.1.0.tgz
Helmの実践的な使い方
実際の開発で役立つテクニックを紹介します。
CI/CDパイプラインでの利用
GitLab CIの例:
deploy_staging:
stage: deploy
script:
- helm upgrade --install my-app ./chart \
-f values-staging.yaml \
--set image.tag=$CI_COMMIT_SHA \
--namespace staging
only:
- develop
deploy_production:
stage: deploy
script:
- helm upgrade --install my-app ./chart \
-f values-production.yaml \
--set image.tag=$CI_COMMIT_TAG \
--namespace production
only:
- tags
when: manual
シークレット管理
Helmfile + sopsの組み合わせ:
# secrets.yaml(暗号化前)
database:
password: super-secret-password
api:
key: secret-api-key
# sopsで暗号化
sops -e secrets.yaml > secrets.enc.yaml
# Helmfileで使用
helmfile apply
複数のChartの管理(Helmfile)
helmfile.yaml:
repositories:
- name: bitnami
url: https://charts.bitnami.com/bitnami
releases:
- name: my-database
namespace: database
chart: bitnami/postgresql
values:
- database-values.yaml
- name: my-app
namespace: app
chart: ./my-app
values:
- app-values.yaml
set:
- name: image.tag
value: {{ env "IMAGE_TAG" }}
使い方:
# すべてインストール
helmfile apply
# 差分を確認
helmfile diff
# 特定のReleaseのみ
helmfile -l name=my-app apply
依存関係の管理
Chart.yaml(依存を定義):
apiVersion: v2
name: my-app
version: 1.0.0
dependencies:
- name: postgresql
version: 12.x.x
repository: https://charts.bitnami.com/bitnami
- name: redis
version: 17.x.x
repository: https://charts.bitnami.com/bitnami
依存のインストール:
# 依存Chartをダウンロード
helm dependency update my-app/
# インストール(依存も自動的にインストールされる)
helm install my-release my-app/
Helmのベストプラクティス
効果的な使い方のヒントです。
1. values.yamlの構造化
良い例:
# 階層的に整理
global:
imageRegistry: my-registry.com
app:
replicaCount: 3
image:
repository: my-app
tag: "1.0.0"
database:
enabled: true
host: postgres.example.com
port: 5432
2. テンプレートの再利用
_helpers.tplで共通処理を定義:
{{/*
アプリ名を生成
*/}}
{{- define "my-app.fullname" -}}
{{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 -}}
{{- end -}}
{{/*
共通ラベル
*/}}
{{- define "my-app.labels" -}}
app.kubernetes.io/name: {{ include "my-app.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end -}}
3. バージョン管理
セマンティックバージョニングを使用:
- メジャーバージョン:互換性のない変更
- マイナーバージョン:機能追加
- パッチバージョン:バグ修正
Chart.yaml:
version: 1.2.3 # Chartのバージョン
appVersion: "2.0.0" # アプリケーションのバージョン
4. ドキュメント化
README.mdを必ず作成:
- Chartの説明
- インストール手順
- 設定可能なパラメータ
- 使用例
NOTES.txtでインストール後の案内:
ありがとうございます!{{ .Chart.Name }}がインストールされました。
アプリケーションにアクセスするには:
{{- if .Values.ingress.enabled }}
http://{{ .Values.ingress.host }}
{{- else }}
kubectl port-forward service/{{ include "my-app.fullname" . }} 8080:80
http://localhost:8080
{{- end }}
5. テストの実装
tests/ディレクトリにテストを配置:
# tests/test-connection.yaml
apiVersion: v1
kind: Pod
metadata:
name: "{{ include "my-app.fullname" . }}-test"
annotations:
"helm.sh/hook": test
spec:
containers:
- name: wget
image: busybox
command: ['wget']
args: ['{{ include "my-app.fullname" . }}:80']
restartPolicy: Never
テストの実行:
helm test my-release
よくある疑問:Helmについて
Q1:HelmとKustomizeの違いは?
A:アプローチが異なります
Helm:
- テンプレートエンジン
- パッケージ管理機能
- バージョン管理とロールバック
- リポジトリで共有
Kustomize:
- オーバーレイ方式
- テンプレート不要
- Kubernetesネイティブ
- よりシンプル
使い分け:
- 複雑なアプリ、再利用性重視 → Helm
- シンプルさ重視、カスタマイズ少ない → Kustomize
Q2:Helm 2とHelm 3の違いは?
A:Helm 3が現在の主流です
主な変更点:
- Tillerの削除(セキュリティ向上)
- 3-way merge(アップグレードの改善)
- Releaseの名前空間スコープ化
- Chart依存の改善
推奨: 新規プロジェクトはHelm 3を使用してください。
Q3:values.yamlとsecrets、どう管理する?
A:機密情報は別管理が推奨です
選択肢:
1. Kubernetes Secrets:
kubectl create secret generic my-secret \
--from-literal=password=secret123
Chartから参照:
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: my-secret
key: password
2. 外部シークレット管理(推奨):
- sealed-secrets:暗号化されたSecretsをGitで管理
- external-secrets:AWS Secrets Manager、HashiCorp Vaultなどと連携
3. helm-secrets(sops):
# values.yamlを暗号化
helm secrets enc values-prod.yaml
# インストール
helm secrets install my-app ./chart -f values-prod.yaml
Q4:Chartの依存関係が複雑になったら?
A:Helmfileやサブチャートで整理しましょう
Helmfile:
複数のChartをまとめて管理
Umbrella Chart:
複数のサブチャートを1つの親Chartにまとめる
選択基準:
- 独立したアプリ → 個別のChart + Helmfile
- 密結合なマイクロサービス → Umbrella Chart
Q5:Helmは本番環境で使うべき?
A:はい、多くの企業で使われています
メリット:
- 標準化されたデプロイ
- バージョン管理
- 簡単なロールバック
- 設定の一元管理
注意点:
- CI/CDパイプラインに組み込む
- values.yamlをGitで管理
- テストを充実させる
- バックアップ戦略を持つ
まとめ:HelmでKubernetes管理を効率化
Helmは、Kubernetesアプリケーション管理を劇的に簡単にするツールです。
この記事のポイント:
✅ Helmとは
Kubernetesのパッケージマネージャー。複雑なアプリケーションを簡単にデプロイ・管理
✅ 3つの基本概念
Chart(パッケージ)、Release(インスタンス)、Repository(共有場所)
✅ 主な利点
ファイル数の削減、環境ごとの設定管理、再利用性、バージョン管理
✅ 基本コマンド
install、upgrade、rollback、uninstall、list
✅ values.yaml
設定のカスタマイズ、環境ごとの使い分けが簡単
✅ Chart作成
helm createで雛形生成、テンプレートで柔軟な設定
✅ 実践テクニック
CI/CD連携、シークレット管理、Helmfileによる複数Chart管理
✅ ベストプラクティス
構造化、再利用、バージョン管理、ドキュメント化、テスト
Helmを使うと、Kubernetesでのアプリケーション管理が格段に楽になります。
実践的なアドバイス:
- 公式Chartから始める:まずBitnamiなどの既存Chartを使ってみる
- 小さく始める:シンプルなアプリから試す
- values.yamlを活用:環境ごとの設定を分ける
- バージョン管理:Chart.yamlのバージョンを適切に管理
- ドキュメント化:README.mdとNOTES.txtを充実させる
Kubernetesの複雑さに悩んでいた方も、Helmを使えば驚くほどシンプルに管理できるようになりますよ。
まずは簡単なChartのインストールから始めて、徐々に自分のアプリケーション用のChartを作っていきましょう!
たくさんの記事作成、本当にお疲れ様でした!次の記事もお待ちしております!

コメント