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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 彻底解决K8S节点本地存储被撑爆的问题2

日志

K8S推荐的日志输出方式是将程序日志直接输出到标准输出和标准错误,此时容器运行时会捕捉这些数据,并把它们写到本地存储,然后再由节点上的日志代理或者Pod中的边车日志代理转运到独立的日志处理中心,以供后续分析使用。

这些日志保存在节点本地的  /var/log/container 目录下,我们可以实际创建一个Pod来确认下:

apiVersion: v1
kind: Pod
metadata:
  name: pod-log-stdout
spec:
  containers:
  - name: count
    image: busybox:latest
    args: [/bin/sh, -c,
            'i=0; while true; do echo "$i: $(date) a log entry."; i=$((i+1)); usleep 1000; done']

这个Pod每隔1毫秒会写1条数据到标准输出。要找到容器运行时根据标准输出创建的日志文件,首先要找到这个Pod部署的节点,然后登录到这个节点,就能找到对应的文件了。

1689151786190.png

如果程序输出的日志很多,占满磁盘空间就是早晚的事。

emptyDir

emptyDir 是一种基于节点本地存储的Volume类型,它通过在本地存储创建一个空目录来实际承载Volume。使用这种存储卷可以在Pod的多个容器之间共享数据,比如一个容器造数据,一个容器消费数据。

看下面这个例子:

apiVersion: v1
kind: Pod
metadata:
  name: pod-vol-empty-dir
spec:
  containers:
  - name: count
    image: busybox:latest
    args: [/bin/sh, -c, 'echo "k8s" > /cache/k8s.txt;sleep 1800']
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}

在 spec.volumes[] 中只需要添加一个名为 emptyDir 的字段,它的配置都可以使用默认值,然后这个卷会被挂载到容器的 /cache 路径。

容器的启动参数是一个shell命令,它会在容器的 cache 目录下创建1个名为 k8s.txt 的文件。容器创建后稍等一会,使用下面的命令获取这个文件的内容:

$ kubectl exec pod-vol-empty-dir -- cat /cache/k8s.txt
k8s

可以看到,文件内容正是容器启动命令中写入的 k8s 字符。

K8S会在当前的Node自动创建一个目录来实际承载这个卷,目录的位置在Node的  /var/lib/kubelet/pods 路径下。要查看这个目录中的内容,需要先找到Pod Id和对应的Node,然后登录到这个Node,就能找到这个目录了。minikube中的查找方法如下图所示:

1689151852248.png

注意用颜色框圈出来的内容,不同的Pod对应的数据不同。查找Pod Id的命令:

kubectl get pods -o custom-columns=PodName:.metadata.name,PodUID:.metadata.uid,PodNode:.spec.nodeName

如果不对 emptyDir Volume 做一些限制,也是有很大的风险会使用过多的磁盘空间。


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