チャートフック
Helmは、チャート開発者がリリースのライフサイクルの特定の時点で介入できるようにするフックメカニズムを提供します。たとえば、フックを使用して、
- 他のチャートがロードされる前に、インストール中にConfigMapまたはSecretをロードします。
- 新しいチャートをインストールする前に、ジョブを実行してデータベースをバックアップし、アップグレード後に2番目のジョブを実行してデータを復元します。
- リリースを削除する前にジョブを実行して、サービスを削除する前に正常にローテーションから外します。
フックは通常のテンプレートのように機能しますが、Helmがそれらを異なる方法で利用する原因となる特別なアノテーションがあります。このセクションでは、フックの基本的な使用方法パターンについて説明します。
利用可能なフック
以下のフックが定義されています
アノテーション値 | 説明 |
---|---|
pre-install | テンプレートがレンダリングされた後、Kubernetesにリソースが作成される前に実行されます |
post-install | すべてのリソースがKubernetesにロードされた後に実行されます |
pre-delete | 削除リクエストで、Kubernetesからリソースが削除される前に実行されます |
post-delete | 削除リクエストで、リリースのすべてのリソースが削除された後に実行されます |
pre-upgrade | アップグレードリクエストで、テンプレートがレンダリングされた後、リソースが更新される前に実行されます |
post-upgrade | アップグレードリクエストで、すべてのリソースがアップグレードされた後に実行されます |
pre-rollback | ロールバックリクエストで、テンプレートがレンダリングされた後、リソースがロールバックされる前に実行されます |
post-rollback | ロールバックリクエストで、すべてのリソースが変更された後に実行されます |
test | Helm testサブコマンドが呼び出されたときに実行されます(テストドキュメントを参照) |
Helm 3では、crd-install
フックはcrds/
ディレクトリに置き換えられました。
フックとリリースライフサイクル
フックを使用すると、チャート開発者は、リリースライフサイクルの戦略的なポイントで操作を実行できます。たとえば、helm install
のライフサイクルを考えてみましょう。デフォルトでは、ライフサイクルは次のようになります
- ユーザーが
helm install foo
を実行します - HelmライブラリのインストールAPIが呼び出されます
- いくつかの検証の後、ライブラリは
foo
テンプレートをレンダリングします - ライブラリは結果のリソースをKubernetesにロードします
- ライブラリはリリースオブジェクト(およびその他のデータ)をクライアントに返します
- クライアントが終了します
Helmは、install
ライフサイクルに2つのフックを定義しています。pre-install
とpost-install
です。foo
チャートの開発者が両方のフックを実装する場合、ライフサイクルは次のように変更されます
- ユーザーが
helm install foo
を実行します - HelmライブラリのインストールAPIが呼び出されます
crds/
ディレクトリにあるCRDがインストールされます- いくつかの検証の後、ライブラリは
foo
テンプレートをレンダリングします - ライブラリは
pre-install
フックを実行する準備をします(フックリソースをKubernetesにロードします) - ライブラリは、ウェイト(デフォルトでウェイト0を割り当てる)、リソースの種類、最後に名前の昇順でフックをソートします。
- ライブラリは、最も低いウェイトのフックから最初にロードします(負から正)
- ライブラリは、フックが「準備完了」になるまで待機します(CRDを除く)
- ライブラリは、結果のリソースをKubernetesにロードします。
--wait
フラグが設定されている場合、ライブラリはすべてのリソースが準備完了状態になるまで待機し、準備完了になるまでpost-install
フックを実行しません。 - ライブラリは
post-install
フックを実行します(フックリソースをロードします) - ライブラリは、フックが「準備完了」になるまで待機します
- ライブラリはリリースオブジェクト(およびその他のデータ)をクライアントに返します
- クライアントが終了します
フックが準備完了になるまで待機するとはどういう意味ですか?これは、フックで宣言されたリソースによって異なります。リソースが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
の動作が適用されます。