【发布时间】: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