Container Runtime Interface(CRI)
Container Runtime Interface(CRI)是一个插件接口,它使kubelet能够使用各种容器运行时,无需重新编译集群组件。
您需要在集群中的每个节点上安装一个可用的容器运行时,以便kubelet能够启动Pod和它们的容器。
容器运行时接口(CRI)是kubelet和容器运行时之间通信的主要协议。
Kubernetes容器运行时接口(CRI)定义了集群组件kubelet和容器运行时之间通信的主要gRPC协议。
The API
在Kubernetes中,kubelet通过gRPC与容器运行时进行连接时充当客户端。
运行时和镜像服务的终端点必须在容器运行时中可用,可以通过在kubelet中使用–image-service-endpoint命令行标志来单独配置。
对于Kubernetes v1.28,kubelet优先使用CRI v1。如果容器运行时不支持CRI的v1版本,则kubelet尝试协商任何较旧的支持版本。v1.28的kubelet还可以协商CRI v1alpha2版本,但是此版本已被视为不推荐使用。如果kubelet无法协商支持的CRI版本,kubelet将放弃并不会注册为节点。
垃圾回收(Garbage Collection)
垃圾收集是Kubernetes用于清理集群资源的各种机制的集合术语。这允许清理以下资源:
已终止的Pod
已完成的作业
没有所有者引用的对象
未使用的容器和容器镜像
具有Delete回收策略的动态提供的PersistentVolumes的StorageClass
过时或过期的CertificateSigningRequests(CSRs)
在以下场景中删除的节点:
在使用云控制器管理器的情况下,在云中
在使用类似云控制器管理器的附加组件的本地环境中
节点租约对象
Owners and dependents
在Kubernetes中,许多对象通过所有者引用相互链接。
所有者引用告诉控制平面哪些对象依赖于其他对象。
Kubernetes使用所有者引用来为控制平面和其他API客户端提供在删除一个对象之前清理相关资源的机会。在大多数情况下,Kubernetes会自动管理所有者引用。
所有权与某些资源还使用的标签和选择器机制不同。例如,考虑一个创建EndpointSlice对象的Service。Service使用标签来允许控制平面确定哪些EndpointSlice对象用于该Service。除了标签之外,代表Service管理的每个EndpointSlice都有一个所有者引用。所有者引用有助于Kubernetes的不同部分避免干扰它们不控制的对象。
注意:
根据设计,不允许跨命名空间的所有者引用。命名空间内的依赖对象可以指定集群范围或命名空间范围的所有者。命名空间内的所有者必须存在于与依赖对象相同的命名空间中。如果不存在,则将所有者引用视为不存在,并且一旦验证所有者都不存在,依赖对象就会被删除。集群范围的依赖对象只能指定集群范围的所有者。从v1.20开始,如果集群范围的依赖对象指定了一个命名空间内的资源作为所有者,那么它将被视为具有无法解析的所有者引用,无法进行垃圾收集。
从v1.20开始,如果垃圾收集器检测到无效的跨命名空间所有者引用,或者具有引用命名空间内资源的所有者引用的集群范围的依赖对象,将报告一个带有OwnerRefInvalidNamespace的警告事件,涉及的对象是无效的依赖对象。您可以通过运行kubectl get events -A --field-selector=reason=OwnerRefInvalidNamespace来检查这种类型的事件。
Cascading deletion
Kubernetes通过检查并删除不再具有所有者引用的对象来清理资源,例如在删除ReplicaSet时留下的Pod。当您删除一个对象时,您可以控制Kubernetes是否自动删除对象的依赖对象,这个过程称为级联删除。级联删除有两种类型,如下所示:
- 前台级联删除
- 后台级联删除
您还可以使用Kubernetes的finalizers控制垃圾收集如何以及何时删除具有所有者引用的资源。
前台级联删除
在前台级联删除中,您首先正在删除的所有者对象进入一个“正在删除中”的状态。在这个状态下,以下事情发生在所有者对象上:
- Kubernetes API服务器将对象的metadata.deletionTimestamp字段设置为标记对象进行删除的时间。
- Kubernetes API服务器还将metadata.finalizers字段设置为foregroundDeletion。
- 在删除过程完成之前,对象仍然通过Kubernetes API可见。
在所有者对象进入删除中状态后,控制器删除依赖对象。在删除所有依赖对象后,控制器删除所有者对象。在此时,对象在Kubernetes API中不再可见。
在前台级联删除期间,阻止所有者删除的唯一依赖对象是具有ownerReference.blockOwnerDeletion=true字段的依赖对象。有关更多信息,请参阅使用前台级联删除。
后台级联删除
在后台级联删除中,Kubernetes API服务器立即删除所有者对象,而控制器在后台清理依赖对象。默认情况下,Kubernetes使用后台级联删除,除非您手动选择使用前台删除或选择孤立依赖对象。
请参阅使用后台级联删除以了解更多信息。
当Kubernetes删除一个所有者对象时,被留下的依赖对象称为孤立对象。默认情况下,Kubernetes会删除依赖对象。要了解如何覆盖这种行为,请参阅删除所有者对象和孤立依赖对象。
Garbage collection of unused containers and images
Kubelet是每隔五分钟对未使用的镜像执行垃圾收集操作,并且每分钟对未使用的容器执行垃圾收集操作。您应避免使用外部垃圾收集工具,因为这些工具可能会破坏Kubelet的行为并移除本应存在的容器。
要配置未使用的容器和镜像垃圾收集选项,可以使用配置文件来调整Kubelet,并使用KubeletConfiguration
资源类型更改与垃圾收集相关的参数。
Container image lifecycle
Kubernetes通过其镜像管理器来管理所有镜像的生命周期,该镜像管理器是kubelet的一部分,并与cadvisor协同工作。在进行垃圾收集决策时,kubelet考虑以下磁盘使用限制:
- HighThresholdPercent
- LowThresholdPercent
当磁盘使用率超过配置的HighThresholdPercent值时,会触发垃圾收集操作,根据镜像的最后使用时间进行排序,从最旧的镜像开始进行删除。kubelet会删除镜像,直到磁盘使用率达到LowThresholdPercent值。
Container garbage collection
kubelet根据以下变量对未使用的容器执行垃圾收集,您可以自行定义:
- MinAge:kubelet可进行垃圾收集的最小容器年龄。将其设置为0可禁用此功能。
- MaxPerPodContainer:每个Pod可拥有的最大死亡容器数量。将其设置为小于0的值可禁用此功能。
- MaxContainers:集群中可存在的最大死亡容器数量。将其设置为小于0的值可禁用此功能。
除了这些变量之外,kubelet还会对未识别和已删除的容器执行垃圾收集,通常是从最旧的容器开始。
在某些情况下,MaxPerPodContainer和MaxContainers可能会相互冲突,其中保留每个Pod的最大容器数(MaxPerPodContainer)将超出允许的全局死亡容器总数(MaxContainers)。在此情况下,kubelet会调整MaxPerPodContainer以解决冲突。最糟糕的情况是将MaxPerPodContainer降级为1并驱逐最旧的容器。此外,已删除的Pod所拥有的容器会在超过MinAge时移除。
注意:kubelet仅对其管理的容器执行垃圾收集
。
配置垃圾回收
「配置 Kubernetes 对象的级联删除」:指的是配置 Kubernetes 如何处理对象的删除操作。默认情况下,当在 Kubernetes 中删除一个对象时,与之相关的依赖对象也会被删除,这称为级联删除。然而,您可以根据需要配置此行为,以启用或禁用级联删除。
「配置已完成的作业的清理」:指的是配置 Kubernetes 如何处理已完成作业的清理操作。Kubernetes 中的作业负责运行批处理任务或任务。一旦作业完成执行,它将作为已完成的对象保留在集群中。然而,您可以配置 Kubernetes 根据某些条件(如完成时间或成功完成的数量)自动清理这些已完成的作业。这有助于管理资源和保持集群整洁。
官网文档