Kubernetes使用Helm更新工作 [英] Kubernetes job update with helm
本文介绍了Kubernetes使用Helm更新工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个Kubernetes集群,我正在使用Helm在那里部署我的应用程序。一切都很好,但有一个方面,工作更新。正如我所读到的,作业是不变的,这就是它们不能更新的原因,但我不明白,为什么Helm不像Pods那样创建一个新的作业?
最后,我希望实现将我的应用程序代码部署为运行数据库迁移的作业。我尝试以Pod的身份执行此操作,但对于Pod,重启策略只能是&Always";,不支持";Never";,即使文档另有说明。我如何实现这一点,以便迁移可以随着每次部署(新的映像标记)而更新,并且只运行一次,而不会重新启动?推荐答案
您可以在此处使用舵钩。 官方链接:https://helm.sh/docs/topics/charts_hooks/
使用";helm安装";完成作业后,helm钩子应将其删除。执行";helm升级后,应该会触发一个新作业。应用程序逻辑应处理安装和升级方案。
下面是与舵钩相关的一些概念。
舵钩类型
- 预安装:钩子在呈现模板之后、在Kubernetes集群中创建任何资源之前运行
- 安装后:钩子在所有Kubernetes资源加载后运行
- 删除前:钩子在从Kubernetes中删除任何现有资源之前运行
- 删除后:钩子在删除所有Kubernetes资源后运行
- 升级前:在呈现图表模板之后、将任何资源加载到Kubernetes之前运行挂钩
- 升级后:钩子在所有Kubernetes资源升级后运行
- 回滚前:在呈现模板之后、回滚任何资源之前运行钩子
- 回滚后:钩子在所有资源修改后运行
- 测试:钩子在执行helm测试子命令时运行
注意:一个资源可以实现多个挂钩:
例如: 注释: ";helm.sh/hook";:安装后、升级后
如何执行Helm图表挂钩
- 当执行包含挂钩的Helm图表时,与挂钩相关的组件(如Pod或作业)不会直接应用于Kubernetes环境。 相反,当执行钩子时,会创建与该钩子对应的新Pod。 如果成功运行,它们将处于已完成状态。
- Helm钩子创建的任何资源都是非托管的Kubernetes对象。 换句话说,使用&Helm卸载&卸载Helm图表不会删除钩子创建的底层资源。 如果需要删除这些资源,则需要以注释的形式定义单独的删除策略。
- 任何绝不能删除的挂钩资源都应使用";helm.sh/resource-policy:Keep";进行批注。
舵钩批注
- ";helm.sh/hook";:安装后
- ";helm.sh/Hook-Weight";:";-5";##注意:它必须为字符串
- ";helm.sh/挂钩-删除-策略&报价;:挂钩-成功
- ";helm.sh/resource-policy";:保留
挂钩删除策略
- "要使用的helm.sh/Hook-Delete-Policy&Quot;批注。
支持三种不同的删除策略,它们将决定何时删除资源:
- 创建钩子前:在启动新的钩子之前删除以前的资源
- 钩子-成功:钩子执行成功后删除资源
- 钩子-失败:如果钩子在执行过程中失败,则删除资源
注意:如果未指定挂钩删除策略批注,则默认情况下应用挂钩创建前行为。
挂钩重量
- 要使用的helm.sh/钩子重量&q;批注。
- 挂钩权重可以是正数或负数,但必须表示为字符串。
- 当Helm开始执行特定类型的挂钩时,它将按升序对这些挂钩进行排序。
挂钩重量确保如下:
- 按正确的权重顺序执行
- 互相阻止
- 所有阻止主要K8资源启动
完整执行流程示例
- 第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
- 第二步:安装Helm Chart(假设其他K8资源在/Templates/目录下定义)
- 获取Pods:
$ 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
$
- 描述吊舱和吊舱启停通知时间:
$ 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:'
这篇关于Kubernetes使用Helm更新工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文