1

背景

我正在使用 TZCronJob 在 Kubernetes 中运行带有时区的 cronjobs。示例cronjob.yaml可能如下所示(根据cronjobber 文档)。请注意指定的时区、时间表和kind=TZCronJob

apiVersion: cronjobber.hidde.co/v1alpha1
kind: TZCronJob
metadata:
  name: hello
spec:
  schedule: "05 09 * * *"
  timezone: "Europe/Amsterdam"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo "Hello, World!"
          restartPolicy: OnFailure

通常,对于 Kubernetes 中的任何旧 cronjob,您都可以kubectl create job test-job --from=tzcronjob/name_of_my_cronjob按照kubectl create cronjob docs运行。

错误

但是,当我尝试使用kubectl create job test-job --from=tzcronjob/name_of_my_cronjob(将 from 命令切换到--from=tzcronjob/)运行它时,我得到:

error: from must be an existing cronjob: no kind "TZCronJob" is registered for version "cronjobber.hidde.co/v1alpha1" in scheme "k8s.io/kubernetes/pkg/kubectl/scheme/scheme.go:28"

当我尝试查看https://kubernetes.io/kubernetes/pkg/kubectl/scheme/scheme.go:28时,我得到 404,未找到。

这几乎奏效了,但无济于事:

kubectl create job test-job-name-v1 --image=tzcronjob/name_of_image

如何从我的图表定义中创建新的一次性工作?

4

3 回答 3

1

Helm中有称为Hooks的机制。

Helm 提供了一种钩子机制,允许图表开发人员在发布生命周期的某些点进行干预。例如,您可以使用挂钩来:

  • 在加载任何其他图表之前在安装期间加载 ConfigMap 或 Secret

  • 在安装新图表之前执行一个作业以备份数据库,然后在升级后执行第二个作业以恢复数据

  • 在删除版本之前运行作业,以便在删除服务之前优雅地退出轮换。

Hooks 像常规模板一样工作,但它们具有特殊的注释,导致 Helm 以不同的方式使用它们。在本节中,我们将介绍钩子的基本使用模式。

挂钩在清单的元数据部分中声明为注释:

apiVersion: ...
kind: ....
metadata:
  annotations:
    "helm.sh/hook": "pre-install"

如果资源是 Job 类型,Tiller 将等到作业成功运行完成。如果作业失败,发布也会失败。这是一个阻塞操作,因此 Helm 客户端将在 Job 运行时暂停。

如何编写钩子:

钩子只是 Kubernetes 清单文件,在元数据部分带有特殊注释。因为它们是模板文件,所以您可以使用所有普通模板功能,包括读取 .Values、 . 发布.Template

例如,存储在 templates/post-install-job.yaml 中的这个模板声明了一个要在安装后运行的作业:

apiVersion: batch/v1
kind: Job
metadata:
  name: "{{.Release.Name}}"
  labels:
    app.kubernetes.io/managed-by: {{.Release.Service | quote }}
    app.kubernetes.io/instance: {{.Release.Name | quote }}
    app.kubernetes.io/version: {{ .Chart.AppVersion }}
    helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}"
  annotations:
    # This is what defines this resource as a hook. Without this line, the
    # job is considered part of the release.
    "helm.sh/hook": post-install
    "helm.sh/hook-weight": "-5"
    "helm.sh/hook-delete-policy": hook-succeeded
spec:
  template:
    metadata:
      name: "{{.Release.Name}}"
      labels:
        app.kubernetes.io/managed-by: {{.Release.Service | quote }}
        app.kubernetes.io/instance: {{.Release.Name | quote }}
        helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}"
    spec:
      restartPolicy: Never
      containers:
      - name: post-install-job
        image: "alpine:3.3"
        command: ["/bin/sleep","{{default "10" .Values.sleepyTime}}"]

使这个模板成为钩子的是注释:

  annotations:
    "helm.sh/hook": post-install
于 2019-11-12T09:34:40.117 回答
0

kubernetes 原生支持 CronJobs。您不需要使用自定义资源定义或其他第三方对象。只需如下更新yaml。它应该工作

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "05 09 * * *"
  timezone: "Europe/Amsterdam"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo "Hello, World!"
          restartPolicy: OnFailure

如果您想使用时区支持的 cronjob,请按照以下步骤安装 cronjobber

# Install CustomResourceDefinition
$ kubectl apply -f https://raw.githubusercontent.com/hiddeco/cronjobber/master/deploy/crd.yaml
# Setup service account and RBAC
$ kubectl apply -f https://raw.githubusercontent.com/hiddeco/cronjobber/master/deploy/rbac.yaml
# Deploy Cronjobber (using the timezone db from the node)
$ kubectl apply -f https://raw.githubusercontent.com/hiddeco/cronjobber/master/deploy/deploy.yaml
于 2019-11-08T04:26:50.583 回答
0

你是否注册了自定义资源 TZCronJob?您可以使用kubectl get crdkubectl api-versions检查。

于 2019-11-08T02:05:18.607 回答