Chuyển đến nội dung chính

レッスン4: Helm & Kustomize

Helm charts、releases、values.yamlとupgrade/rollbackワークフロー。Kustomize overlaysとbases。CKAD向けHelmとKustomizeの使い分け。

Helm vs Kustomize — Chart構造、テンプレートエンジン、overlays

1. Helmの中核概念

HelmはKubernetesのパッケージマネージャーです。KubernetesマニフェストをChartsにパッケージ化し、デプロイメントをReleasesとして管理します。

Helm Architecture:

  values.yaml          Chart templates
       │                    │
       ▼                    ▼
  ┌──────────────────────────────┐
  │   Helm Template Engine       │
  │   Renders YAML manifests     │
  └──────────────┬───────────────┘
                 │
                 ▼ kubectl apply
         Kubernetes Cluster
          (stored as Release)
用語定義
ChartHelmのパッケージ — テンプレート + デフォルト値を含む
ReleaseクラスターにデプロイされたChartのインスタンス
RepositoryChartsの保管場所(Artifact Hub、Bitnamiなど)
ValuesChartをカスタマイズする設定パラメータ
Revisioninstall/upgradeごとに新しいリビジョンが作成される

2. Helmコマンド

# リポジトリを追加
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

# Chartsを検索
helm search repo bitnami/nginx
helm search hub wordpress

# Chartをインストール
helm install my-release bitnami/nginx
helm install my-release bitnami/nginx --values custom-values.yaml
helm install my-release bitnami/nginx --set image.tag=1.25

# Releasesを一覧表示
helm list
helm list -n production

# Releaseをアップグレード
helm upgrade my-release bitnami/nginx --set replicaCount=3

# 前のリビジョンにロールバック
helm rollback my-release 1   # リビジョン1にロールバック
helm rollback my-release     # 前のリビジョンにロールバック

# アンインストール
helm uninstall my-release

# レンダリングされたテンプレートを確認(dry-run)
helm template my-release bitnami/nginx
helm install my-release bitnami/nginx --dry-run

試験のポイント: CKADではhelm installの--setフラグ(値を直接オーバーライド)と--values file.yaml(ファイルからオーバーライド)がよく出題されます。helm upgradeとhelm rollbackも出題されます。--setのオーバーライドは--valuesファイルよりも優先されることを覚えましょう。

3. Kustomize

Kustomizeはkubectlに組み込まれたツールで、テンプレートやパラメータなしでKubernetesマニフェストをカスタマイズできます。オーバーレイパターンを使用します。

Kustomize Structure:
  base/
  ├── kustomization.yaml    # Base kustomization
  ├── deployment.yaml
  └── service.yaml

  overlays/
  ├── development/
  │   ├── kustomization.yaml  # Patches for dev
  │   └── replica-patch.yaml
  └── production/
      ├── kustomization.yaml  # Patches for prod
      └── replica-patch.yaml
# base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - deployment.yaml
  - service.yaml

# overlays/production/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
  - ../../base
patches:
  - path: replica-patch.yaml
images:
  - name: myapp
    newTag: "2.0"
# Kustomizeで適用
kubectl apply -k overlays/production/

# レンダリング結果をプレビュー
kubectl kustomize overlays/production/

4. Helm vs Kustomize

比較項目HelmKustomize
アプローチテンプレートベース(Goテンプレート)オーバーレイ/パッチ(プレーンYAML)
学習コスト高め(テンプレート構文)低め(YAMLパッチ)
パッケージ管理あり(charts、repos、バージョニング)なし
Release履歴あり(upgrade/rollback)組み込み機能なし
kubectl組み込みなし(別バイナリ)あり(kubectl apply -k)
最適な用途アプリの配布環境別のカスタマイズ

5. チートシート

タスクコマンド
カスタム値でChartをインストールhelm install rel chart --values f.yaml
値を1つオーバーライドhelm install rel chart --set key=val
Helm releaseをロールバックhelm rollback release-name 2
Kustomizeオーバーレイを適用kubectl apply -k overlays/prod/
Kustomize出力をプレビューkubectl kustomize overlays/prod/

6. 練習問題

Q1: "stable"リポジトリからHelmチャートをレプリカ数5でデプロイする必要があります。正しいコマンドはどれですか?

  • A) helm deploy myapp stable/nginx --replicas=5
  • B) helm install myapp stable/nginx --set replicaCount=5 ✓
  • C) helm install myapp stable/nginx -e replicaCount=5
  • D) helm apply myapp stable/nginx --values replicaCount=5

解説: helm installでは--setフラグで値をオーバーライドします。構文は--set key=valueです。正確なキー名(replicaCount)はチャートのvalues.yamlに依存しますが、--setがインライン値オーバーライドの正しいフラグです。

Q2: チームがKustomizeのbase設定とproduction/stagingオーバーレイを使用しています。productionオーバーレイを適用するコマンドはどれですか?

  • A) kubectl apply -f overlays/production/
  • B) kubectl kustomize overlays/production/ | kubectl apply -f -
  • C) kubectl apply -k overlays/production/ ✓
  • D) kustomize apply overlays/production/

解説: kubectl apply -k(-fではなく-k)がkustomizationディレクトリを適用する組み込みの方法です。選択肢Bも動作しますがより冗長です。-kフラグはkubectlにディレクトリをKustomize設定として処理するよう指示します。

Q3: Helmのアップグレード後にバグが発生し、前の正常な状態に戻す必要があります。正しいアプローチはどれですか?

  • A) kubectl rollout undo deployment/myapp
  • B) helm install --replace myapp stable/nginx
  • C) helm rollback myapp ✓
  • D) helm upgrade myapp --version=previous

解説: helm rollbackはreleaseを前のリビジョンに戻します。リビジョン番号を指定しない場合、前のリビジョンにロールバックします。失敗したアップグレードによる変更(ConfigMaps、Secrets、チャートが管理するその他リソースを含む)をすべて元に戻します。