首页 > 其他分享 >深入讲解Kubernetes架构-垃圾收集

深入讲解Kubernetes架构-垃圾收集

时间:2023-07-24 21:04:27浏览次数:42  
标签:容器 属主 架构 Kubernetes 删除 对象 垃圾 讲解


垃圾收集(Garbage Collection)是 Kubernetes 用于清理集群资源的各种机制的统称。 垃圾收集允许系统清理如下资源:

属主与依赖

Kubernetes 中很多对象通过属主引用 链接到彼此。属主引用(Owner Reference)可以告诉控制面哪些对象依赖于其他对象。 Kubernetes 使用属主引用来为控制面以及其他 API 客户端在删除某对象时提供一个清理关联资源的机会。 在大多数场合,Kubernetes 都是自动管理属主引用的。

属主关系与某些资源所使用的标签和选择算符不同。 例如,考虑一个创建 EndpointSlice 对象的 Service。 Service 使用标签来允许控制面确定哪些 EndpointSlice 对象被该 Service 使用。 除了标签,每个被 Service 托管的 EndpointSlice

说明:

根据设计,系统不允许出现跨名字空间的属主引用。名字空间作用域的依赖对象可以指定集群作用域或者名字空间作用域的属主。 名字空间作用域的属主必须存在于依赖对象所在的同一名字空间。 如果属主位于不同名字空间,则属主引用被视为不存在,而当检查发现所有属主都已不存在时,依赖对象会被删除。

集群作用域的依赖对象只能指定集群作用域的属主。 在 1.20 及更高版本中,如果一个集群作用域的依赖对象指定了某个名字空间作用域的类别作为其属主, 则该对象被视为拥有一个无法解析的属主引用,因而无法被垃圾收集处理。

在 1.20 及更高版本中,如果垃圾收集器检测到非法的跨名字空间 ownerReference, 或者某集群作用域的依赖对象的 ownerReference 引用某名字空间作用域的类别, 系统会生成一个警告事件,其原因为 OwnerRefInvalidNamespace,involvedObject 设置为非法的依赖对象。你可以通过运行 kubectl get events -A --field-selector=reason=OwnerRefInvalidNamespace

级联删除

Kubernetes 会检查并删除那些不再拥有属主引用的对象,例如在你删除了 ReplicaSet 之后留下来的 Pod。当你删除某个对象时,你可以控制 Kubernetes 是否去自动删除该对象的依赖对象, 这个过程称为 级联删除(Cascading Deletion)。 级联删除有两种类型,分别如下:

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

你也可以使用 Kubernetes Finalizers 来控制垃圾收集机制如何以及何时删除包含属主引用的资源。

前台级联删除

在前台级联删除中,正在被你删除的属主对象首先进入 deletion in progress

  • Kubernetes API 服务器将某对象的 metadata.deletionTimestamp
  • Kubernetes API 服务器也会将 metadata.finalizers 字段设置为 foregroundDeletion。
  • 在删除过程完成之前,通过 Kubernetes API 仍然可以看到该对象。

当属主对象进入删除过程中状态后,控制器删除其依赖对象。控制器在删除完所有依赖对象之后, 删除属主对象。这时,通过 Kubernetes API 就无法再看到该对象。

在前台级联删除过程中,唯一可能阻止属主对象被删除的是那些带有 ownerReference.blockOwnerDeletion=true 字段的依赖对象。 参阅使用前台级联删除 以了解进一步的细节。

后台级联删除

在后台级联删除过程中,Kubernetes 服务器立即删除属主对象,控制器在后台清理所有依赖对象。 默认情况下,Kubernetes 使用后台级联删除方案,除非你手动设置了要使用前台删除, 或者选择遗弃依赖对象。

参阅使用后台级联删除 以了解进一步的细节。

被遗弃的依赖对象

当 Kubernetes 删除某个属主对象时,被留下来的依赖对象被称作被遗弃的(Orphaned)对象。 默认情况下,Kubernetes 会删除依赖对象。要了解如何重载这种默认行为,可参阅 删除属主对象和遗弃依赖对象

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

kubelet 会每五分钟对未使用的镜像执行一次垃圾收集, 每分钟对未使用的容器执行一次垃圾收集。 你应该避免使用外部的垃圾收集工具,因为外部工具可能会破坏 kubelet 的行为,移除应该保留的容器。

要配置对未使用容器和镜像的垃圾收集选项,可以使用一个 配置文件,基于 KubeletConfiguration 资源类型来调整与垃圾收集相关的 kubelet 行为。

容器镜像生命周期

Kubernetes 通过其镜像管理器(Image Manager) 来管理所有镜像的生命周期, 该管理器是 kubelet 的一部分,工作时与 cadvisor 协同。 kubelet 在作出垃圾收集决定时会考虑如下磁盘用量约束:

  • HighThresholdPercent
  • LowThresholdPercent

磁盘用量超出所配置的 HighThresholdPercent 值时会触发垃圾收集, 垃圾收集器会基于镜像上次被使用的时间来按顺序删除它们,首先删除的是最近未使用的镜像。 kubelet 会持续删除镜像,直到磁盘用量到达 LowThresholdPercent

