我们发现,创建的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
PodGC
Workflow清理策略
Pod清理策略
执行流程图:
流程简要介绍:
wfc.runTTLController 是伴随着Argo Workflow Controller主流程启动,但是是异步执行的任务。该任务负责TTL操作。
wfc.runTTLController
Argo Workflow Controller
ttlcontroller.NewController
TTLController
EventHandler
Workflow
我们在之前的源码分析中已经发现有podCleanQueue这么一个队列,用于清理Pod资源。在之前对Argo Workflow Controller的核心流程的介绍中有一个woc.operate操作,该操作执行完成后Workflow核心流程便执行完成了。在这之后还有一个操作便是PodGC处理逻辑。
podCleanQueue
Pod
woc.operate
PodGC处理逻辑
添加到队列的操作行为是deletePod,执行逻辑便是直接删除Kubernetes中对应的Pod:
deletePod
Kubernetes
这里需要注意Completion和Success的区别。Completion表示Workflow执行完成,Workflow的状态不是Running/Appending/Unknown阻塞状态。Success表示Workflow执行完成,并且exit code为0,表示没有错误产生。
Completion
Success
Running/Appending/Unknown
exit code
0