详解 Kubernetes 中的垃圾回收机制
设想这么一个场景:我们在 K8s 上创建了一个对象,它根据需要生成副本集和 Pod。在检查时,我们遗漏了容器某个属性的设置,因此又重新编辑了 Deployment。新的 Deployment 就产生了新的副本集对象和新的 Pod。这里就出现了一个问题,旧的副本集和 Pop 去哪了?另外,如果直接删除 Deployment,那副本集和 Pod 又会如何?事实就是,在删除 Deployment 后,副本集和 Pod 也会一起被删除,要不然集群早就乱套了。
什么是垃圾回收?
一般来说,垃圾回收(GC)就是从系统中删除未使用的对象,并释放分配给它们的计算资源。GC 存在于所有的高级编程语言中,较低级的编程语言通过系统库实现 GC。
GC 最常见的算法之一是 mark-and-sweep,这个算法会标记将删除的对象,再进行删除,如下图所示:
OwnerRefernce
在面向对象的语言中,一些对象会引用其他对象或者直接由其他对象组成,k8s 也有类似形式,例如副本集管理一组 Pod,而 Deployment 又管理着副本集。
metadata.ownerReferences
用于确定关系。metadata.ownerReferences
的值。k get deployment -n kube-system -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES
coredns 2/2 2 2 44d coredns k8s.gcr.io/coredns:1.6.7
k get rs -n kube-system -o json | jq ".items[0].metadata.name, .items[0].metadata.ownerReferences"
"coredns-66bff467f8"
[
{
"apiVersion": "apps/v1",
"blockOwnerDeletion": true,
"controller": true,
"kind": "Deployment",
"name": "coredns",
"uid": "d8f29b78-439c-497e-9a45-7c33bd626a9f"
}
]
k get pods coredns-66bff467f8-rsnmg -n kube-system -o json | jq ".metadata.name, .metadata.ownerReferences"
"coredns-66bff467f8-rsnmg"
[
{
"apiVersion": "apps/v1",
"blockOwnerDeletion": true,
"controller": true,
"kind": "ReplicaSet",
"name": "coredns-66bff467f8",
"uid": "085d5398-1358-43e2-918e-2e03da18c7bd"
}
]
认真观察上述命令的输出,其实它和其他对象 GC 之间是有些许差别的。对象关联参考金字塔是颠倒的:
K8s 的垃圾回收策略
如前面所讲,在 Kubernetes v1.8 之前,依赖对象逻辑删除的实现是在客户端,对于某些资源而言则是在控制器端。有时,客户端会中途失败,导致集群状态混乱,需要手动清理。后来为了解决这个问题,K8s 社区引入并实现了 Garbage Collector Controller(垃圾回收器),用更好用且更简单的方式实现 GC。在 K8s 中,有两大类 GC:
级联(Cascading):在级联删除中,所有者被删除,那集群中的从属对象也会被删除。 孤儿(Orphan):这种情况下,对所有者的进行删除只会将其从集群中删除,并使所有对象处于“孤儿”状态。
对象仍然可以通过 REST API 查询到(可通过 kubectl 或 kuboard 查询到) 对象的 deletionTimestamp 字段被设置 对象的 metadata.finalizers 包含值 foregroundDeletion
在孤儿删除策略(orphan deletion strategy)中,会直接删除所有者对象,并将从属对象中的 ownerReference 元数据设置为默认值。之后垃圾回收器会确定孤儿对象并将其删除。
垃圾回收器如何工作?
如果对象的 OwnerReferences 元数据中没有任何所有者对象,那么垃圾回收器会删除该对象。垃圾回收器由 Scanner、Garbage Processor 和 Propagator 组成:
EventQueue:负责存储 k8s 中资源对象的事件 DAG(有向无环图):负责存储 k8s 中所有资源对象的 owner-dependent 关系 Worker:从 EventQueue 中取出资源对象的事件,并根据事件的类型会采取操作
原文链接:https://sparsecode.io/garbage-collection-in-k8s.html
K8S 进阶训练营
扫描二维码获取
更多云原生知识
k8s 技术圈