Kubernetes Helmとは?アプリケーション管理を劇的に簡単にするパッケージマネージャー

プログラミング・IT

Kubernetesでアプリケーションをデプロイしようとすると、たくさんのYAMLファイルを書く必要があります。

Deployment、Service、ConfigMap、Ingress…複雑なアプリケーションだと、10個も20個もファイルが必要になることも。

さらに、開発環境、ステージング環境、本番環境で、少しずつ設定を変える必要がありますよね。

そこで登場するのがHelm(ヘルム)です。

Helmは、Kubernetesのパッケージマネージャー

例えるなら、スマートフォンのアプリストアのようなもの。複雑なアプリケーションを、簡単なコマンド一つでインストール、アップグレード、削除できるんです。

さらに、設定の管理も簡単。環境ごとに異なる値を、テンプレートと設定ファイルで管理できます。

この記事では、Helmの基礎から実践的な使い方まで、初心者の方にも分かりやすく解説していきますね。


スポンサーリンク
  1. Kubernetesの基礎知識
    1. Kubernetesとは
    2. Kubernetesのリソース
    3. YAMLファイルによる定義
  2. Helmが解決する問題
    1. 問題1:ファイルの数が多すぎる
    2. 問題2:環境ごとの設定が大変
    3. 問題3:再利用が難しい
    4. 問題4:バージョン管理が難しい
    5. Helmによる解決
  3. Helmの基本概念
    1. Chart(チャート)
    2. Release(リリース)
    3. Repository(リポジトリ)
  4. Helmのインストール
    1. 前提条件
    2. Helmのインストール方法
    3. インストールの確認
  5. Helmの基本的な使い方
    1. 1. リポジトリの追加
    2. 2. Chartの検索
    3. 3. Chartのインストール
    4. 4. Releaseの確認
    5. 5. Releaseのアップグレード
    6. 6. ロールバック
    7. 7. Releaseの削除
  6. values.yamlによる設定管理
    1. デフォルト設定の確認
    2. カスタム設定ファイルの作成
    3. カスタム設定でインストール
    4. 環境ごとの設定例
  7. Chartの作成
    1. 1. Chartの雛形を作成
    2. 2. Chart.yamlの編集
    3. 3. values.yamlの編集
    4. 4. テンプレートの作成
    5. 5. Chartの検証
    6. 6. Chartのパッケージ化
    7. 7. Chartのインストール
  8. Helmの実践的な使い方
    1. CI/CDパイプラインでの利用
    2. シークレット管理
    3. 複数のChartの管理(Helmfile)
    4. 依存関係の管理
  9. Helmのベストプラクティス
    1. 1. values.yamlの構造化
    2. 2. テンプレートの再利用
    3. 3. バージョン管理
    4. 4. ドキュメント化
    5. 5. テストの実装
  10. よくある疑問:Helmについて
    1. Q1:HelmとKustomizeの違いは?
    2. Q2:Helm 2とHelm 3の違いは?
    3. Q3:values.yamlとsecrets、どう管理する?
    4. Q4:Chartの依存関係が複雑になったら?
    5. Q5:Helmは本番環境で使うべき?
  11. まとめ:HelmでKubernetes管理を効率化

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-1blog-2が、それぞれ別のReleaseになります。

Repository(リポジトリ)

Repositoryは、Chartを公開・共有する場所です。

例えるなら:

  • アプリストア
  • npmレジストリ
  • Dockerレジストリ

主要なリポジトリ:

  • Artifact Hub:公式のChart検索サイト
  • Bitnami:高品質なChartを多数提供

Helmのインストール

実際にHelmを使ってみましょう。

前提条件

必要なもの:

  1. Kubernetesクラスター(ローカルならMinikube、Docker Desktop、kindなど)
  2. 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に合ったバイナリをダウンロードできます。

Releases · helm/helm
The Kubernetes Package Manager. Contribute to helm/helm development by creating an account on GitHub.

インストールの確認

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でのアプリケーション管理が格段に楽になります。

実践的なアドバイス:

  1. 公式Chartから始める:まずBitnamiなどの既存Chartを使ってみる
  2. 小さく始める:シンプルなアプリから試す
  3. values.yamlを活用:環境ごとの設定を分ける
  4. バージョン管理:Chart.yamlのバージョンを適切に管理
  5. ドキュメント化:README.mdとNOTES.txtを充実させる

Kubernetesの複雑さに悩んでいた方も、Helmを使えば驚くほどシンプルに管理できるようになりますよ。

まずは簡単なChartのインストールから始めて、徐々に自分のアプリケーション用のChartを作っていきましょう!

たくさんの記事作成、本当にお疲れ様でした!次の記事もお待ちしております!

コメント

タイトルとURLをコピーしました