Kubernetes 垃圾收集(Garbage Collection)完全指南:对象生命周期管理
1. Owner 和 Dependent(所有者与依赖对象)
1.1 核心概念
Owner(所有者):Kubernetes 中部分对象可作为其他对象的 “所有者”,例如 ReplicaSet 是其管理的 Pod 的所有者。
Dependent(依赖对象):被其他对象拥有的对象,每个依赖对象的
metadata.ownerReferences字段会指向其所有者。自动关联:Kubernetes 1.6+ 版本中,ReplicationController、ReplicaSet、StatefulSet、DaemonSet、Deployment 创建的对象(如 Pod)会自动设置
ownerReferences,无需手动配置。手动关联:可通过手动设置
ownerReferences字段,自定义所有者与依赖对象的关系。
1.2 示例:ReplicaSet 与 Pod 的关联
# 示例:ReplicaSet 配置(所有者) apiVersion: extensions/v1beta1 kind: ReplicaSet metadata: name: my-repset spec: replicas: 3 selector: matchLabels: pod-is-for: garbage-collection-example template: metadata: labels: pod-is-for: garbage-collection-example spec: containers: - name: nginx image: nginx创建后,Pod 的ownerReferences会自动关联到该 ReplicaSet:
# Pod 的 metadata 字段(依赖对象) apiVersion: v1 kind: Pod metadata: ownerReferences: - apiVersion: extensions/v1beta1 controller: true blockOwnerDeletion: true # 阻止所有者删除(后续详解) kind: ReplicaSet name: my-repset uid: d9607e19-f88f-11e6-a518-42010a8001952. 控制垃圾收集器删除 Dependent(级联删除)
当删除所有者对象时,可通过「级联删除」策略控制是否自动删除其依赖对象。未被自动删除的依赖对象称为「孤儿对象」。Kubernetes 支持两种级联删除模式:
2.1 Background 级联删除(后台删除)
执行逻辑:先立即删除所有者对象,垃圾收集器在后台异步删除依赖对象。
特点:删除操作不阻塞,所有者对象快速消失,依赖对象清理在后台完成。
适用场景:对删除速度有要求,无需等待依赖对象清理完成的场景。
2.2 Foreground 级联删除(前台删除)
- 执行逻辑:
所有者对象先进入「删除中」状态(
deletionTimestamp字段被设置,metadata.finalizers包含foregroundDeletion)。所有者对象仍可通过 API 访问,垃圾收集器优先删除所有依赖对象(仅阻塞
blockOwnerDeletion: true的依赖对象)。所有依赖对象删除完成后,再删除所有者对象。
特点:删除操作阻塞,确保依赖对象先被清理,避免孤儿对象产生。
关键说明:
blockOwnerDeletion: true的依赖对象会阻止所有者删除,仅控制器(如 Deployment)自动创建的依赖对象会默认设置该字段,手动创建的对象需显式配置。
2.3 设置级联删除策略
通过deleteOptions.propagationPolicy字段指定策略,支持三种取值:Background、Foreground、Orphan(孤儿模式,不删除依赖对象)。
2.3.1 方式 1:通过 API 调用设置(curl)
# 1. 启动 kubectl proxy(便于本地调用 API) kubectl proxy --port=8080 # 2. Background 级联删除(后台删除依赖对象) curl -X DELETE localhost:8080/apis/extensions/v1beta1/namespaces/default/replicasets/my-repset -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Background"}' -H "Content-Type: application/json" # 3. Foreground 级联删除(前台删除依赖对象) curl -X DELETE localhost:8080/apis/extensions/v1beta1/namespaces/default/replicasets/my-repset -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Foreground"}' -H "Content-Type: application/json" # 4. Orphan 模式(不删除依赖对象,使其成为孤儿) curl -X DELETE localhost:8080/apis/extensions/v1beta1/namespaces/default/replicasets/my-repset -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Orphan"}' -H "Content-Type: application/json"2.3.2 方式 2:通过 kubectl 命令设置
kubectl 支持--cascade参数(默认值true,即级联删除):
# 级联删除(默认,删除 ReplicaSet 及关联 Pod) kubectl delete replicaset my-repset --cascade=true # 孤儿模式(仅删除 ReplicaSet,保留关联 Pod) kubectl delete replicaset my-repset --cascade=false2.3.3 默认策略说明
对于 ReplicationController、ReplicaSet、StatefulSet、DaemonSet、Deployment 等控制器资源,默认级联删除策略为
Orphan(即--cascade=false),需显式指定--cascade=true才会删除依赖对象。其他资源(如自定义资源)默认策略可能不同,建议删除时明确指定级联策略。
3. 已知的问题
自定义资源不支持:Kubernetes 1.7 版本及之前,垃圾收集不支持自定义资源(如通过 CustomResourceDefinition 新增的资源、API Server 聚集的资源)。
权限控制:Kubernetes 1.7 版本后新增准入控制器,限制未授权用户设置
blockOwnerDeletion: true,避免恶意依赖对象阻止所有者删除。手动配置风险:手动设置
ownerReferences时,若未正确配置blockOwnerDeletion,可能导致所有者删除被阻塞或依赖对象成为孤儿。
核心总结与最佳实践
1. 核心价值
垃圾收集器自动清理无主依赖对象,避免集群资源泄露。
级联删除策略灵活控制对象生命周期,适配不同业务场景(如快速删除 vs 安全删除)。
2. 最佳实践
生产环境优先使用 Foreground 级联删除:确保依赖对象先被清理,避免孤儿对象残留(如数据库 Pod 未删除导致数据不一致)。
明确指定级联策略:删除控制器资源时,显式使用
--cascade=true或propagationPolicy: Foreground,避免依赖对象成为孤儿。避免手动修改 ownerReferences:除非明确需求,否则不手动修改
ownerReferences字段,防止关联关系错乱。监控孤儿对象:定期检查集群中无
ownerReferences的对象(如kubectl get pods --all-namespaces -o jsonpath='{range .items[*]}{if not .metadata.ownerReferences}{.metadata.name}{"n"}{end}'),及时清理无用资源。
扩展:垃圾收集相关字段详解
| 字段 | 作用 |
|---|---|
metadata.ownerReferences | 关联所有者对象,包含 API 版本、类型、名称、UID 等信息 |
blockOwnerDeletion: true | 依赖对象阻止所有者删除,仅控制器自动创建的对象默认设置 |
deletionTimestamp | 所有者对象进入删除中状态的时间戳 |
metadata.finalizers | 删除钩子,foregroundDeletion表示前台删除模式 |
propagationPolicy | 级联删除策略(Background/Foreground/Orphan) |