问题描述
我有一个在K8S上部署的Rails应用程序。在我的网络应用程序中,每天晚上8点运行一个cronjob,这需要6个小时才能完成。我注意到从cronjob启动几个小时后发生OOMkilled
错误。我也增加了Pod的内存,但错误仍然发生。
这是我的yaml
文件:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: sync-data
spec:
schedule: "0 20 * * *" # At 20:00:00pm every day
concurrencyPolicy: Forbid
successfulJobsHistoryLimit: 5
failedJobsHistoryLimit: 5
jobTemplate:
spec:
ttlSecondsAfterFinished: 100
template:
spec:
serviceAccountName: sync-data
containers:
- name: sync-data
resources:
requests:
memory: 2024Mi # OOMKilled
cpu: 1000m
limits:
memory: 2024Mi # OOMKilled
cpu: 1000m
image: xxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/path
imagePullPolicy: IfNotPresent
command:
- "/bin/sh"
- "-c"
- |
rake xxx:yyyy # Will take ~6 hours to finish
restartPolicy: Never
是否有最佳实践在K8S上运行耗时的cronjob? 欢迎任何帮助!
解决方法
OOM被杀死可能有两个原因。
-
您的Pod占用的内存超过了指定的限制。在这种情况下,您需要明显增加该限制。
-
如果节点中的所有Pod占用的内存超出了他们的请求,那么Kubernetes将杀死一些Pod以释放空间。在这种情况下,您可以赋予此广告连播更高的优先级。
您应该进行监视,才能真正确定其原因。适当的监视将向您显示哪些Pod的性能符合预期,而哪些效果不理想。您还可以将节点选择器用于长时间运行的Pod,并设置优先级类别,该优先级将首先删除非cron Pod。
,说实话,在kubernetes中没有正确的资源请求/限制内容,因为它完全取决于您的pod正在做什么。我建议或您可以做的一件事是部署垂直容器自动缩放,并观察垂直容器自动缩放器为您的cron作业提供了理想的资源请求/限制。这是一篇非常不错的文章,您可以从这里开始,您将了解如何在自己的需求中利用它。