垃圾回收

垃圾回收是 Kubernetes 用于清理集群资源的各种机制的统称。这允许清理以下资源:

所有者和依赖项

Kubernetes 中的许多对象通过 所有者引用 彼此链接。所有者引用告诉控制平面哪些对象依赖于其他对象。Kubernetes 使用所有者引用来让控制平面和其他 API 客户端有机会在删除对象之前清理相关资源。在大多数情况下,Kubernetes 会自动管理所有者引用。

所有权不同于某些资源也使用的 标签和选择器 机制。例如,考虑一个 服务,它创建 EndpointSlice 对象。该服务使用标签来让控制平面确定哪些 EndpointSlice 对象用于该服务。除了标签之外,每个代表服务管理的 EndpointSlice 都有一个所有者引用。所有者引用帮助 Kubernetes 的不同部分避免干扰它们不控制的对象。

级联删除

Kubernetes 检查并删除不再具有所有者引用的对象,例如在您删除副本集时留下的 Pod。当您删除对象时,您可以控制 Kubernetes 是否自动删除该对象的依赖项,这个过程称为级联删除。级联删除有两种类型,如下所示:

  • 前台级联删除
  • 后台级联删除

您还可以使用 Kubernetes 终结器 控制垃圾回收如何以及何时删除具有所有者引用的资源。

前台级联删除

在前台级联删除中,您要删除的所有者对象首先进入正在删除状态。在此状态下,对所有者对象会发生以下情况:

  • Kubernetes API 服务器将对象的 metadata.deletionTimestamp 字段设置为对象被标记为要删除的时间。
  • Kubernetes API 服务器还将 metadata.finalizers 字段设置为 foregroundDeletion
  • 该对象将通过 Kubernetes API 保持可见,直到删除过程完成。

所有者对象进入正在删除状态后,控制器会删除依赖项。删除所有依赖项对象后,控制器会删除所有者对象。此时,该对象在 Kubernetes API 中不再可见。

在前台级联删除期间,唯一阻止所有者删除的依赖项是那些具有 ownerReference.blockOwnerDeletion=true 字段的依赖项。请参阅 使用前台级联删除 了解详细信息。

后台级联删除

在后台级联删除中,Kubernetes API 服务器会立即删除所有者对象,控制器会在后台清理依赖项对象。默认情况下,Kubernetes 使用后台级联删除,除非您手动使用前台删除或选择使依赖项对象成为孤儿。

请参阅 使用后台级联删除 了解详细信息。

孤儿依赖项

当 Kubernetes 删除所有者对象时,留下的依赖项称为孤儿对象。默认情况下,Kubernetes 会删除依赖项对象。要了解如何覆盖此行为,请参阅 删除所有者对象并使依赖项成为孤儿

未使用的容器和镜像的垃圾回收

kubelet 每两分钟对未使用的镜像执行一次垃圾回收,每分钟对未使用的容器执行一次垃圾回收。您应该避免使用外部垃圾回收工具,因为这些工具可能会破坏 kubelet 行为并删除应该存在的容器。

要配置未使用的容器和镜像垃圾回收的选项,请使用 配置文件 调整 kubelet,并使用 KubeletConfiguration 资源类型更改与垃圾回收相关的参数。

容器镜像生命周期

Kubernetes 通过其镜像管理器(它是 kubelet 的一部分)与 cadvisor 协作来管理所有镜像的生命周期。kubelet 在做出垃圾回收决策时会考虑以下磁盘使用限制:

  • HighThresholdPercent
  • LowThresholdPercent

磁盘使用量超过配置的 HighThresholdPercent 值将触发垃圾回收,这将根据镜像上次使用的时间按顺序删除镜像,从最旧的镜像开始。kubelet 会删除镜像,直到磁盘使用量达到 LowThresholdPercent 值。

未使用的容器镜像的垃圾回收

功能状态: Kubernetes v1.30 [beta]

作为一项 beta 功能,您可以指定本地镜像可以保持未使用的最长时间,无论磁盘使用量如何。这是一个您为每个节点配置的 kubelet 设置。

要配置此设置,请为 kubelet 启用 ImageMaximumGCAge 功能网关,并在 kubelet 配置文件中为 imageMaximumGCAge 字段设置一个值。

该值以 Kubernetes 持续时间指定;kubelet 配置文件中的 imageMaximumGCAge 字段的有效时间单位为:

  • "ns" 表示纳秒
  • "us" 或 "µs" 表示微秒
  • "ms" 表示毫秒
  • "s" 表示秒
  • "m" 表示分钟
  • "h" 表示小时

例如,您可以将配置字段设置为 12h45m,这意味着 12 小时 45 分钟。

容器垃圾回收

kubelet 根据以下变量对未使用的容器进行垃圾回收,您可以定义这些变量:

  • MinAge:kubelet 可以对容器进行垃圾回收的最小年龄。通过设置为 0 来禁用。
  • MaxPerPodContainer:每个 Pod 可以具有的已死容器的最大数量。通过设置为小于 0 来禁用。
  • MaxContainers:集群可以具有的已死容器的最大数量。通过设置为小于 0 来禁用。

除了这些变量之外,kubelet 还会对未识别和已删除的容器进行垃圾回收,通常从最旧的容器开始。

MaxPerPodContainerMaxContainers 可能会在以下情况下相互冲突:保留每个 Pod 的最大容器数量 (MaxPerPodContainer) 会超出允许的全局已死容器总数 (MaxContainers)。在这种情况下,kubelet 会调整 MaxPerPodContainer 来解决冲突。最坏的情况是将 MaxPerPodContainer 降级为 1 并逐出最旧的容器。此外,一旦由已删除的 Pod 拥有的容器的年龄超过 MinAge,这些容器就会被删除。

配置垃圾回收

您可以通过配置特定于管理这些资源的控制器的选项来调整资源的垃圾回收。以下页面将向您展示如何配置垃圾回收:

下一步

最后修改时间:2024 年 6 月 13 日下午 4:41 PST:更新 garbage-collection.md (97682374d5)