1.  ephemeral-storage介绍

Kubernetes在1.8的版本中引入了一种类似于CPU,RAM的新的资源模式:ephemeral-storage属性(直译为临时存储),并且在1.10的版本kubelet默认启用了这个特性。

ephemeral-storage实现了对Pod应用存储资源的管理,可以有效的降低Pod应用失控消耗完 node磁盘空间的风险。官网中对该属性的描述如下:

https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/):

从上述官网介绍,总结如下:

  1. 临时存储:临时的含义是指容器内的数据未做持久化处理,生命周期和容器一致。
  2. 作用对象:容器日志(/var/log)、EmptyDir类型的volume数据(/var/lib/kubelet)、镜像层和容器可写层(/var/lib/docker)。由此可见,基本覆盖了Pod各个方面的磁盘消耗。
  3. 管理的文件系统:ephemeral-storage对kubelet的根目录(默认是/var/lib/kubelet)所在的节点分区(文件系统)进行管理,即如果把/var/lib/docker独立分区,ephemeral-storage将不对/var/lib/docker目录进行管理。
  4. Pod调度流程:节点上的kubelet启动的时候,kubelet会统计当前节点的kubelet分区的可分配的磁盘资源,或者你可以覆盖节点上kubelet的配置来自定义可分配的资源。在创建Pod时会根据存储需求调度到满足存储的节点,在Pod使用超过限制的存储时会对其做驱逐的处理来保证不会耗尽节点上的磁盘空间。

2. ephemeral-storage功能验证

2.1   环境准备

  • 虚拟机配置

1)    规格:16 vCpu + 80 GB RAM + 1000 GB 磁盘

2)    分区:/var/lib/docker、/var/lib/kubelet/和/var/log全在同一个系统分区上

  • 测试容器镜像

1)  Dockerfile

FROM ubuntu:16.04
ADD start.sh /home/
RUN mkdir -p /lq/log/
ENTRYPOINT /home/start.sh

2)  Start.sh

#!/bin/bash
while true
do
dateString=`date`
echo "$dateString==================================">> /lq/log/test.log
done
  • 集群环境

1)  Kuberneters版本:1.15.6

2)  Docker版本:18.06

2.2   容器可写层大小

  • 容器的部署文件

说明:

1)    容器的启动脚本start.sh会持续的向容器内路径/lq/log下写test.log日志

2)    该日志并未挂载出来,故日志文件在宿主机的容器可写层目录下

3)    该容器申请10Mi的磁盘空间,上限为20Mi

  • 创建该Pod

使用kubectl apply -f xxxx.yaml,观察可写层日志大小情况以及Pod运行情况

很快可写层的日志就达到了16Mi

  • 继续观察Pod

Pod驱逐了(容器被杀掉,容器内数据全部丢失)

从上述Event事件可以看到,Pod可用磁盘空间被限制住了

2.3   EmptyDir日志

  • 部署文件

说明:

1)    容器的启动脚本start.sh会持续的向容器内路径/lq/log下写test.log日志

2)    该日志通过EmptyDir挂载出来,故日志文件在宿主机的/var/lib/kubelet目录下

3)    该容器申请10Mi的磁盘空间,上限为100Mi,emptyDir路径上限为40Mi

  • 创建该Pod

使用kubectl apply -f  xxxxxxxx.yaml

  • 查询日志路径以及Pod运行情况

可以看到日志已经到了32Mi,目前Pod运行正常

  • 继续等待,观察Pod情况

Pod被驱逐了(容器杀死,全部数据丢失)

  • 查看Pod事件

可见该日志磁盘空间被限制了

2.4   /var/log目录日志

一般Pod的启动日志(k8s上的控制台日志)会记录到宿主机的/var/log目录下,并且根据前面介绍得知ephemeral-storage会对该目录下的容器日志磁盘空间大小进行管理,但是由于我使用的测试镜像并无启动日志,故通过hostPath挂载的方式挂载到该路径下,看看我们显示指定挂载路径的时候,ephemeral-storage还能否生效。

  • 部署文件

  • 创建该Pod

  • 观察Pod运行情况

可以看到,自己显示挂载的路径并做不到磁盘空间限制。

  • 换一种思路

由于无启动日志,故想书写脚本向容器的启动日志疯狂输出日志,观测Pod运行情况

1)  修改start.sh

2)  修改部署文件

3)  创建该Pod

Docker logs查看,容器在疯狂的输出日志

4)  持续一段时间,观察Pod运行状态

Pod驱逐了

2.5   其他情况说明

  1. /var/lib/docker和/var/lib/docker分区文件系统不一致。未做截图,但是已经实际验证:/var/lib/docker的分区和kubelet分区不一致的时候,ephemeral-storage对/var/lib/docker目录磁盘空间大小不做管控

3.  验证结论

  1. 分区要一致,否则ephemeral-storage管理不到
  2. ephemeral-storage管理的是容器相关的目录路径下的磁盘大小,自己显式挂载的定制化路径无法控制磁盘空间

4.  参考文档

  1. https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
  2. https://blog.csdn.net/sdmei/article/details/101017405(总结的非常好)

