背景
我使用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 cronjob文档运行kubectl create job test-job --from=tzcronjob/name_of_my_cronjob
。
错误
然而,当我尝试用kubectl create job test-job --from=tzcronjob/name_of_my_cronjob
运行它(从命令切换到--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
如何根据图表定义创建新的一次性作业?
在Helm中有一种称为钩子的机制。
Helm提供了一种挂钩机制,允许图表开发人员在发布生命周期的某些时刻进行干预。例如,您可以使用挂钩:
-
在安装期间加载ConfigMap或Secret,然后再加载任何其他图表加载
-
在安装新图表之前,执行作业以备份数据库,然后在升级之后执行第二作业以便恢复数据
-
在删除发布之前运行作业以正常地删除服务
Hook的工作方式类似于常规模板,但它们有特殊的注释,这导致Helm以不同的方式使用它们。在本节中,我们将介绍钩子的基本使用模式。
挂钩在清单的元数据部分声明为注释:
apiVersion: ...
kind: ....
metadata:
annotations:
"helm.sh/hook": "pre-install"
如果资源是作业类型,Tiller将等待作业成功运行完成。如果作业失败,发布就会失败。这是一个阻塞操作,因此Helm客户端将在作业运行时暂停。
如何编写挂钩:
挂钩只是Kubernetes清单文件,在元数据部分有特殊的注释。因为它们是模板文件,所以您可以使用所有常规模板功能,包括读取。值、.发布和.template.
例如,这个存储在templates/post-install-job.yaml中的模板声明了一个要在post-install上运行的作业:
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
您是否注册了自定义资源TZCronJob?您可以使用kubectl get crd
或kubectl api-versions
进行检查。
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