您可以在此处使用舵钩。
官方链接:https://helm.sh/docs/topics/charts_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 Hook 是如何执行的
- 当执行包含钩子的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执行成功后删除资源
- hook-failed :如果执行过程中钩子失败,则删除资源
注意:如果未指定钩子删除策略注释,则默认应用 before-hook-creation 行为。
钩重
- 要使用的“helm.sh/hook-weight”注释。
- 钩子权重可以是正数或负数,但必须表示为字符串。
- 当 Helm 开始特定种类的钩子的执行周期时,它会按升序对这些钩子进行排序。
吊钩重量确保如下:
- 以正确的重量顺序执行
- 互相阻挡
- 从一开始就阻止所有主要的 K8s 资源
完整的执行流程示例
- 第 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
- 步骤2:安装Helm Chart(假设其他K8s资源定义在/templates/目录下)
- 获取 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
$
- 描述 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:'