K8S-磁盘配额管理-整理的更多相关文章

  1. linux磁盘管理系列一:磁盘配额管理

    磁盘管理系列 linux磁盘管理系列一:磁盘配额管理   http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_linux_040_quota.html l ...

  2. quota - linux磁盘配额管理

    磁盘管理系列 linux磁盘管理系列一:磁盘配额管理   http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_linux_040_quota.html l ...

  3. Linux磁盘管理系列 — 磁盘配额管理

    一.磁盘管理的概念 Linux系统是多用户任务操作系统,在使用系统时,会出现多用户共同使用一个磁盘的情况,如果其中少数几个用户占用了大量的磁盘空间,势必压缩其他用户的磁盘的空间和使用权限.因此,系统管 ...

  4. 磁盘配额管理disk quotas

    条件: a.确保系统内核支持,Linux一般都支持 b.确保分区格式支持,ext2都只持! c.安装有quota软件,centos默认都有! (1)检查内核是否打开磁盘配额支持 [root@cento ...

  5. Linux 磁盘配额(XFS & EXT4)

    若是在Linux中搭建了FTP服务器,为了安全性,就要考虑磁盘配额,以防服务器磁盘空间被恶意占满. 磁盘配额概述 1.作用范围:只在指定的分区有效. 2.限制对象:主要针对用户.组进行限制,对组账号限 ...

  6. 解析Linux中LVM与磁盘配额

    LVM 逻辑卷管理 LVM 概述 LVM 是 Linux 操作系统中对磁盘分区进行管理的一种逻辑机制,它是建立在硬盘和分区之上.文件系统之下的一个逻辑层,在建立文件系统时屏蔽了下层的磁盘分区布局,因此 ...

  7. LVM磁盘配额

    目录 一.LVM概述 1.1.逻辑卷管理 1.2.LVM机制的基本概念 二.LVM管理命令 三.磁盘配额概述 3.1.实现磁盘配额的条件 3.2.Linux磁盘限额的特点 3.3.常用命令及选项 3. ...

  8. 整理全网最全K8S集群管理工具、平台

    整理常见的整理全网最全K8S集群管理工具.平台解决方案. 1 Rancher Rancher中文官网:https://docs.rancher.cn/ 2 KubeSphere 官网:https:// ...

  9. Win2003 Server磁盘配额揭密之启用篇

    Win2003 Server磁盘配额揭密之启用篇 [ 作者:茶乡浪子    转贴自:it168.com    点击数:4973    更新时间:2005-1-17  ]   本文要向大家介绍如何利用W ...

随机推荐

  1. Mac配置Jenkins(构建Allure模板报告)

    通过jenkins.pkg程序安装 1.修改环境配置 编辑 vi ~/.bash_profile,添加命令别名: alias jk_start="sudo launchctl load /L ...

  2. [ES6系列-06]展开操作符 Spread Operator 就像解压到这里

    [原创]码路工人 Coder-Power 大家好,这里是码路工人有力量,我是码路工人,你们是力量. github-pages 博客园cnblogs 在前面的文章中,介绍了...在获取剩余参数中的作用. ...

  3. 谈谈C#多线程开发:并行、并发与异步编程

    阅读导航 一.使用Task 二.并行编程 三.线程同步 四.异步编程模型 五.多线程数据安全 六.异常处理 概述 现代程序开发过程中不可避免会使用到多线程相关的技术,之所以要使用多线程,主要原因或目的 ...

  4. 离散数学 II(最全面的知识点汇总)

    离散数学 II(知识点汇总) 目录 离散数学 II(知识点汇总) 代数系统 代数系统定义 例子 二元运算定义 运算及其性质 二元运算的性质 封闭性 可交换性 可结合性 可分配性 吸收律 等幂性 消去律 ...

  5. 50个SQL语句(MySQL版) 问题十一

    --------------------------表结构-------------------------- student(StuId,StuName,StuAge,StuSex) 学生表 tea ...

  6. 用TensorFlow搭建一个万能的神经网络框架(持续更新)

    我一直觉得TensorFlow的深度神经网络代码非常困难且繁琐,对TensorFlow搭建模型也十分困惑,所以我近期阅读了大量的神经网络代码,终于找到了搭建神经网络的规律,各位要是觉得我的文章对你有帮 ...

  7. Chisel3-Intellij IDEA中使用sbt构建Chisel项目

    https://mp.weixin.qq.com/s/gssjiiPW6zUzKwCFZdNduw   1. 使用Intellij IDEA创建Scala项目   Chisel项目,就是构建Scala ...

  8. DOM对HTML元素的增删改操作和事件概念和事件监听

    DOM创建节点的方法: document.createElement(Tag),Tag必须是合法的HTML元素 DOM复制节点的方法: 节点cloneNode(boolean deep),当deep为 ...

  9. Java实现 蓝桥杯VIP 算法提高 项链

    算法提高 项链 时间限制:1.0s 内存限制:512.0MB 问题描述 由 n(1≤n≤100) 个珠子组成的一个项链,珠子有红.蓝.白三种颜色,各种颜色的珠子的安排顺序由键盘输入的字符串任意给定.蓝 ...

  10. Android如何使用Notification进行通知

    有两张图片素材会放在末尾 activity代码,和XML布局 package com.example.myapplication; import androidx.appcompat.app.AppC ...