K8s中的垃圾回收
K8s中的垃圾回收
基于1.29
K8s的垃圾回收主要是以下的问题
- 结束的Pod对象
- 完结的Job对象
- 无主对象,这类的对象的Owner不存在
- 不再使用的容器和镜像
- 不再使用的动态创建的PV对象,对应的StorageClass声明了回收策略Delete
- 下列场景中被删除的Node
- 控制器的集群
- Node Lease对象
Pod对象垃圾回收
对于我阶段为Failed的Pod,对应的容器虽然已经停止,但是其资源对象依旧存在API Server,需要被Pod控制器或者运维人员手动删除
kube-controller-manager中有一个名为PodGC的组件专门负责自动清理“垃圾类”Pod
- 孤儿Pod,绑定的Node已经不存在
- 未调度就结束的Pod
- 终结中的Pod,这类Pod满足,它们被绑定到NotReady的Node,该Node有一个污点node.kubernetes.io/out-of-service,并且NodeOutOfServiceVolumeDetach特性门控开启
对于孤儿Pod,如果它们的阶段不少终结阶段,则PodGC会把它们设置为Failed,此时,如果集群开启PodDisruption Conditions特性门控,则当PodGC清理垃圾Pod时,会为目标Pod增加一个值为DeleteionByPodGC的Pod DisurptionTarget Condition表明Pod是因为垃圾回收而被删除的
- PodGC什么时候开始?当集群中的垃圾Pod超过kube-controller-manager参数设置的
--termindated-pod-gc-threshold
,默认值12500
Job对象的垃圾回收
在K8s v1.23中 Job对象的垃圾回收进入Stable阶段
K8s采用了类似TTL机制限制Job对象的生命周期
在Job对象中.spec.ttlSencondsAfterFinished的属性中设置合理的过期时间,然后K8s TTL Controller会等待Job对象的TTL时间结束,并自动回收该Job对象
无主对象的垃圾回收
K8s中的很多对象都有所属关系,对象的Owner标注了他们控制层和其他的依赖关系
- Owner字段值呢作用于集群范畴的对象,如果被设置为命名空间的范围的对象,则会被认为是无法解析的Owner对象
容器和镜像的垃圾回收
kubelet进程负责清理容器和镜像垃圾,默认频率如下
- 每俩分钟清理镜像垃圾
- 每一分钟清理一次容器垃圾
kubelet清理会关注俩个指标
- HighThresholdPercent阈值
- Low ThresholdPercent阈值
1.29版本引入新特性,允许kubelet在磁盘还很充足的情况下,把一个长期未使用的镜像从本地删除,这个新特性需要开启ImageMaximumGCAge特性,还需要设置时间,需要在每个kubelet上设置
一般的,kubelet会先回收“死亡”最久的容器,kubelet基于下面的参数进行回收
- MinAge:kubelte可回收的容器的最短生存时间,如果设置为0.禁止回收
- MaxPerPodContainer:每个Pod允许的最大“死亡”容器数量
- MaxContainers:集群中允许的最大“死亡”容器数量
kubelet只会回收自己创建的容器,不会回收其他应用创建的容器
PV对象的垃圾回收
v1.23中新增Alpha特性,PV deletion protection finalizer,对于那些动态创建的PV对象,如果他们对应的StorageClas声明了回收策略为delete,就会设置“删除保护”的Finalizer
- kubernetes.io/pv-controller:添加K8s内置的PV对象上
- External-provisioner.colume.kubernetes.io/finalizer:添加外部的CSI PV对象上
Node和Node Lease对象的垃圾回收
公有云、混合云汇总一般通过Cloud Controller Manager自动管理公有云中的Node,主要功能如下
- 更新对应的Node信息
- 给Node添加注解和标签
- 获取Node得主机名和网络地址
- 检查和验证Node的监控状态
如果K8s集群节点多,大量的Node心跳会加重API Server的压力,所以出现了需要更新和持久化对象Node Statue,但是Node Statue毕竟重,所以又出现了轻量的Node Lease实现高性能的心跳检查和Node状态更新
[root@hcss-ecs-5425 ~]# k get lease -A |