Kubernetes Cron工作惨淡

问题描述

我有一个在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被杀死可能有两个原因。

  1. 您的Pod占用的内存超过了指定的限制。在这种情况下,您需要明显增加该限制。

  2. 如果节点中的所有Pod占用的内存超出了他们的请求,那么Kubernetes将杀死一些Pod以释放空间。在这种情况下,您可以赋予此广告连播更高的优先级。

您应该进行监视,才能真正确定其原因。适当的监视将向您显示哪些Pod的性能符合预期,而哪些效果不理想。您还可以将节点选择器用于长时间运行的Pod,并设置优先级类别,该优先级将首先删除非cron Pod。

,

说实话,在kubernetes中没有正确的资源请求/限制内容,因为它完全取决于您的pod正在做什么。我建议或您可以做的一件事是部署垂直容器自动缩放,并观察垂直容器自动缩放器为您的cron作业提供了理想的资源请求/限制。这是一篇非常不错的文章,您可以从这里开始,您将了解如何在自己的需求中利用它。

https://medium.com/infrastructure-adventures/vertical-pod-autoscaler-deep-dive-limitations-and-real-world-examples-9195f8422724

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...