我想做的是定期在每个 Kubernetes 节点上运行一些备份脚本。我希望它在 Kubernetes 集群中运行,而不是仅仅将脚本添加到每个节点的 crontab。这是因为我将备份存储在 Kubernetes 挂载到节点的卷上。它与配置不同,但它可能是由 Flex 插件或awsElasticBlockStore
挂载的 CIFS 文件系统。
如果CronJob
能够模板DaemonSet
(而不是将其修复为jobTemplate
),并且有可能将DaemonSet
重新启动策略设置为OnFailure
,那就完美了。
我想避免为每个节点定义n
n
不同的CronJobs
,然后通过定义nodeSelectors
将它们关联在一起,因为这在节点计数动态更改的环境中维护起来不太方便。
我能看到的问题在这里讨论,没有任何明确的结论:https://github.com/kubernetes/kubernetes/issues/36601
也许你有什么技巧或技巧来实现这一目标吗?
您可以将 DaemonSet 与以下 bash 脚本一起使用:
while :; do
currenttime=$(date +%H:%M)
if [[ "$currenttime" > "23:00" ]] && [[ "$currenttime" < "23:05" ]]; then
do_something
else
sleep 60
fi
test "$?" -gt 0 && notify_failed_job
done
我知道我参加派对迟到了,
第一个选项:
使用并行性运行多个作业 POD,并使用拓扑扩展约束在所有节点上分发/调度 POD。
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: mycronjob
labels:
jobgroup: parallel
spec:
schedule: "*/5 * * * *"
successfulJobsHistoryLimit: 0
failedJobsHistoryLimit: 0
jobTemplate:
spec:
template:
metadata:
name: kubejob
labels:
jobgroup: parallel
spec:
topologySpreadConstraints:
- maxSkew: 2
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
jobgroup: parallel
containers:
- name: mycron-container
image: alpine
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echo Job Pod is Running ; sleep 10']
restartPolicy: OnFailure
terminationGracePeriodSeconds: 0
parallelism: 5
concurrencyPolicy: Allow
选项二:
使用cronjob,您可以应用守护程序集的 YAML 模板,并在一定持续时间后将其删除,这将理想地在所有节点上作为作业工作。此外,如果自定义 docker 镜像在 deamon 集中运行,它也可以在执行完成后完成。
额外:
您可以使用CRD选项查看我的文章,它将像守护程序一样工作:https://medium.com/google-cloud/daemon-job-crd-in-k8s-with-compositecontroller-f263b7f25cb9
在每个可用节点上计划作业。
阅读更多关于CRD的信息:https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/
您可以编写自己的自定义资源并将其添加到kuberetes。