繁体   English   中英

"使用 helm 更新 Kubernetes 作业"

[英]Kubernetes job update with helm

我有一个 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. 步骤 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. Step-2:安装Helm Chart(假设/templates/目录下定义了其他K8s资源)

  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:'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM