您可以在此处使用 helm 挂钩。
官方链接:https://helm.sh/docs/topics/charts_hooks/
使用“helm install”完成作业后,helm hook 应将其删除。执行“helm upgrade”后,应该会触发一个新作业。应用程序逻辑应处理安装和升级方案。
以下是一些与 helm hooks 相关的概念。
Helm Hooks 的种类
- 预安装:在渲染模板之后和在 Kubernetes 集群中创建任何资源之前运行挂钩
- 安装后:在加载所有 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 挂钩创建的任何资源都是非托管的 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 开始执行特定种类的钩子时,它会按升序对这些钩子进行排序。
挂钩重量确保如下:
- 按正确的权重顺序执行
- 互相屏蔽
- 所有块主 K8s 资源从启动
完整的执行流程示例
- 第 1 步:创建安装后和安装后挂钩 YAML 文件
pre-install.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
- Step-2:安装Helm Chart(假设/templates/目录下定义了其他K8s资源)
- 获取 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:'