Hook
Helm提供了一個hook機制,允許chart開發人員在release的生命週期中的某些點進行干預。例如,可以使用hook來:
- 在加載任何其他chart之前,在安裝過程中加載ConfigMap或Secret。
- 在安裝新chart之前執行作業以備份數據庫,然後在升級後執行第二個作業以恢復數據。
- 在刪除release之前運行作業,以便在刪除release之前優雅地停止服務。
Hook像常規模板一樣工作,但它們具有特殊的註釋,可以使Helm以不同的方式使用它們。在本節中,我們介紹Hook的基本使用模式。
我在網址 https://whmzsu.github.io/helm-doc-zh-cn/ 不斷更新,同時也會搬運到這裏,大家有興趣加入https://github.com/whmzsu/helm-doc-zh-cn/的可以給我提交意見和建議。
可用的Hook
定義了以下hook:
- 預安裝pre-install::在模板渲染後執行,但在Kubernetes中創建任何資源之前執行。
- 安裝後post-install:在所有資源加載到Kubernetes後執行
- 預刪除pre-delete:在從Kubernetes刪除任何資源之前執行刪除請求。
- 刪除後post-delete:刪除所有release的資源後執行刪除請求。
- 升級前pre-upgrade:在模板渲染後,但在任何資源加載到Kubernetes之前執行升級請求(例如,在Kubernetes應用操作之前)。
- 升級後post-upgrade:在所有資源升級後執行升級。
- 預回滾pre-rollback:在渲染模板之後,但在任何資源已回滾之前,在回滾請求上執行。
- 回滾後post-rollback:在修改所有資源後執行回滾請求。
Hook和release的生命週期
Hook讓chart開發人員有機會在release的生命週期中的關鍵點執行操作。例如,考慮a的生命週期。默認情況下,生命週期如下所示:
- 用戶運行
helm install foo
- chart被加載到Tiller中
- 經過一些驗證後,Tiller渲染foo模板
- Tiller將產生的資源加載到Kubernetes中
- Tiller將release名稱(和其他數據)返回給客戶端
- 客戶端退出
Helm爲install生命週期定義了兩個hook:pre-install
和 post-install
。如果foo
chart的開發者實現了兩個hook,那麼生命週期就像這樣改變:
- 用戶運行
helm install foo
- chart被加載到Tiller中
- 經過一些驗證後,Tiller渲染
foo
模板 - Tiller準備執行
pre-install
hook(將hook資源加載到Kubernetes中) - Tiller會根據權重對hook進行排序(默認分配權重0),並按相同權重的hook按升序排序。
- Tiller然後裝載最低權重的hook(從負到正)
- Tiller等待,直到hook“準備就緒”
- Tiller將產生的資源加載到Kubernetes中。請注意,如果設置
--wait
標誌,Tiller將等待,直到所有資源都處於就緒狀態,並且在準備就緒之前不會運行post-install
hook。 - Tiller執行
post-install
hook(加載hook資源) - Tiller等待,直到hook“準備就緒”
- Tiller將release名稱(和其他數據)返回給客戶端
- 客戶端退出
等到hook準備就緒是什麼意思?這取決於在hook中聲明的資源。如果資源是Job這一種資源,Tiller將等到作業成功完成。如果作業失敗,則發佈失敗。這是一個阻塞操作,所以Helm客戶端會在Job運行時暫停。
對於所有其他類型,只要Kubernetes將資源標記爲加載(添加或更新),資源就被視爲“就緒”。當一個hook聲明瞭很多資源時,這些資源將被串行執行。如果他們有hook權重(見下文),他們按照加權順序執行。否則,訂購過程不能保證。(在Helm 2.3.0及之後的版本中,它們按字母順序排列,但這種行爲並未被視爲具有約束力,將來可能會發生變化)。添加掛鉤權重被認爲是很好的做法,並將其設置爲0如果權重不是重要。
Hook資源不與相應的release一起進行管理
Hook創建的資源不作爲release的一部分進行跟蹤或管理。一旦Tiller驗證hook已經達到其就緒狀態,它將hook資源放在一邊。
實際上,這意味着如果在hook中創建資源,則不能依賴於helm delete刪除資源。要銷燬這些資源,需要編寫代碼在pre-delete
或post-delete
hook中執行此操作,或者將"helm.sh/hook-delete-policy"
註釋添加到hook模板文件。
寫一個hook
Hook只是Kubernetes manifest文件,在metadata部分有特殊的註釋 。因爲他們是模板文件,可以使用所有的Normal模板的功能,包括讀取.Values
,.Release
和.Template
。
例如,在此模板中,存儲在templates/post-install-job.yaml
的聲明要在post-install
階段運行作業:
apiVersion: batch/v1
kind: Job
metadata:
name: "{{.Release.Name}}"
labels:
heritage: {{.Release.Service | quote }}
release: {{.Release.Name | quote }}
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:
heritage: {{.Release.Service | quote }}
release: {{.Release.Name | quote }}
chart: "{{.Chart.Name}}-{{.Chart.Version}}"
spec:
restartPolicy: Never
containers:
- name: post-install-job
image: "alpine:3.3"
command: ["/bin/sleep","{{default "10" .Values.sleepyTime}}"]
註釋使這個模板成爲hook:
annotations:
"helm.sh/hook": post-install
一個資源可以部署多個hook:
annotations:
"helm.sh/hook": post-install,post-upgrade
同樣,實現一個給定的hook的不同種類資源數量沒有限制。例如,我們可以將secret和config map聲明爲預安裝hook。
子chart聲明hook時,也會評估這些hook。頂級chart無法禁用子chart所聲明的hook。
可以爲一個hook定義一個權重,這將有助於建立一個確定性的執行順序。權重使用以下注釋來定義:
annotations:
"helm.sh/hook-weight": "5"
hook權重可以是正數或負數,但必須表示爲字符串。當Tiller開始執行一個特定類型的hook的執行週期時,它會按升序對這些hook進行排序。
還可以定義確定何時刪除相應的hook資源的策略。hook刪除策略使用以下注釋來定義:
annotations:
"helm.sh/hook-delete-policy": hook-succeeded
可以選擇一個或多個定義的註釋值:
- “hook-succeeded” 指定Tiller應該在hook成功執行後刪除hook。
- “hook-failed” 指定如果hook在執行期間失敗,Tiller應該刪除hook。
- “before-hook-creation” 指定Tiller應在刪除新hook之前刪除以前的hook。
自動刪除以前版本的hook
當helm 的release更新時,有可能hook資源已經存在於羣集中。默認情況下,helm會嘗試創建資源,並拋出錯誤”… already exists”。
我們可以選擇"helm.sh/hook-delete-policy": "before-hook-creation"
,取代 "helm.sh/hook-delete-policy": "hook-succeeded,hook-failed"
因爲:
- 例如爲了手動調試,將錯誤的hook作業資源保存在kubernetes中是很方便的。
- 出於某種原因,可能有必要將成功的hook資源保留在kubernetes中。
- 同時,在helm release升級之前進行手動資源刪除是不可取的。
"helm.sh/hook-delete-policy": "before-hook-creation"
在hook中的註釋,如果在新的hook啓動前有一個hook的話,會使Tiller將以前的release中的hook刪除,,而這個hook同時它可能正在被其他一個策略使用。
本文轉自kubernetes中文社區-Helm chart指南-系列(2)-hook