我最近一直在 GKE 上学习 Kubernetes。 我正在测试 CronJob,但我遇到了那里的行为问题。
以下是节点池、cron 作业设置的概述。
node-pool: 1 node (remaining allocable memory is 1Gi)
cronjob: Simple busybox cron for test
所以,首先,我要求cronjob的requests内存超过节点允许的内存量。 应用此后,当然 pod 无法调度并进入
pending
状态。
requests:
memory: 5Gi ## (unbelievable amount !!)
然后将请求修复为合理的值并应用,删除挂起的 pod!
requests:
memory: 10Mi ## (looks good !!)
但问题就在这里。
即使删除了 pod,也会立即创建继承之前(5Gi 内存请求)配置的 pod,并再次变为待处理状态。
删除 CronJob 本身可以解决问题,但是有没有办法修改 pod 本身或者有其他聪明的方法来做到这一点?
如果删除了 pod,则下一个生成的 pod 应该应用最新的 yaml 设置。 同样奇怪的是,当删除 pod 时,CronJob 会立即尝试生成具有相同设置的 pod。 我想知道为什么以及有什么好的解决方案。
apiVersion: batch/v1
kind: CronJob
metadata:
name: example-job
namespace: default
spec:
schedule: "*/5 * * * *"
concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
spec:
nodeSelector:
cloud.google.com/gke-nodepool: example-node-pool
containers:
- name: hello-world
image: busybox
resources:
requests:
memory: 5Gi # fixed to 10Mi
command:
[
"/bin/sh",
"-c",
"echo 'Hello, World!'"
]
restartPolicy: Never
此设置中有一个中间层。 CronJob 并不直接创建 Pod;而是直接创建 Pod。相反,CronJob 会定期创建 Job 对象,并且 Job 负责创建 Pod。如果更改 CronJob,它根本不会更改现有的 Job。
因此,在您的示例中,CronJob 可能创建了一个作业
example-job-1710681600
。那份工作本身是一成不变的。如果您删除相应的 Pod,作业将按照作业中嵌入的 Pod 规范重新创建它。
如果删除Job,它不会被重新创建(它的时间已经过去),但它也会删除相应的Pod。下次计划运行 CronJob 时,您将获得一个新作业,遵循更新的 CronJob 中嵌入的新作业模板。