需求背景
kubectl logs -p
命令并不能获取已经删除的pod的容器日记,只适用于pod只是重启还未被删除的情况,能够获取重启前的容器的日记。
在Job场景,如果Job达到backoffLimit还是失败,而且backoffLimit值很小,很快就重试完,没能及时的获取到容器的日记。而达到backoffLimit后,job的controller会把pod删掉,这种情况就没办法获取pod的日记了,导致无法得知job执行失败的真正原因,只能看到job给的错误:“Job has reached the specified backoff limit”。
解决方案
一种方案就是添加一个controller(operator),监听terraform job创建的pod,然后给pod添加finalizers,然后监听job的删除,在真正删除之前先获取pod的容器的日记,将日记通过configmap保存下来,或者发送event。
有一个缺陷是修改不了Job的状态,因为在job的controller删除pod之后,会更新覆盖job的状态。
案例
这里以我们实际遇到的问题为案例,就是修改terraform apply、terraform destroy的job的backoffLimit为0后,我们无法获取真正terraform执