簡體   English   中英

"使用 helm 更新 Kubernetes 作業"

[英]Kubernetes job update with helm

我有一個 Kubernetes 集群,我正在使用 Helm 在那里部署我的應用程序。 一切正常,但一方面,工作更新。 正如我所讀到的,作業是不可變的,這就是它們無法更新的原因,但我不明白,為什么 helm 沒有像為 Pod 那樣創建新作業?

最后,我想實現我的應用程序代碼被部署為一個運行數據庫遷移的作業。 我嘗試將其作為 Pod 進行,但對於 pod,重啟策略只能是“始終”,不支持“從不”,即使文檔另有說明。 我怎樣才能做到這一點,以便每次部署(新圖像標簽)都可以更新遷移並且它運行一次而不重新啟動?

您可以在此處使用 helm hooks。 官方鏈接: https ://helm.sh/docs/topics/charts_hooks/

使用“helm install”完成作業后,helm hook 應將其刪除。 執行“helm upgrade”后,應該會觸發一個新作業。 應用程序邏輯應處理安裝和升級方案。

下面是一些與 helm hooks 相關的概念。

舵鈎的類型

  • pre-install :在渲染模板之后和在 Kubernetes 集群中創建任何資源之前運行掛鈎
  • post-install :在加載所有 Kubernetes 資源后運行掛鈎
  • pre-delete :在從 Kubernetes 中刪除任何現有資源之前運行掛鈎
  • post-delete :在刪除所有 Kubernetes 資源后運行鈎子
  • pre-upgrade : 在圖表模板渲染之后和任何資源加載到 Kubernetes 之前運行鈎子
  • post-upgrade :在所有 Kubernetes 資源升級后運行鈎子
  • pre-rollback :在模板渲染之后和任何資源回滾之前運行的鈎子
  • post-rollback :在修改所有資源后運行掛鈎
  • test : 執行 helm test 子命令時運行鈎子

注意:一個資源可以實現多個鈎子:

例如:注釋:“helm.sh/hook”:安裝后,升級后

Helm Chart Hooks 是如何執行的

  • 當執行包含鈎子的 Helm 圖表時,與鈎子相關的 pod 或作業等組件不會直接應用於 Kubernetes 環境。 相反,當執行鈎子時,會創建一個與鈎子對應的新 pod。 如果成功運行,它們將處於“已完成”狀態。
  • Helm hook 創建的任何資源都是非托管的 Kubernetes 對象。 換句話說,使用“helm uninstall”卸載 Helm 圖表不會刪除由鈎子創建的底層資源。 如果需要刪除這些資源,則需要以注釋的形式定義單獨的刪除策略。
  • 任何不能刪除的鈎子資源都應該用“helm.sh/resource-policy:keep”注釋。

Helm Hook 注解

  • “helm.sh/hook”:安裝后
  • "helm.sh/hook-weight": "-5" ## 注意:這必須是字符串
  • “helm.sh/hook-delete-policy”:鈎子成功
  • “helm.sh/resource-policy”:保持

掛鈎刪除策略

  • 使用“helm.sh/hook-delete-policy”注解。

支持三種不同的刪除策略,它們將決定何時刪除資源:

  • before-hook-creation :在啟動新鈎子之前刪除以前的資源
  • hook-succeeded :鈎子執行成功后刪除資源
  • hook-failed :如果鈎子在執行過程中失敗,則刪除資源

注意:如果沒有指定鈎子刪除策略注釋,則默認應用鈎子創建之前的行為。

鈎重

  • 要使用的“helm.sh/hook-weight”注釋。
  • 掛鈎權重可以是正數或負數,但必須表示為字符串。
  • 當 Helm 開始執行特定種類的鈎子時,它會按升序對這些鈎子進行排序。

掛鈎重量確保如下:

  • 以正確的權重順序執行
  • 互相阻擋
  • all 阻止主 K8s 資源啟動

完整的執行流程示例

  1. 步驟 1:創建安裝后和安裝后掛鈎 YAML 文件

預安裝.yaml

apiVersion: v1
 kind: Pod
 metadata:
   name: hook-preinstall
   annotations:
     "helm.sh/hook": "pre-install"          ## Without this line, this becomes a normal K8s resource.
 spec:
   containers:
   - name: hook1-container
     image: busybox
     imagePullPolicy: IfNotPresent
     command: ['sh', '-c', 'echo The pre-install hook Pod is running  - hook-preinstall && sleep 15']
   restartPolicy: Never
   terminationGracePeriodSeconds: 0

安裝后.yaml

apiVersion: v1
 kind: Pod
 metadata:
   name: hook-postinstall
   annotations:
     "helm.sh/hook": "post-install"         ## Without this line, this becomes a normal K8s resource.
 spec:
   containers:
   - name: hook2-container
     image: busybox
     imagePullPolicy: IfNotPresent
     command: ['sh', '-c', 'echo post-install hook Pod is running - hook-postinstall && sleep 10']
   restartPolicy: Never
   terminationGracePeriodSeconds: 0

  1. Step-2:安裝Helm Chart(假設/templates/目錄下定義了其他K8s資源)

  1. 獲取 Pod:

$ kubectl get pods
NAME                                 READY   STATUS      RESTARTS   AGE
demohook-testhook-5ff88bb44b-qc4n2   1/1     Running     0          5m45s
hook-postinstall                     0/1     Completed   0          5m45s
hook-preinstall                      0/1     Completed   0          6m2s
$

  1. 描述 Pod 並注意 Pod 的開始和完成時間:

$ kubectl describe pod demohook-testhook-5ff88bb44b-qc4n2 | grep -E 'Anno|Started:|Finished:'
$ kubectl describe pod hook-postinstall | grep -E 'Anno|Started:|Finished:'              
$ kubectl describe pod hook-preinstall | grep -E 'Anno|Started:|Finished:'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM