K8S容器空间不足问题分析和解决

这篇具有很好参考价值的文章主要介绍了K8S容器空间不足问题分析和解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

K8S容器空间不足问题分析和解决,K8s,运维,kubernetes,容器,云原生

如上图,今天测试环境的K8S平台出现了一个问题,其中的一个容器报错:Free disk space below threshold. Available: 3223552 bytes (threshold: 10485760B),意思服务器硬盘空间不够了。这个问题怎么产生的,又怎么解决的呢?

一、问题分析

这个容器是部署在k8s集群的一个工作节点,该工作节点的磁盘使用率已经达到了99%,但是Kubernetes的垃圾回收机制似乎没有生效,可能有以下几个原因:

1、镜像垃圾回收阈值设置过高
  • 默认情况下,--image-gc-high-threshold的值为85,表示只有当磁盘使用率达到85%时才会触发镜像垃圾回收。
  • 如果你的节点磁盘使用率在达到85%之前就已经接近满载,那么垃圾回收机制可能无法及时释放足够的空间。

2、死亡容器和未使用镜像占用空间较小

  • Kubernetes的垃圾回收机制主要针对已停止的容器(dead containers)和未使用的镜像。
  • 如果你的节点上运行的大部分容器都是活动的,并且镜像都在被使用,那么垃圾回收可能无法释放太多空间。

3、其他非容器相关的文件占用了大量磁盘空间

  • Kubernetes的垃圾回收只会清理停止的容器和未使用的镜像,但不会删除其他文件。
  • 如果你的节点上有大量非容器相关的文件(如日志文件、数据文件等)占用了磁盘空间,垃圾回收机制无法处理这些文件。

4、垃圾回收机制的执行频率不足

  • Kubernetes的垃圾回收机制是周期性运行的,默认情况下每分钟运行一次。
  • 如果你的节点磁盘使用率增长非常快,垃圾回收的执行频率可能跟不上磁盘空间的消耗速度。

二、解决问题

为了解决这个问题,可以尝试以下几种方法:

1、手动清理

  • 你可以使用docker container prune命令删除所有停止的容器。
  • 使用docker image prune命令删除所有悬空(dangling)镜像,即没有被任何容器引用的镜像。

2、调整参数

将--image-gc-high-threshold--image-gc-low-threshold两个参数的值进行调整,使其更接近实际的磁盘使用情况。例如,你可以将--image-gc-high-threshold设置为75,将--image-gc-low-threshold设置为70,以便在磁盘使用率较高时更积极地进行垃圾回收。

3、定期清理

  识别并清理节点上占用大量磁盘空间的非容器相关文件,如日志文件、临时文件等。

4、扩容

考虑增加节点的磁盘容量或向集群中添加更多节点,以分散工作负载和存储压力。

5、优化应用

如果可能,尝试优化应用程序和工作负载,减少不必要的磁盘空间使用。

本次问题处理中,我们先用手动删除所有停止的容器和镜像,然后调整了--image-gc-high-threshold和--image-gc-low-threshold参数的值,改为75,最后配置了一个监控任务,磁盘空间超过80%就提示告警。

请注意,在对生产环境进行任何更改之前,务必仔细评估可能的影响并制定合适的策略。根据你的具体情况和需求,选择最适合的方法来解决节点磁盘空间不足的问题。

三、相关知识

除了上面使用的方法,我们要在Kubernetes中自动清理过期的容器和镜像,还可可以利用Kubernetes的内置机制和一些第三方工具。下面是几种方法:

1、配置容器的 restartPolicy 和 terminationGracePeriodSeconds

  • 对于一次性任务或短期任务,可以将Pod的 restartPolicy 设置为 Never 或 OnFailure,确保容器退出后不会自动重启。
  • 设置合适的 terminationGracePeriodSeconds 值,控制容器优雅终止的宽限期,超过该时间后Kubernetes会强制删除容器。

2、使用 TTL Controller 自动清理已完成的Job

  • Kubernetes的 TTL Controller 可以自动清理已完成的Job及其关联的Pod。
  • 在Job的spec中设置 .spec.ttlSecondsAfterFinished 字段,指定Job完成后的TTL时间,超过该时间Job和Pod会被自动删除。

3、利用第三方工具如 kube-janitor 或 descheduler

  • kube-janitor 是一个自动清理Kubernetes资源的工具,可以根据配置的规则定期清理过期的资源,包括Pod、Job、ConfigMap等。
  • descheduler 可以根据策略驱逐Pod,释放节点资源,可以用于清理长时间运行的Pod。

4、使用自定义脚本或控制器

  • 可以编写自定义脚本或控制器,定期查询和清理过期的容器和镜像。
  • 可以利用Kubernetes API或客户端库如 client-go 来实现自定义逻辑。

