垃圾回收是指清理 Kubernetes 集群资源的机制,这对于集群的运行状况非常重要。垃圾回收可以清理资源,例如终止的 Pod、已完成的作业、未使用的容器等。
垃圾回收可维护 Kubernetes 集群的运行状况。管理员首先要确定他们应使用默认的自动清理,还是手动配置垃圾回收。
垃圾回收配置
有几种配置可以帮助组织获得对垃圾回收的控制权。
例如,一个部署拥有一个 ReplicaSet,该 ReplicaSet 拥有该 ReplicaSet 中的 Pod。因此,当 admin 或 K8s 之外的其他工具删除部署时,ReplicaSet 和 pod 也会通过引用删除。
可以通过将metadata.blockOwnerDeletion字段设置为 true 来更改此行为。如果设置为 true,则在删除父资源后,资源将保持不变。
镜像
默认情况下,在每个节点上运行的 kubelet 每两分钟删除一次未使用的镜像。要配置此设置,请使用 kubelet 配置文件并为imageMinimumGCAge字段提供持续时间值。
为了触发图像垃圾回收,kubelet 会考虑磁盘使用情况。使用两个可配置字段 HighThresholdPercent 和 LowThresholdPercent,根据上次使用图像的时间删除图像。当磁盘空间达到 HighThresholdPercent 中设置的值时,kublet 将从最早的图像开始。在达到 LowThresholdPercent 中设置的值之前,kubelet 将继续删除图片。
容器
未使用的容器每五分钟清理一次。通过使用标志 --maximum-dead-containers-per-container和containers--minimum-container-ttl-duration 来控制清理的特定行为。
--maximum-dead-containers-per-container全局设置在垃圾回收移除或删除已停止的容器之前要保留的最大容器数。在 kubelet 启动时,默认情况下将其设置为 -1,或者管理员可以手动设置它。这意味着在触发垃圾回收之前,集群上允许的已停止容器数量没有限制。
containers--minimum-container-ttl-duration设置每个容器要保留的旧容器实例数。此值的默认值设置为 1。控制容器垃圾回收前的持续时间。此值设置为 0,表示默认情况下此设置处于禁用状态。
Kubernetes 作业
Kubernetes 作业完成后,除非默认情况下触发了其他垃圾回收条件,否则已完成的作业和 pod 将保持不变。例如,如果触发了 kube-controller-manager 的 terminated-pod-gc-threshold 设置,则在垃圾回收开始删除 Pod 之前,终止的 Pod 数量有限。在大多数情况下,终止的 Pod 将保留一段时间,因为默认值设置为 12,500 个 Pod。
设置作业的字段以控制此行为。此字段确定在作业完成后经过多少秒,然后 TTL 控制器才会删除该作业。建议使用此字段,因为替代项是 的默认删除策略。使用 ,作业完成后,由 Jobs 启动的 pod 将被孤立。如果建立多个孤立的 Pod,这可能会导致性能下降。设置一个值以确保 Pod 在作业完成后删除。
终结器
要向 Kubernetes 指示在资源删除之前要执行特定操作,请使用清单文件创建一个资源并设置metadata.finalizers字段。
终结器类似于注释。真正的魔力在于管理终结器的控制器。例如,在使用 PersistentVolume 时,通常使用kubernetes.io/pv-protection 的终结器。这样可以防止 PersistentVolume 被管理员删除,或者可以防止在删除终结器之前删除 pod 的自动化进程。如果 Pod 正在使用被删除的 PersistentVolume,则资源会被标记为 Terminating,但在删除终结器键之前无法删除。持久卷控制器只会在 Pod 停止使用 PersistentVolume 时清除终结器,这让控制器可以删除 PersistentVolume。