首页 > 解决方案 > gke 作业容器重新启动

问题描述

在我的项目中,GKE 每天运行许多作业。有时我看到一个作业运行了两次:第一次部分运行,第二次完全运行,尽管定义了“restartPolicy: Never”。它很少发生(大约每 200 - 300 次运行一次)。

这是一个例子:

I 2020-12-03T00:12:45Z Started container mot-test-deleteoldvalidations-container 
I 2020-12-03T00:12:45Z Created container mot-test-deleteoldvalidations-container 
I 2020-12-03T00:12:45Z Successfully pulled image "gcr.io/xxxxx/mot-del-old-validations:v16" 
I 2020-12-03T00:12:40Z Pulling image "gcr.io/xxxxx/mot-del-old-validations:v16" 
I 2020-12-03T00:12:39Z Stopping container mot-test-deleteoldvalidations-container 
I 2020-12-03T00:01:59Z Started container mot-test-deleteoldvalidations-container 
I 2020-12-03T00:01:59Z Created container mot-test-deleteoldvalidations-container 
I 2020-12-03T00:01:59Z Successfully pulled image "gcr.io/xxxx/mot-del-old-validations:v16" 
I 2020-12-03T00:01:40Z Pulling image "gcr.io/xxxxx/mot-del-old-validations:v16" 

来自工作的 YAML:

spec:
  backoffLimit: 0
  completions: 1
  parallelism: 1
resources:
          limits:
            cpu: "1"
            memory: 2500Mi
          requests:
            cpu: 500m
            memory: 2Gi
        nsPolicy: ClusterFirst
      restartPolicy: Never
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes: 

停止容器的原因是“杀死”。我怎样才能避免这种行为?

标签: google-kubernetes-enginekubernetes-jobs

解决方案


正如您在评论部分中提到的,您NetworkPolicy的设置为Never. 您还设置了spec.backoffLimit,spec.complementions并且spec.parallelism应该可以工作。但是,文档 - 处理 Pod 和容器故障提到这种行为是可能的,并且不被视为问题。

请注意,即使您指定 .spec.parallelism = 1 和 .spec.completions = 1 和 .spec.template.spec.restartPolicy = "Never",同一程序有时也可能会启动两次。

此外,在CronJob 文档中,最佳实践是使作业Indempotent

cron 作业在其计划的每个执行时间大约创建一次作业对象。我们说“约”是因为在某些情况下可能会创建两个工作岗位,或者可能不会创建任何工作岗位。我们试图使这些罕见,但不完全阻止它们。因此,作业应该是幂等的。

在计算中,幂等操作是指使用相同的输入参数多次调用它时不会产生额外影响的操作。例如,从集合中删除一个项目可以被认为是对集合的幂等操作。

由于您的整体job manifest仍然是个谜,因此我想到了两种解决方法。取决于可能有​​帮助的场景。

第一个解决方法

使用PodAntiAffinity不允许部署具有相同标签/选择器的第二个 pod。

第二种解决方法

使用initContainer锁,所以第一个 pod 放一个锁,第二个 pod,如果检测到锁,等待 3-5 秒并退出。

因为 init 容器在任何应用程序容器启动之前运行完成,所以 init 容器提供了一种机制来阻止或延迟应用程序容器启动,直到满足一组先决条件。


推荐阅读