Kubernetes GC 设计与实现

Kubernetes GC 设计与实现

💡 原文中文,约6700字,阅读约需16分钟。
📝

内容提要

本文介绍Kubernetes垃圾回收机制:以控制器形式运行,自动清理终止Pod、已完成Job、无主对象、未使用镜像及回收策略为Delete的PV等资源。资源间存在Owner与Dependent依赖关系,默认采用后台级联删除,也可用Finalizer防止误删或实现孤儿对象。以v1.28源码为例,分析GarbageCollector通过Informer构建DAG,将待删对象放入attemptToDelete队列、依赖对象放入attemptToOrphan队列,由Run启动多个worker处理,Sync定期同步资源变化。

🔎

延伸解读

级联删除的两种模式与默认选择

文章指出 Kubernetes 默认采用后台级联删除:API Server 立即删除 Owner 对象,垃圾回收控制器再在后台清理其 Dependent 对象。与之相对的前台级联删除则先删除全部 Dependent,再删除 Owner。这一默认选择意味着删除操作会快速返回,但依赖资源的清理是异步的,读者需注意删除后可能短暂存在残留对象。

Finalizer 如何防止误删与支持孤儿对象

Finalizer 是绑定在资源对象上的属性,只有其值为 nil 时 API Server 才会真正删除对象。文章举例:正在被多个 Pod 使用的 PV 因注册了 Finalizer 而不会被立即删除。此外,注册 OrphanFinalizer 可使垃圾回收控制器在删除 Owner 后忽略其 Dependent,从而保留孤儿对象,为自定义逻辑提供灵活性。

源码中双队列与多 worker 的并发设计

以 v1.28 源码为例,GarbageCollector 通过 Informer 构建 DAG,并将待删对象放入 attemptToDelete 队列、依赖对象放入 attemptToOrphan 队列。Run 方法启动一个 goroutine 构建 DAG,待同步完成后按配置启动多个 worker(默认 20 个)分别处理两个队列。这种设计将删除与孤儿化操作解耦,利用并发提高回收效率。

Sync 定期同步与加锁重建 DAG

Sync 方法定期(如 30 秒)获取可回收资源列表,若与旧列表无变化则跳过本轮。需要回收时,它会加锁暂停异步 worker,然后重新同步监视器并等待 DAG 构建完成,最后更新旧资源列表。这一机制确保资源类型变化时 DAG 能安全重建,避免并发操作导致状态不一致。

❓

Q&A

Kubernetes 垃圾回收主要清理哪些资源?

Kubernetes 垃圾回收会清理终止的 Pod、已完成的 Job、附属主对象已不存在的对象、未使用的容器和容器镜像、StorageClass 回收策略为 Delete 的 PV 卷以及过期的证书签名等资源。

Kubernetes 中 Owner 和 Dependent 是什么关系?

Owner 是被依赖的资源对象(属主资源),Dependent 是依赖其他资源的对象(依赖资源)。例如 Deployment 是 ReplicaSet 的 Owner,ReplicaSet 是 Pod 的 Owner,同时 ReplicaSet 也是 Deployment 的 Dependent。

Kubernetes 默认的级联删除是前台还是后台?有什么区别?

Kubernetes 默认使用后台级联删除。前台级联删除会先删除所有 Dependent 对象,再删除 Owner 对象;后台级联删除则立即删除 Owner 对象,然后由垃圾回收控制器在后台清理其 Dependent 对象。

Finalizer 在垃圾回收中起什么作用?

Finalizer 用于防止误删资源,对象删除前其 Finalizer 字段必须为 nil,API Server 才会删除该对象。它还可以在删除前执行钩子函数,或通过注册 OrphanFinalizer 实现只删除当前对象而保留依赖对象(孤儿对象)。

GarbageCollector 控制器启动时 Run 方法做了哪些事情?

Run 方法首先启动一个 goroutine 执行 DAG 的构建和同步,等待 DAG 构建完成后,根据配置启动多个 worker goroutine 分别处理 attemptToDelete 队列(待删除对象)和 attemptToOrphan 队列(待孤儿化对象)。

GarbageCollector 的 Sync 方法如何定期同步资源?

Sync 方法定期获取可回收资源列表,与旧列表比较,若发生变化则加锁暂停 worker,重新同步监视器并等待 DAG 构建完成,然后更新旧资源列表,确保垃圾回收基于最新资源状态执行。

🏷️

标签

➡️

继续阅读