1

我们的集群中有一个 cronjob 监控。如果 24 小时内没有 pod 出现,说明 cronjob 没有运行,我们需要提醒。但有时,由于一些垃圾收集,pod 被删除(但作业成功完成)。如何保留所有 pod 并避免垃圾收集?我知道终结器,但看起来它在这种情况下不起作用。

4

1 回答 1

0

将此作为答案发布,因为这是它可能发生的原因。

回答

云 Kubernetes 集群有nodes autoscaling策略。或者有时node pools可以手动缩小/放大。

Cronjobjob为每次运行创建一个相应的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 回答