google-kubernetes-engine - 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:
停止容器的原因是“杀死”。我怎样才能避免这种行为?
解决方案
正如您在评论部分中提到的,您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 容器提供了一种机制来阻止或延迟应用程序容器启动,直到满足一组先决条件。
推荐阅读
- java - Android - 基于 facebook 的 Firebase 登录并调用 Facebook Graph Api 问题
- sql-server - SQL Server 浏览器和代理不启动
- html - 如何从显示中删除图像标签
- java - Java 覆盖问题(确定实现类中的参数/返回类型)
- variables - 由于路径可变,FTP 任务失败
- html - 用于导航网页和下载 CSV 的 VBA 脚本
- api - 新的 DEV API 是否缺少数据?
- javascript - 在javascript中计算deltaE94
- css - Tailwind - Flex-No-Shrink 和 Flex-Wrap 的工作原理
- pip - 为什么“pip help”没有列出--upgrade?