使用 helm 进行 Kubernetes 作业更新

2024-03-26

我有一个 Kubernetes 集群,我正在使用 Helm 在那里部署我的应用程序。一切工作正常,但一方面是工作更新。正如我所读到的,作业是不可变的,这就是它们无法更新的原因,但我不明白,为什么 helm 不像 Pod 那样创建新作业?

最后,我希望实现将我的应用程序代码部署为运行数据库迁移的作业。我尝试将其作为 Pod 来执行,但是对于 Pod,重启策略只能是“始终”,不支持“从不”,即使文档另有说明。我怎样才能实现这一点,以便迁移可以随着每次部署(新图像标签)而更新,并且它运行一次而不重新启动?


您可以在此处使用舵钩。 官方链接: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. 第 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. 步骤2:安装Helm Chart(假设其他K8s资源定义在/templates/目录下)

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

  1. 描述 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:'

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 helm 进行 Kubernetes 作业更新 的相关文章

随机推荐

  • 阐明 OpenSSL 0.9.8L 并发支持 - 如果非并发完成,SSL 实例是否可以由多个线程使用?

    我们有一个多线程网络应用程序 该应用程序已经使用套接字 10 年了 现在我们尝试使用 OpenSSL 0 9 8L 来保护该应用程序的安全 多年来 应用程序的网络协议被设计为利用单套接字连接的双工特性 应用程序在同一个套接字上同时读取和写入
  • Netbeans 未在 dist 文件夹中构建 lib 文件夹

    我正在尝试清理并构建一个 jar 但由于某种原因 当我执行 运行 gt 清理并构建主项目 时 我在 dist 文件夹中没有得到 lib 文件夹 当我通过 cmd 运行 jar 文件时 这会导致丢失类错误 如何将其配置为在构建过程中将 lib
  • SharePoint 2013 REST API odata $filter 忽略 Unicode 字符,例如德语元音变音 äöü

    我正在尝试将 SharePoint 2013 REST API odata 与 unicode 字符 例如元音变音 结合使用 select Title 2CID filter substringof 28 27hello 20w F6rld
  • Airflow + Cluster + Celery + SQS - Airflow Worker:“Hub”对象没有属性“_current_http_client”

    我正在尝试对我的 Airflow 设置进行集群 并且正在使用本文 https i stack imgur com JRNOj png这样做 我刚刚配置了我的airflow cfg文件以使用CeleryExecutor 我指着我的sql al
  • ReactJS - 无法从另一个文件导入组件

    我正在尝试将组件从一个文件导入到 ReactJS 中的另一个文件中 我在下面粘贴了我的代码 显示了我当前如何尝试将 addUser 组件导入到 App js 中 控制台只显示正在触发的App组件 但不显示addUser 我认为这可能是 we
  • PHP空白页,没有错误[重复]

    这个问题在这里已经有答案了 我有一个本地开发的 PHP 页面 运行良好 将其上传到服务器后 我现在只得到一个空白的白屏 这是完全相同的代码 在本地工作正常 但在远程工作则不然 我已经尝试设置错误报告 但仍然没有给我任何错误 只是一个空白的白
  • 将特定枚举反序列化为 Json.Net 中的 system.enum

    我有一个相当通用的 规则 类 我用它来驱动我正在编写的分析引擎的行为 public class Rule
  • 了解 REST 响应和 HTTP 状态代码

    我想知道我应该如何在 REST API 中做出响应 有效示例 http blah com api v1 dosomething 123 以上是一个有效的请求 目前我的 HTTP 状态为 200 并带有 JSON 响应 dosomething
  • 未访问请求数据时出现 Flask 405 错误且路径有效

    当我实际上没有对连续的相同请求使用请求正文时 我收到 405 错误 Example app Flask name CORS app app route login methods POST def login return jsonify
  • .NET 4.5 中的序列化异常

    当我调用时 我得到了这个堆栈跟踪 XslCompiledTransform Transform XmlDocument DocumentElement CreateNavigator null StringWriter System Con
  • 为我的组件位图属性赋值时发生访问冲突[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试创建一个必须使用位图的组件
  • INSTALL_FAILED_INVALID_APK 错误,调试版本代码 1 与 0 不一致

    我在 Android Studio 版本 2 3 3 上构建了一个 Android 应用程序 当我尝试将应用程序部署到手机 lennovo 或模拟器 GenyMotion 时 出现错误 内容如下 INSTALL FAILED INVALID
  • ASP.net C# 将 int 解析为日期时间

    给定时间 1286294501433 它表示自 1970 年以来经过的毫秒数 我们如何将其转换为 DateTime 数据类型 例如 transactionTime 1286294501433 UInt64 intTransTime UInt
  • 在哪里可以看到 deno 下载的软件包?

    我是新来的deno目前正在探索 deno 的最小可行项目 我想要喜欢 npm 它会下载文件夹内的 npm 包node modules 同样我想看到迪诺包在一个目录中 在我当前的项目中 我没有看到任何下载的包 请建议我在哪里寻找 deno 软
  • Odoo 服务器无法在 Windows 10 中启动

    我在其官方社区版本页面上下载并安装了 odoo 13 然后当我安装一切正常并启动 odoo 时 浏览器会打开 localhost 8069 即 odoo 端口 并且不会打开任何内容 服务器只是不打开开始 我运行 odoo bin 这是我的错
  • Python 中的循环列表迭代器

    我需要迭代一个循环列表 可能很多次 每次都从最后访问的项目开始 用例是连接池 客户端请求连接 迭代器检查指向的连接是否可用并返回它 否则循环直到找到可用的连接 我怎样才能在Python中巧妙地做到这一点 If you instead nee
  • 在 iPhone SDK 上实现动画的最佳方法?

    我知道如何通过移动 调整 UIView 的大小来实现基本动画 不过下面两个动画就显得有点复杂了 1 想象一下汽车游戏 当您按下踏板按钮时 车速表就会旋转 如何制作那种条形 填满 圆形的动画 2 第二个动画更容易描述 如何制作数字增加的动画
  • FactoryGirl:填充具有许多关系的保留构建策略

    我的问题似乎很常见 但我没有在文档或互联网本身中找到任何答案 这似乎是这个问题的克隆has many 同时尊重factory girl 中的构建策略 https stackoverflow com questions 1506556 has
  • 有关使用 TortoiseGit 与 SVN 存储库交互的说明?

    多年来 我一直在 Windows 上使用 TortoiseSVN 为我自己的项目提供本地文件系统存储库 我计划开始与一位朋友合作开发其中一个项目 并将存储库转移到我自己的网站上 我读过很多 git 击败 SVN 的文章 过去几年的帖子 我想
  • 使用 helm 进行 Kubernetes 作业更新

    我有一个 Kubernetes 集群 我正在使用 Helm 在那里部署我的应用程序 一切工作正常 但一方面是工作更新 正如我所读到的 作业是不可变的 这就是它们无法更新的原因 但我不明白 为什么 helm 不像 Pod 那样创建新作业 最后