容器垃圾收集

kubelet 会基于如下变量对所有未使用的容器执行垃圾收集操作,这些变量都是你可以定义的:

  • MinAge:kubelet 可以垃圾回收某个容器时该容器的最小年龄。设置为 0
  • MaxPerPodContainer:每个 Pod 可以包含的已死亡的容器个数上限。设置为小于 0
  • MaxContainers:集群中可以存在的已死亡的容器个数上限。设置为小于 0

除以上变量之外,kubelet 还会垃圾收集除无标识的以及已删除的容器,通常从最近未使用的容器开始。

当保持每个 Pod 的最大数量的容器(MaxPerPodContainer)会使得全局的已死亡容器个数超出上限 (MaxContainers)时,MaxPerPodContainers 和 MaxContainers 之间可能会出现冲突。 在这种情况下,kubelet 会调整 MaxPerPodContainer 来解决这一冲突。 最坏的情形是将 MaxPerPodContainer 降格为 1,并驱逐最近未使用的容器。 此外,当隶属于某已被删除的 Pod 的容器的年龄超过 MinAge

说明:

kubelet 仅会回收由它所管理的容器。

配置垃圾收集

你可以通过配置特定于管理资源的控制器来调整资源的垃圾收集行为。 下面的页面为你展示如何配置垃圾收集:

标签:容器,属主,架构,Kubernetes,删除,对象,垃圾,讲解
From: https://blog.51cto.com/u_15503184/6839309

相关文章

  • 【高可用系统架构设计】SLA服务可用性4个9是什么意思?如何保证服务的高可用性 HA(High A
    如何保证服务的高可用性HA(HighAvailability)?高可用HA(HighAvailability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。方法论上,高可用是通过冗余+自动故障转移来实现的。我们都知道,单点是系统高可用的大敌,单点往往是系统高可用最大的......
  • 一文搞定Kubernetes,零基础到上手
    文章目录1.Kubernetes简介1.1应用部署方式演变1.2kubernetes简介1.3kubernetes组件1.4kubernetes概念2.kubernetes集群环境搭建2.1kubernetes集群介绍2.2实验准备环境2.3系统初始化2.4部署Kubernetes集群2.5测试kubernetes集群3.资源管理3.1资源管理介绍3.2YAML语言......
  • 可扩展的分布式数据库架构 vs 传统关系数据库
    可扩展的分布式数据库架构本文发表在《程序员》杂志2010年第6期引言数据库的可用性和扩展性一直是数据库厂商和用户最关注的问题。过去我们采用高端的设备,比如使用小型机和大型存储来保证数据库的可用性。而扩展性主要采用向上扩展(Scaleup)的方式,通过增加CPU,内存,磁盘等方式......
  • 豆瓣网技术架构的发展历程
    豆瓣网简介 •2005年3月上线•以分享和发现为核心的社区•读书、电影、音乐、小组、同城、九点•我的豆瓣、友邻一些数据•2.8M注册用户,约1/4活跃用户•千万级非注册用户•20M动态请求/天,峰值500~600/sec•23台普通PC服务器(1U*15/2U*8)•12台提供线上服务•38Gmemcach......
  • k8s架构
    核心组件etcd保存整个集群的状态apiserver提供资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制controllermanager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上kubelet负责......
  • Kubernetes业务服务日志采集原理全方位剖析
    Kubernetes日志采集原理全方位剖析   简介作为容器编排领域的实施标准,Kubernetes(K8s)应用的场景也越来越广。日志作为可观测性建设中的重要一环,可以记录详细的访问请求以及错误信息,非常利于问题的定位。Kubernetes上的应用、Kubernetes组件本身、宿主机等都会产......
  • 直播架构图
    直播架构图解析及代码示例随着直播行业的快速发展,直播架构成为了直播系统的核心组成部分。本文将对直播架构图进行解析,并提供代码示例来帮助读者更好地理解直播架构的实现。直播架构图概述直播架构图是对直播系统中各组件和其相互关系的可视化表示。它展示了直播系统的核心功能......
  • sqlserver:拒绝了对对象 'QualityChxxx' (数据库 'xxx',架构 'dbo')的 SELECT 权限
    选择数据库(xxxx)—>安全性—->架构—->dbo(属性)—>权限—>添加—>浏览–>QualityChxxx  ......
  • android usb 驱动架构
    AndroidUSB驱动架构简介AndroidUSB驱动架构是在Android系统中实现USB设备与应用程序之间通信的一种连接方式。通过USB接口,Android设备可以与外部设备进行数据交互,比如连接手机和电脑进行文件传输。USB驱动层次结构AndroidUSB驱动架构分为以下几个层次:USBStack......
  • 火山引擎DataLeap如何解决SLA治理难题(三): 平台架构与未来展望
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群平台架构总结火山引擎DataLeapSLA平台整体主要分为基础组件、规划式治理服务、响应式治理服务三大块,系统组件架构图如下:规划式治理服务所谓“规划式治理”,即在问题发现前治理,通过主动规划约定SL......