【问题标题】:How to tell Helm not to run a job如何告诉 Helm 不要运行工作
【发布时间】:2022-02-25 17:32:52
【问题描述】:

我正在尝试使用 helm 制作 Kubernetes 部署脚本。 我创建了以下 2 个工作(跳过了容器模板,因为我猜这无关紧要)

模板/作业/migrate.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: {{ .Release.Name }}-migrate
  namespace: {{ .Release.Namespace }}
  annotations:
    "helm.sh/hook": post-install
    "helm.sh/hook-weight": "10"
    "helm.sh/hook-delete-policy": hook-succeeded
spec:
  ...

模板/作业/seed.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: {{ .Release.Name }}-seed
  namespace: {{ .Release.Namespace }}
spec:
  ...

第一项工作是更新数据库结构。
第二个作业将重置数据库内容并用示例数据填充它。

由于我没有将 post-install 钩子添加到种子作业中,因此我希望该作业不会自动运行,但只有在我手动要求它运行时才会运行。
但它不仅自动运行,它还尝试在迁移之前运行。

如何定义必须手动触发才能运行的作业?
在 vanilla kubernetes 中,作业仅在我使用
kubectl apply -f job/seed-database.yaml

显式执行其文件时运行

如何使用 helm 做同样的事情?

【问题讨论】:

  • 只需从templates 文件夹中删除这些文件....基本上当您在后台运行helm install 时,它将获取模板文件夹中的所有文件,并用模板替换这些值引擎,创建最终的 yaml 文件...然后它将所有这些清单再次发送到 k8s api 服务器(就像所有这些清单上的kubectl apply)。
  • 但我需要对它们进行模板化。我有大约 5 卷和 20 个环境变量需要提供给每个作业。
  • 这是我所知道的:job 是一个 k8s 概念。当您创建它时,它会根据其规范中定义的任何内容运行到终止。 hook 是一个掌舵概念。钩子可以使用作业,并确保它们在安装过程的指定点上运行。例如,您的第一个示例是安装后并在 helm chart 安装后运行。据我所知,没有手动执行作业。您也许可以安装一个具有可以手动调用的 api 的资源,或者使用 cronjob 来安排执行..
  • @murtiko 它们都不适合我,因为这些工作只是简单的维护脚本:“初始化数据库,创建管理员用户,关闭网站进行维护,将其备份,刷新缓存,创建备份,加载备份等”创建一个服务器来处理这些是没有意义的,特别是因为其中一些将在部署项目时只使用一次。
  • 好的,所以这应该会有所帮助suspended jobs!!!kubernetes.io/blog/2021/04/12/introducing-suspended-jobs

标签: kubernetes kubernetes-helm


【解决方案1】:

回复您的上一条评论并感谢@HubertNNN 的想法:

我可以多次运行暂停的作业吗?从文档看来 就像一个一次性的工作,不能像正常工作一样重新运行

这是正常的工作,你只是用.spec.suspend: true编辑yaml文件,它是startTime

apiVersion: batch/v1
kind: Job
metadata:
  name: myjob
spec:
  suspend: true
  parallelism: 1
  completions: 5
  template:
    spec:
      ...

如果所有的 Job 都是在suspended 状态下创建的,并且放在一个pending queue 中,我可以通过按正确的顺序恢复 Job 来实现基于优先级的 Job 调度。

更多信息是here

【讨论】:

    猜你喜欢
    • 2013-12-28
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    相关资源
    最近更新 更多