圖表掛鉤

Helm 提供了一個 勾子 機制,讓圖表開發人員可以在發佈的生命週期中特定點進行干預。例如,您可以使用勾子來

  • 在安裝任何其他圖表之前,載入 ConfigMap 或 Secret。
  • 在安裝新圖表之前執行工作,以備份資料庫,然後在升級後執行第二項工作,以還原資料。
  • 在刪除發佈之前執行一項工作,以在移除服務之前,優雅地停止 service。

勾子像一般範本一樣運作,但是它們有特殊的註解,讓 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 的生命週期。預設,生命週期如下所示

  1. 使用者執行 helm install foo
  2. 執行 Helm 函式庫安裝 API
  3. 經由一些驗證後,函式庫會為 foo 範本繪製
  4. 函式庫將產生的資源載入至 Kubernetes
  5. 函式庫將發布物件(以及其他資料)傳回至用戶端
  6. 用戶端離開

Helm 為 install 生命週期定義兩個掛鉤: pre-installpost-install。如果 foo 圖表的開發者同時實作這兩個掛鉤,生命週期就會變更為如下

  1. 使用者執行 helm install foo
  2. 執行 Helm 函式庫安裝 API
  3. 安裝 crds/ 目錄中的 CRD
  4. 經由一些驗證後,函式庫會為 foo 範本繪製
  5. 函式庫準備執行 pre-install 掛鉤(將掛鉤資源載入至 Kubernetes)
  6. 函式庫會依權重、資源種類,以及最後是依名稱以遞增順序對掛鉤進行排序。
  7. 然後函式庫會先載入權重最低的掛鉤(由負到正)
  8. 函式庫會等到掛鉤「就緒」(CRD 除外)
  9. 函式庫將產生的資源載入至 Kubernetes。請注意,如果設定了 --wait 旗標,函式庫會等到所有資源都處於就緒狀態,並且在它們就緒之前不會執行 post-install 掛鉤。
  10. 函式庫會執行 post-install 掛鉤(載入掛鉤資源)
  11. 函式庫會等到掛鉤「就緒」
  12. 函式庫將發布物件(以及其他資料)傳回至用戶端
  13. 用戶端離開

等到一個掛鉤就緒是什麼意思?這取決於掛鉤宣告的資源。如果資源是 JobPod 類型,Helm 會等到它成功執行完畢。而如果掛鉤失敗,發布就會失敗。這是一個封鎖作業,因此 Helm 用戶端會在 Job 執行期間暫停。

對於所有其他類型,一旦 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) 欄位

撰寫掛勾

掛勾只是具備特殊註解的 Kubernetes 清單檔案在 metadata 區段。由於它們是範本檔案,您可以使用所有一般的範本功能,包含讀取 .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

可以讓單一個資源實作多個掛勾

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

您可以選擇一個或多個已定義的註解值

註解值說明
before-hook-creation在啟動新掛勾之前,刪除前一個資源 (預設)
hook-succeeded在成功執行掛勾後,刪除資源
hook-failed如果掛勾在執行期間失敗,刪除資源

如果未指定掛勾刪除政策註解,則預設套用 before-hook-creation 行為。