以上是一些常见的方法,可以根据具体需求选择合适的方案。同时,也要注意配置适当的资源限制和请求,避免不必要的资源浪费。定期监控集群的资源使用情况,及时调整和优化。文章来源地址https://www.toymoban.com/news/detail-847389.html

到了这里,关于K8S容器空间不足问题分析和解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【k8s问题定位】k8s中的pod不停的重启,定位问题原因与解决方法

    现象: running的pod,短时间内重启次数太多   定位问题方法: 查看pod日志 本次使用以下命令,解决了问题 问题原因: OOM,pod被kill掉,重启了( 内存不够用 )   查看该服务的deployment.yaml文件 发现我们deployment.yaml对服务的内存使用,做了限制 解决方法: 将limit的memory数值提高,然后

    2024年02月09日
    浏览(46)
  • 解决K8s证书过期问题

    K8s出现的问题:证书过期 参考K8s官方文档 查看运行日志: 关键错误:part of the existing bootstrap client certificate in /etc/kubernetes/kubelet.conf is expired: 2022-10-12 06:54:16 +0000 UTC 查看证书期限: 解决方式: 对过期证书进行备份,并删除旧的证书 重新生成证书 备份旧的配置文件 重新生成

    2024年02月16日
    浏览(47)
  • K8s出现问题时,如何排查解决!

    K8s问题的排查 1、POD启动异常、部分节点无法启动pod 容器里管理应用 pod出现异常的原因: 2. 审视集群状态 审视集群状态 K8S的集群状态是排查故障的关键起点。使用kubectl get nodes命令来检查节点状态。如果有节点未能就绪或出现异常状态,可能会对应用程序造成故障。确保基

    2024年02月02日
    浏览(43)
  • 如何分析K8S中的OOMKilled问题(Exit Code 137)

    当 Kubernetes 集群中的容器超过其内存限制时,Kubernetes 系统可能会终止该容器并显示“OOMKilled”错误,这表明该进程由于内存不足而被终止。此错误的退出代码是 137。 如果遇到错误,Pod 的状态将显示“OOMKilled”,您可以使用以下命令查看该错误: Out-Of-Memory Killer (OOMKiller) 是

    2024年02月03日
    浏览(37)
  • K8S集群中Node节点资源不足导致Pod无法运行的故障排查思路

    故障一:Pod数量太多超出物理节点的限制 每一台Node节点中默认限制最多运行110个Pod资源,当一个应用程序有成百上千的Pod资源时,如果不扩容Node节点或者修改最大Pod数量限制,那么就会导致部分Pod资源无法正常运行,因为节点已经没有资源可以被调度了。 解决思路就是扩容

    2024年02月02日
    浏览(36)
  • 已解决: Error: ErrImagePull (K8s) 问题

    🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页 : 🐅🐾猫头虎的博客🎐 《面试题大全专栏》 🦕 文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺 《IDEA开发秘籍专栏》 🐾 学会IDEA常用操作,工作效率翻倍~💐 《100天精通Golang(基础入门篇)》 🐅

    2024年02月21日
    浏览(31)
  • k8s从节点加入主节点[preflight] Running pre-flight checks卡住(已解决)k8s常用问题解决

    部署k8s时,主节点部署成功了,从节点1执行kubeadm join也成功了,从节点2执行kubeadm join一直卡在[preflight] Running pre-flight checks不动! 网上查的资料,不管是时间同步,还是重新生成token都尝试了,结果还是不行。 kubeadm token list 查看token也并没有 过期。 kubeadm token create --ttl 0 -

    2024年02月09日
    浏览(28)
  • 强制删除k8s命名空间

    背景 删除ns时,有时候会一直卡在terminating的状态,无法删除,此时会引发一些问题,所以试了两种方法,记录下来 假定ns名称为test 方法一 通过强制删除,并且设置优雅删除时间为0(默认为30s) $ kubectl delete ns test --force --grace-period=0 方法一之后还是无法删除,请使用方法二

    2024年02月04日
    浏览(28)
  • K8S:K8S自动化运维容器Docker集群

    (1)K8S全程为Kubernetes,由于K到S直接有8个字母简称为K8S。 (2)版本:目前一般是1.18~1.2.0,后续可能会到1.24-1.26,1.24版本后丢弃了docker(如需要使用需要第三方插件配合),目前最新版本是1.27 (3)官网:https://kubernetes.io GitHub:GitHub - kubernetes/kubernetes: Production-Grade Container S

    2024年02月10日
    浏览(58)
  • 容器与K8s

    容器 vs 虚拟机 三个概念:         Docker镜像除了运行程序也打包了程序运行环境。         存放镜像的仓库,需要login之后拉去响应的镜像。         基于Docker镜像创建的linux容器,本质是宿主机上的一个进程,与其他资源隔离。 图2  Docker容器典型使用流程 首先开发者在

    2024年01月19日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包