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. [Objective-C] 021 KVC、KVO

    写过C#的都知道C#通过反射读写一个对象的属性特别方便,可以利用字符串的方式去动态控制一个对象.其实在ObjC中,我们可以更高级点,根本不必进行任何操作就可以进行属性的动态读写,这种方式就是Key V ...

  2. [python爬虫]简单爬虫功能

    在我们日常上网浏览网页的时候,经常会看到某个网站中一些好看的图片,它们可能存在在很多页面当中,我们就希望把这些图片保存下载,或者用户用来做桌面壁纸,或者用来做设计的素材. 我们最常规的做法就是通过鼠标 ...

  3. [转]什么是OpenSSH

    定义 SSH是什么? 相关概念 OpenSSH安全吗?究竟安全在哪里呢? Telnet这么好的一个工具为什么还要用户手动开启呢? SSH账户类型 iPhone中修改密码的大致步骤 如何从电脑连接通过S ...

  4. [FlashDevelop] 001.FlashDevelop + LayaFlash环境搭建

    产品简介: 唯一使用Flash直接开发或转换大型HTML5游戏的全套解决方案. 开发工具 FlashDevelop + JDK + flashplayer_18_sa_debug + LayaFlas ...

  5. [C#打包部署教程]001.VS2012 + InstallShield

    攻城狮编写测试完成后接下来我们要做的是打包部署程序. 经过翻阅资料发现,VS2012虽然没有集成打包工具,但它为我们提供了下载的端口,需要我们手动安装一个插件InstallShield.(旁白:网上有 ...

  6. 公司如何通过电脑监控来规范员工行为-iis7服务器管理功能教程

    现在员工办公基本都用电脑,而电脑不仅仅可以用来处理工作,还可以上网.娱乐等.往往很多员工的自制能力比较差,在工作时间和人聊天,浏览购物网站,看新闻,炒股等休闲娱乐上花费大量的时间,导致工作效率降低,影 ...

  7. Rocket - tilelink - Edges

    https://mp.weixin.qq.com/s/UggNsNOeEMP-GhzlLiT-qQ   简单介绍Edges的实现.   ​​   1. TLEdge   包含client和manage ...

  8. JAVASE(十)面向对象:特性之多态性、Object类、代码块、关键字:static、final、父子类执行顺序

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.面向对象的特性之:多态性 多态性的理解:事物的多种形态 1.1 广义上多态性的体现:①方法的重写,重 ...

  9. Java实现 LeetCode 690 员工的重要性(简易递归)

    690. 员工的重要性 给定一个保存员工信息的数据结构,它包含了员工唯一的id,重要度 和 直系下属的id. 比如,员工1是员工2的领导,员工2是员工3的领导.他们相应的重要度为15, 10, 5.那 ...

  10. Java实现蓝桥杯算法提高P0102

    算法提高 P0102 时间限制:1.0s 内存限制:256.0MB 提交此题 用户输入三个字符,每个字符取值范围是0-9,A-F.然后程序会把这三个字符转化为相应的十六进制整数,并分别以十六进制,十进 ...