圖表掛鉤
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
的生命週期。預設,生命週期如下所示
- 使用者執行
helm install foo
- 執行 Helm 函式庫安裝 API
- 經由一些驗證後,函式庫會為
foo
範本繪製 - 函式庫將產生的資源載入至 Kubernetes
- 函式庫將發布物件(以及其他資料)傳回至用戶端
- 用戶端離開
Helm 為 install
生命週期定義兩個掛鉤: pre-install
和 post-install
。如果 foo
圖表的開發者同時實作這兩個掛鉤,生命週期就會變更為如下
- 使用者執行
helm install foo
- 執行 Helm 函式庫安裝 API
- 安裝
crds/
目錄中的 CRD - 經由一些驗證後,函式庫會為
foo
範本繪製 - 函式庫準備執行
pre-install
掛鉤(將掛鉤資源載入至 Kubernetes) - 函式庫會依權重、資源種類,以及最後是依名稱以遞增順序對掛鉤進行排序。
- 然後函式庫會先載入權重最低的掛鉤(由負到正)
- 函式庫會等到掛鉤「就緒」(CRD 除外)
- 函式庫將產生的資源載入至 Kubernetes。請注意,如果設定了
--wait
旗標,函式庫會等到所有資源都處於就緒狀態,並且在它們就緒之前不會執行post-install
掛鉤。 - 函式庫會執行
post-install
掛鉤(載入掛鉤資源) - 函式庫會等到掛鉤「就緒」
- 函式庫將發布物件(以及其他資料)傳回至用戶端
- 用戶端離開
等到一個掛鉤就緒是什麼意思?這取決於掛鉤宣告的資源。如果資源是 Job
或 Pod
類型,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
行為。