Kubernetes使用Helm更新工作 [英] Kubernetes job update with helm

查看:19
本文介绍了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. 第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. 第二步:安装Helm Chart(假设其他K8资源在/Templates/目录下定义)

  1. 获取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
$

  1. 描述吊舱和吊舱启停通知时间:

$ 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