Helm chart指南-系列(2)-hook

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-installhook。
  • 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-deletehook中執行此操作,或者將"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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章