K8S-磁盘配额管理-整理

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/):

 K8S-磁盘配额管理-整理_第1张图片

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

  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全在同一个系统分区上

K8S-磁盘配额管理-整理_第2张图片

  • 测试容器镜像

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   容器可写层大小

  • 容器的部署文件

 K8S-磁盘配额管理-整理_第3张图片

说明:

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日志

  • 部署文件

 K8S-磁盘配额管理-整理_第4张图片

说明:

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

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

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

  • 创建该Pod

使用kubectl apply -f  xxxxxxxx.yaml

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

 

 K8S-磁盘配额管理-整理_第5张图片

 

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

  • 继续等待,观察Pod情况

 

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

  • 查看Pod事件

 K8S-磁盘配额管理-整理_第6张图片

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

2.4   /var/log目录日志

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

  • 部署文件

 K8S-磁盘配额管理-整理_第7张图片

  • 创建该Pod

 K8S-磁盘配额管理-整理_第8张图片

  • 观察Pod运行情况

 

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

  • 换一种思路

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

1)  修改start.sh

 

2)  修改部署文件

 K8S-磁盘配额管理-整理_第9张图片

3)  创建该Pod

 

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

 K8S-磁盘配额管理-整理_第10张图片

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-磁盘配额管理-整理)