彻底解决K8S节点本地存储被撑爆的问题3

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
日志服务 SLS,月写入数据量 50GB 1个月
简介: 彻底解决K8S节点本地存储被撑爆的问题3

存储的限制方法

通过上文的介绍,我们可以看到,除了容器镜像是系统机制控制的,其它的内容都跟应用程序有关。

应用程序完全可以控制自己使用的存储空间,比如少写点日志,将数据保存到远程存储,及时删除使用完毕的临时数据,使用LRU等算法控制存储空间的使用量,等等。不过完全依赖开发者的自觉也不是一件很可靠的事,万一有BUG呢?所以K8S也提供了一些机制来限制容器可以使用的存储空间。

K8S的GC

K8S有一套自己的GC控制逻辑,它可以清除不再使用的镜像和容器。这里我们重点看下对镜像的清理。

这个清理工作是 kubelet 执行的,它有三个参数来控制如何执行清理:

  • imageMinimumGCAge 未使用镜像进行垃圾回收时,其存在的时间要大于这个阈值,默认是2分钟。
  • imageGCHighThresholdPercent 镜像占用的磁盘空间比例超过这个阈值时,启动垃圾回收。默认85。
  • ImageGCLowThresholdPercent 镜像占用的磁盘空间比例低于这个阈值时,停止垃圾回收。默认80。

可以根据自己的镜像大小和数量的水平来更改这几个阈值。

日志总量限制

K8S对写入标准输出的日志有一个轮转机制,默认情况下每个容器的日志文件最多可以有5个,每个文件最大允许10Mi,如此每个容器最多保留最新的50Mi日志,再加上Node也可以对Pod数量进行限制,日志使用的本地存储空间就变得可控了。这个控制也是 kubelet 来执行的,有两个参数:

  • containerLogMaxSize 单个日志文件的最大尺寸,默认为10Mi。
  • containerLogMaxFiles 每个容器的日志文件上限,默认为5。

以上文的 pod-log-stdout 这个Pod为例,它的日志输出量很多就会超过10Mi,我们可以实际验证下。

不过如果没有意外,意外将要发生了,K8S的限制不起作用。这是因为我们使用的容器运行时是docker,docker有自己的日志处理方式,这套机制可能过于封闭,K8S无法适配或者不愿意适配。可以更改docker deamon的配置来解决这个问题,在K8S Node中编辑这个文件  /etc/docker/daemon.json (如果没有则新建),增加关于日志的配置:

{
    "log-opts": {
        "max-size": "10m",
        "max-file": "5"
    }
}

然后重启Node上的docker:systemctl restart docker。注意还需要重新创建这个Pod,因为这个配置只对新的容器生效。

在docker运行时下,容器日志实际上位于 /var/lib/docker/containers 中,先找到容器Id,然后就可以观察到这些日志的变化了:

1689151958436.png


1689151958436.png

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
存储 Kubernetes Docker
Kubernetes节点资源耗尽状态的处理
Kubernetes节点资源耗尽状态的处理
|
2月前
|
存储 Kubernetes 调度
在K8S中,⼀个pod的不同container能够分开被调动到不同的节点上吗?
在K8S中,⼀个pod的不同container能够分开被调动到不同的节点上吗?
|
2月前
|
Kubernetes 调度 Perl
在K8S中,Pod多副本配置了硬亲和性,会调度到同⼀个节点上吗?
在K8S中,Pod多副本配置了硬亲和性,会调度到同⼀个节点上吗?
|
2月前
|
Kubernetes 负载均衡 调度
在K8S中,K8S外部节点访问Pod有哪些方式?
在K8S中,K8S外部节点访问Pod有哪些方式?
|
2月前
|
资源调度 Kubernetes 调度
玩转Kubernetes集群:掌握节点和Pod自动扩缩容,让你的系统更智能、更高效!
【8月更文挑战第22天】Kubernetes的核心功能之一是自动扩缩容,确保系统稳定与高可用。节点自动扩缩容由调度器和控制器管理器协作完成,依据资源紧张程度动态调整。主要采用HPA、VPA及Cluster Autoscaler实现。Pod自动扩缩容通常通过HPA控制器按需调整副本数量。例如,设置HPA控制器监视特定部署的CPU使用率,在80%阈值上下自动增减副本数。合理利用这些工具可显著提升系统性能。
51 2
|
2月前
|
边缘计算 人工智能 Kubernetes
边缘计算问题之理解 Kubernetes 节点资源的四层分配结构如何解决
边缘计算问题之理解 Kubernetes 节点资源的四层分配结构如何解决
14 1
|
2月前
|
Kubernetes 固态存储 调度
在K8S中,如何在指定节点上部署Pod呢?
在K8S中,如何在指定节点上部署Pod呢?
|
2月前
|
存储 Kubernetes 监控
在K8S中,worke节点如何加入K8S高可用集群?
在K8S中,worke节点如何加入K8S高可用集群?
|
2月前
|
Kubernetes 调度 容器
在K8S中,"节点亲和性"和"节点选择器"的区别在哪里?
在K8S中,"节点亲和性"和"节点选择器"的区别在哪里?
|
2月前
|
Kubernetes Unix Linux
k8s将节点容器运行时从Docker迁移到Containerd
k8s将节点容器运行时从Docker迁移到Containerd