Kubernetes 垃圾收集(Garbage Collection)完全指南:对象生命周期管理
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 --port8080 # 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/json2.3.2 方式 2通过 kubectl 命令设置kubectl 支持--cascade参数默认值true即级联删除# 级联删除默认删除 ReplicaSet 及关联 Pod kubectl delete replicaset my-repset --cascadetrue # 孤儿模式仅删除 ReplicaSet保留关联 Pod kubectl delete replicaset my-repset --cascadefalse2.3.3 默认策略说明对于 ReplicationController、ReplicaSet、StatefulSet、DaemonSet、Deployment 等控制器资源默认级联删除策略为Orphan即--cascadefalse需显式指定--cascadetrue才会删除依赖对象。其他资源如自定义资源默认策略可能不同建议删除时明确指定级联策略。3. 已知的问题自定义资源不支持Kubernetes 1.7 版本及之前垃圾收集不支持自定义资源如通过 CustomResourceDefinition 新增的资源、API Server 聚集的资源。权限控制Kubernetes 1.7 版本后新增准入控制器限制未授权用户设置blockOwnerDeletion: true避免恶意依赖对象阻止所有者删除。手动配置风险手动设置ownerReferences时若未正确配置blockOwnerDeletion可能导致所有者删除被阻塞或依赖对象成为孤儿。核心总结与最佳实践1. 核心价值垃圾收集器自动清理无主依赖对象避免集群资源泄露。级联删除策略灵活控制对象生命周期适配不同业务场景如快速删除 vs 安全删除。2. 最佳实践生产环境优先使用 Foreground 级联删除确保依赖对象先被清理避免孤儿对象残留如数据库 Pod 未删除导致数据不一致。明确指定级联策略删除控制器资源时显式使用--cascadetrue或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