チャートフック

Helmは、チャート開発者がリリースのライフサイクルの特定の時点で介入できるようにするフックメカニズムを提供します。たとえば、フックを使用して、

  • 他のチャートがロードされる前に、インストール中にConfigMapまたはSecretをロードします。
  • 新しいチャートをインストールする前に、ジョブを実行してデータベースをバックアップし、アップグレード後に2番目のジョブを実行してデータを復元します。
  • リリースを削除する前にジョブを実行して、サービスを削除する前に正常にローテーションから外します。

フックは通常のテンプレートのように機能しますが、Helmがそれらを異なる方法で利用する原因となる特別なアノテーションがあります。このセクションでは、フックの基本的な使用方法パターンについて説明します。

利用可能なフック

以下のフックが定義されています

アノテーション値説明
pre-installテンプレートがレンダリングされた後、Kubernetesにリソースが作成される前に実行されます
post-installすべてのリソースがKubernetesにロードされた後に実行されます
pre-delete削除リクエストで、Kubernetesからリソースが削除される前に実行されます
post-delete削除リクエストで、リリースのすべてのリソースが削除された後に実行されます
pre-upgradeアップグレードリクエストで、テンプレートがレンダリングされた後、リソースが更新される前に実行されます
post-upgradeアップグレードリクエストで、すべてのリソースがアップグレードされた後に実行されます
pre-rollbackロールバックリクエストで、テンプレートがレンダリングされた後、リソースがロールバックされる前に実行されます
post-rollbackロールバックリクエストで、すべてのリソースが変更された後に実行されます
testHelm testサブコマンドが呼び出されたときに実行されます(テストドキュメントを参照

Helm 3では、crd-installフックはcrds/ディレクトリに置き換えられました。

フックとリリースライフサイクル

フックを使用すると、チャート開発者は、リリースライフサイクルの戦略的なポイントで操作を実行できます。たとえば、helm installのライフサイクルを考えてみましょう。デフォルトでは、ライフサイクルは次のようになります

  1. ユーザーがhelm install fooを実行します
  2. HelmライブラリのインストールAPIが呼び出されます
  3. いくつかの検証の後、ライブラリはfooテンプレートをレンダリングします
  4. ライブラリは結果のリソースをKubernetesにロードします
  5. ライブラリはリリースオブジェクト(およびその他のデータ)をクライアントに返します
  6. クライアントが終了します

Helmは、installライフサイクルに2つのフックを定義しています。pre-installpost-installです。fooチャートの開発者が両方のフックを実装する場合、ライフサイクルは次のように変更されます

  1. ユーザーがhelm install fooを実行します
  2. HelmライブラリのインストールAPIが呼び出されます
  3. crds/ディレクトリにあるCRDがインストールされます
  4. いくつかの検証の後、ライブラリはfooテンプレートをレンダリングします
  5. ライブラリはpre-installフックを実行する準備をします(フックリソースをKubernetesにロードします)
  6. ライブラリは、ウェイト(デフォルトでウェイト0を割り当てる)、リソースの種類、最後に名前の昇順でフックをソートします。
  7. ライブラリは、最も低いウェイトのフックから最初にロードします(負から正)
  8. ライブラリは、フックが「準備完了」になるまで待機します(CRDを除く)
  9. ライブラリは、結果のリソースをKubernetesにロードします。--waitフラグが設定されている場合、ライブラリはすべてのリソースが準備完了状態になるまで待機し、準備完了になるまでpost-installフックを実行しません。
  10. ライブラリはpost-installフックを実行します(フックリソースをロードします)
  11. ライブラリは、フックが「準備完了」になるまで待機します
  12. ライブラリはリリースオブジェクト(およびその他のデータ)をクライアントに返します
  13. クライアントが終了します

フックが準備完了になるまで待機するとはどういう意味ですか?これは、フックで宣言されたリソースによって異なります。リソースがJobまたはPod種類の場合、Helmは正常に完了するまで待機します。また、フックが失敗した場合、リリースは失敗します。これはブロッキング操作であるため、ジョブの実行中はHelmクライアントは一時停止します。

その他すべての種類については、Kubernetesがリソースをロード済み(追加または更新済み)としてマークするとすぐに、リソースは「準備完了」と見なされます。フックで多くのリソースが宣言されている場合、リソースは順番に実行されます。フックのウェイト(下記参照)がある場合、ウェイト順に実行されます。 Helm 3.2.0以降、同じウェイトを持つフックリソースは、通常の非フックリソースと同じ順序でインストールされます。そうでない場合、順序は保証されません。(Helm 2.3.0以降では、アルファベット順にソートされます。ただし、この動作は拘束力のあるものではなく、将来変更される可能性があります。)フックウェイトを追加し、ウェイトが重要でない場合は0に設定することをお勧めします。

フックリソースは、対応するリリースでは管理されません

フックが作成するリソースは、現在、リリースの一部として追跡または管理されていません。 Helmは、フックが準備完了状態になったことを確認すると、フックリソースをそのままにします。対応するリリースが削除されたときのフックリソースのガベージコレクションは、将来Helm 3に追加される可能性があるため、削除してはならないフックリソースには、helm.sh/resource-policy: keepというアノテーションを付ける必要があります。

実際には、これは、フックでリソースを作成する場合、helm uninstallがリソースを削除することに依存できないことを意味します。このようなリソースを破棄するには、フックテンプレートファイルにカスタムのhelm.sh/hook-delete-policyアノテーションを追加するか、ジョブリソースの有効期限(TTL)フィールドを設定する必要があります。

フックの作成

フックは、metadataセクションに特別なアノテーションが付いたKubernetesマニフェストファイルです。テンプレートファイルであるため、.Values.Release.Templateの読み取りなど、通常のテンプレート機能をすべて使用できます。

たとえば、templates/post-install-job.yamlに格納されているこのテンプレートは、post-installで実行されるジョブを宣言しています

apiVersion: batch/v1
kind: Job
metadata:
  name: "{{ .Release.Name }}"
  labels:
    app.kubernetes.io/managed-by: {{ .Release.Service | quote }}
    app.kubernetes.io/instance: {{ .Release.Name | quote }}
    app.kubernetes.io/version: {{ .Chart.AppVersion }}
    helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
  annotations:
    # This is what defines this resource as a hook. Without this line, the
    # job is considered part of the release.
    "helm.sh/hook": post-install
    "helm.sh/hook-weight": "-5"
    "helm.sh/hook-delete-policy": hook-succeeded
spec:
  template:
    metadata:
      name: "{{ .Release.Name }}"
      labels:
        app.kubernetes.io/managed-by: {{ .Release.Service | quote }}
        app.kubernetes.io/instance: {{ .Release.Name | quote }}
        helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
    spec:
      restartPolicy: Never
      containers:
      - name: post-install-job
        image: "alpine:3.3"
        command: ["/bin/sleep","{{ default "10" .Values.sleepyTime }}"]

このテンプレートをフックにするのは、アノテーションです

annotations:
  "helm.sh/hook": post-install

1つのリソースは複数のフックを実装できます

annotations:
  "helm.sh/hook": post-install,post-upgrade

同様に、特定のフックを実装できる異なるリソースの数に制限はありません。たとえば、シークレットとコンフィグマップの両方をpre-installフックとして宣言できます。

サブチャートがフックを宣言する場合、それらも評価されます。トップレベルのチャートがサブチャートによって宣言されたフックを無効にする方法はありません。

決定論的な実行順序を構築するのに役立つフックのウェイトを定義することができます。ウェイトは、次のアノテーションを使用して定義されます

annotations:
  "helm.sh/hook-weight": "5"

フックウェイトは正または負の数値にすることができますが、文字列として表す必要があります。 Helmが特定の種類のフックの実行サイクルを開始すると、それらのフックは昇順にソートされます。

フック削除ポリシー

対応するフックリソースをいつ削除するかを決定するポリシーを定義することができます。フック削除ポリシーは、次のアノテーションを使用して定義されます

annotations:
  "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded

定義されたアノテーション値を1つ以上選択できます

アノテーション値説明
before-hook-creation新しいフックが起動される前に、前のリソースを削除します(デフォルト)
hook-succeededフックが正常に実行された後にリソースを削除します
hook-failedフックの実行中に失敗した場合にリソースを削除します

フック削除ポリシーアノテーションが指定されていない場合、デフォルトでbefore-hook-creationの動作が適用されます。