kubernetes - 使用 helm 更新 Kubernetes 作业
问题描述
我有一个 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:创建安装后和安装后挂钩 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
- 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:'
推荐阅读
- python - 主动导航栏 BOOTSTRAP v4
- visual-studio - Visual Studio - 2019 无法开始调试
- flutter - 在当前编辑的行上,在 TextField 中获取光标之前/之后的文本
- amazon-web-services - 在 Cloud watch 事件规则上调用 AWS lambda 的并发实例
- android - react-native 中的用户角色明智的抽屉导航
- python - 预测:无法在系统权重中加载模型“VGG16 model.h5”
- angular - “错误类型错误:对象(…)不是函数”使用 UniqueDeviceID
- sql - createuser:错误:无法连接到数据库 postgres:致命:用户密码验证失败
- javascript - three.js 纹理未显示且为黑色
- python - 如何在功能 API 中正确使用 Tensorflow 插件的指标?