我们发现,创建的Workflow在执行成功后并没有清理,而是全部都保留了下来,造成空间下的Pod越积越多。其实Argo Workflow是有清理策略的,我们先看看官方文档介绍:https://argoproj.github.io/argo-workflows/cost-optimisation/#limit-the-total-number-of-workflows-and-pods
官方提供了三种建议性的方案,其中TTLStrategy
和PodGC
比较常用一些,一个是Workflow清理策略
,一个是Pod清理策略
。我们来看看这两种清理策略的具体逻辑是怎么样的吧。
一、TTLStrategy
执行流程图:
流程简要介绍:
-
wfc.runTTLController
是伴随着Argo Workflow Controller
主流程启动,但是是异步执行的任务。该任务负责TTL操作。 -
通过
ttlcontroller.NewController
方法创建TTLController
,并且在这里会注册对应的EventHandler
用于处理完成的Workflow
对象:
二、PodGC
我们在之前的源码分析中已经发现有podCleanQueue
这么一个队列,用于清理Pod
资源。在之前对Argo Workflow Controller
的核心流程的介绍中有一个woc.operate
操作,该操作执行完成后Workflow
核心流程便执行完成了。在这之后还有一个操作便是PodGC处理逻辑
。
添加到队列的操作行为是deletePod
,执行逻辑便是直接删除Kubernetes
中对应的Pod
:
::: tip
这里需要注意Completion
和Success
的区别。
Completion
表示Workflow
执行完成,Workflow
的状态不是Running/Appending/Unknown
阻塞状态。
Success
表示Workflow
执行完成,并且exit code
为0
,表示没有错误产生。
:::