我们的集群中有一个 cronjob 监控。如果 24 小时内没有 pod 出现,说明 cronjob 没有运行,我们需要提醒。但有时,由于一些垃圾收集,pod 被删除(但作业成功完成)。如何保留所有 pod 并避免垃圾收集?我知道终结器,但看起来它在这种情况下不起作用。
问问题
86 次
1 回答
0
将此作为答案发布,因为这是它可能发生的原因。
回答
云 Kubernetes 集群有nodes autoscaling
策略。或者有时node pools
可以手动缩小/放大。
Cronjob
job
为每次运行创建一个相应的pod
. Pod 被分配给精确的节点。如果由于任何原因,分配给它的 pod(s) 节点由于 被删除,则 podnode autoscaling/manual scaling
将消失。但是,作业将被保留,因为它们存储在etcd
.
有两个标志可以控制存储在历史记录中的作业数量:
.spec.successfulJobsHistoryLimit
- 默认情况下设置为3
.spec.failedJobsHistoryLimit
- 默认设置为1
如果进行设置,0
那么所有内容都将在作业完成后立即删除。
实际上它是如何发生的
我有一个带有两个节点的 GCP GKE 集群:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
gke-cluster-xxxx Ready <none> 15h v1.21.3-gke.2001
gke-cluster-yyyy Ready <none> 3d20h v1.21.3-gke.2001
cronjob.yaml
用于检测:
apiVersion: batch/v1
kind: CronJob
metadata:
name: test-cronjob
spec:
schedule: "*/2 * * * *"
successfulJobsHistoryLimit: 5
jobTemplate:
spec:
template:
spec:
containers:
- name: test
image: busybox
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
创建的 Pod:
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-cronjob-27253914-mxnzg 0/1 Completed 0 8m59s 10.24.0.22 gke-cluster-4-xxxx <none> <none>
test-cronjob-27253916-88cjn 0/1 Completed 0 6m59s 10.24.0.25 gke-cluster-4-xxxx <none> <none>
test-cronjob-27253918-hdcg9 0/1 Completed 0 4m59s 10.24.0.29 gke-cluster-4-xxxx <none> <none>
test-cronjob-27253920-shnnp 0/1 Completed 0 2m59s 10.24.1.15 gke-cluster-4-yyyy <none> <none>
test-cronjob-27253922-cw5gp 0/1 Completed 0 59s 10.24.1.18 gke-cluster-4-yyyy <none> <none>
缩小一个节点:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
gke-cluster-4-xxxx NotReady,SchedulingDisabled <none> 16h v1.21.3-gke.2001
gke-cluster-4-yyyy Ready <none> 3d21h v1.21.3-gke.2001
现在得到豆荚:
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-cronjob-27253920-shnnp 0/1 Completed 0 7m47s 10.24.1.15 gke-cluster-4-yyyy <none> <none>
test-cronjob-27253922-cw5gp 0/1 Completed 0 5m47s 10.24.1.18 gke-cluster-4-yyyy <none> <none>
第一个节点上之前完成的 Pod 现在已经消失了。
职位还在:
$ kubectl get jobs
NAME COMPLETIONS DURATION AGE
test-cronjob-27253914 1/1 1s 13m
test-cronjob-27253916 1/1 2s 11m
test-cronjob-27253918 1/1 1s 9m55s
test-cronjob-27253920 1/1 34s 7m55s
test-cronjob-27253922 1/1 2s 5m55s
如何解决
更改监视警报以查找作业完成是更精确的方法,并且独立于任何集群节点扩展操作。
例如,我仍然可以从删除test-cronjob-27253916
对应的作业中检索结果:pod
$ kubectl get job test-cronjob-27253916 -o jsonpath='{.status.succeeded'}
1
有用的链接:
于 2021-10-26T08:21:52.457 回答