Skip to content
Published on

Helmリリースライフサイクル: install、upgrade、rollbackの内部動作

Authors

1. リリース保存構造

1.1 Secretに保存されるリリースデータ

Helmはリリースの全リビジョンをKubernetes Secretとして管理します。

kubectl get secrets -l owner=helm,name=my-release -n default
# sh.helm.release.v1.my-release.v1   helm.sh/release.v1   1   30m
# sh.helm.release.v1.my-release.v2   helm.sh/release.v1   1   15m

1.2 リリース履歴

helm history my-release
helm upgrade my-release ./my-chart --history-max 5

2. Installフロー

1. チャートの読み込みと依存関係の解決
2. valuesのマージ(デフォルト値 + ユーザー値)
3. テンプレートのレンダリング
4. YAMLの妥当性検証
5. CRDのインストール(crds/ディレクトリ)
6. pre-installフックの実行
7. Kubernetes APIでリソースを作成
8. リリースSecretの保存(status: deployed)
9. post-installフックの実行
10. NOTES.txtの出力
helm install my-release ./my-chart -n production --create-namespace
helm install my-release ./my-chart --atomic --timeout 5m
helm install my-release ./my-chart --wait --timeout 10m
helm install my-release ./my-chart --dry-run=server

3. Upgradeフロー

3.1 Three-way Strategic Merge Patch

Helm 3の核心的な改善点です。3つの状態を比較します:

前回リリースのマニフェスト(Old Chart)
         - 比較 -
現在のライブ状態(Live State)
         - 比較 -
新しいリリースのマニフェスト(New Chart)

メリット:

  • kubectlで直接変更した内容を認識
  • 不要なリソース再作成を防止
  • ユーザーの手動変更を安全にマージ
helm upgrade my-release ./my-chart -f new-values.yaml
helm upgrade --install my-release ./my-chart
helm upgrade my-release ./my-chart --reuse-values --set image.tag=v2.1.0

4. Rollbackフロー

1. 対象リビジョンのリリースデータを読み込み
2. そのリビジョンのマニフェストを「新しいマニフェスト」として使用
3. Three-way mergeで変更点を計算
4. pre-rollbackフックの実行
5. リソースの適用
6. 新しいリビジョン番号でリリースを保存
7. post-rollbackフックの実行
helm rollback my-release        # 前のリビジョン
helm rollback my-release 2      # 特定のリビジョン

重要: ロールバックは前のマニフェストを復元するのではなく、前のリビジョンのチャートとvaluesに基づいて新しいリビジョンを作成します。


5. Hookシステム

5.1 Hookの種類

Hook実行タイミング
pre-installテンプレートレンダリング後、リソース作成前
post-install全リソースがクラスタにロードされた後
pre-upgradeアップグレード時、リソース更新前
post-upgradeリソース更新後
pre-rollbackロールバック時、リソースロールバック前
post-rollbackリソースロールバック後
pre-delete削除要求時、リソース削除前
post-delete全リソース削除後
testhelm test実行時

5.2 Hook定義例

apiVersion: batch/v1
kind: Job
metadata:
  name: {{ include "my-chart.fullname" . }}-db-migrate
  annotations:
    "helm.sh/hook": pre-upgrade,pre-install
    "helm.sh/hook-weight": "-5"
    "helm.sh/hook-delete-policy": before-hook-creation
spec:
  template:
    spec:
      restartPolicy: Never
      containers:
        - name: migrate
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          command: ["./migrate", "--up"]

5.3 Hook削除ポリシー

ポリシー説明
before-hook-creation新しいHook実行前に前のHookリソースを削除
hook-succeededHook成功時に削除
hook-failedHook失敗時に削除

6. Uninstallフロー

helm uninstall my-release
helm uninstall my-release --keep-history

注意: CRDはuninstallで削除されません。手動削除が必要です。


7. Atomicインストールとwait

7.1 --waitフラグ

Deployment/StatefulSetの全Pod Ready、Service IP割り当て、Job Complete、PVC Boundまで待機。

7.2 --atomicフラグ

--waitを含み、さらにインストール失敗時に自動uninstall、アップグレード失敗時に自動rollback。

helm install my-release ./my-chart --atomic --timeout 5m

8. リリース情報の照会

helm list --all-namespaces
helm status my-release
helm get values my-release --all
helm get manifest my-release
helm get all my-release

9. まとめ

Helmリリースライフサイクルの要点:

  1. Secretベースのリビジョン管理: 全リリース履歴をKubernetes Secretで管理
  2. Three-way Merge: 前のマニフェスト、ライブ状態、新しいマニフェストの比較による安全なアップグレード
  3. Hookシステム: ライフサイクルの各段階にカスタムロジックを挿入
  4. Atomicデプロイ: 失敗時の自動ロールバックで安定性を保証
  5. 履歴ベースのロールバック: 前のリビジョンのチャート/valuesに基づいて新しいリビジョンを生成