临时存储简介
Node节点
一般还能够具备本地的临时性存储,由本地挂载的可写入设备
或者 RAM
来提供支持。临时(Ephemeral)
意味着对所存储的数据不提供长期可用性的保证。html
Pods 一般能够使用临时性本地存储来实现缓冲区、保存日志等功能。kubelet 能够为使用本地临时存储的 Pods 提供这种存储空间,容许后者使用 emptyDir
类型的卷将其挂载到容器中。node
kubelet 也使用此类存储来保存节点层面的容器日志
, 容器镜像文件
、以及运行中容器的可写入层
。web
临时存储有哪些
-
本地临时存储(local ephemeral storage) -
emptyDir
本地临时存储(local ephemeral storage)
:Kubernetes在1.8的版本中引入了一种相似于CPU,内存的新的资源模式:ephemeral-storage,而且在1.10版本kubelet中默认打开这个特性。ephemeral-storage是为管理和调度Kubernetes中运行的应用短暂存储。面试
emptyDir
:emptyDir 类型Volume在Pod分配到Node上时被建立,Kubernetes会在Node节点上自动分配一个目录,所以无需指定宿主机Node上对应的目录文件。这个目录初始内容为空,当Pod从Node上移除时,emptyDir中的数据会被永久删除。docker
注释:容器的
crashing
事件并不会致使emptyDir
中的数据被删除。api
临时存储默认存储在哪一个位置?
在每一个 Kubernetes Node节点
上,kubelet 默认根目录是 /var/lib/kubelet
和 日志目录 /var/log
保存在节点的系统分区上,这个分区同时也会被Pod的 EmptyDir
类型的 volume
、容器日志
、镜像层
、容器的可写层所占用
。ephemeral-storage
即是对系统分区进行管理。微信
临时存储须要限制吗?
答案是 须要限制
,从上文了解到,临时存储默认根目录是在 /var/lib/kubelet
中,/var
通常状况都是在系统根分区中,而且根分区磁盘通常不会很大(阿里云ECS系统盘默认为 40G),这就必须限制,为系统预留足够的磁盘空间来支持正常运行。上文也说到,临时存储也能够使用 RAM,那就更应该限制,内存是一种很是有限的资源。app
Node节点设置临时存储使用大小
Node节点上的 kubelet
组件启动时,kubelet会统计当前节点默认 /var/lib/kubelet
所在的分区可分配的磁盘资源,或者你能够覆盖节点上kubelet的配置来自定义可分配的资源。建立Pod时会根据存储需求调度到知足存储的节点,Pod使用超过限制的存储时会对其作驱逐
处理来保证不会耗尽节点上的磁盘空间。运维
注意:若是运行时指定了别的独立的分区,好比修改了docker的镜像层和容器可写层的存储位置(默认是/var/lib/docker)所在的分区,将再也不将其计入
ephemeral-storage
的消耗。编辑器
kubelet 以下配置,限制Node节点上临时存储能使用多大磁盘空间
# Node 资源保留
nodefs.available: 10% # 给 /var/lib/kubelet 所在分区保留 10% 磁盘空间
nodefs.inodesFree: 5% # 给 /var/lib/kubelet 所在分区保留 5% inodes
临时存储限制使用举例
限制磁盘本地临时存储
apiVersion: v1
kind: Pod
metadata:
name: test-storage
labels:
app: test-storage
spec:
containers:
- name: busybox
image: busybox
command: ["sh", "-c", "while true; do dd if=/dev/zero of=$(date '+%s').out count=1 bs=30MB; sleep 1; done"] # 使用dd命令持续往容器写数据
resources:
limits:
ephemeral-storage: 300Mi #定义存储的限制为300Mi
requests:
ephemeral-storage: 300Mi
容器使用磁盘超过 300Mi,被 kubelet 驱逐。具体请见下图

限制内存临时存储
emptyDir
也是一种临时存储,所以也须要限制使用。
在Pod级别检查临时存储使用量时,也会将 emptyDir
的使用量计算在内,所以若是对 emptyDir 使用过量后,也会致使该Pod被 kubelet Evict
。
另外,emptyDir自己也能够设置容量上限。指定 emptyDir 使用内存做为存储介质,这样用户能够得到极好的读写性能,可是因为内存比较珍贵,只提供了 128Mi
的空间,当用户在 /cache-data
目录下使用超过64Mi后,该Pod会被 kubelet 驱逐。
volumeMounts:
- mountPath: /cache-data
name: cache-data-volume
volumes:
- emptyDir:
medium: Memory
sizeLimit: 128Mi
name: cache-data-volume
参考连接
-
https://kubernetes.io/zh/docs/concepts/configuration/manage-resources-containers/ -
https://developer.aliyun.com/article/594066 -
https://ieevee.com/tech/2019/05/23/ephemeral-storage.html
热门文章推荐
-
分享阿里巴巴云原生技术与实践 - KubeCon 2020 经典演讲集锦 -
Kubernetes v1.19.0 正式发布! -
IT运维面试问题总结-简述Etcd、Kubernetes、Lvs、HAProxy等 -
Kubernetes 升级填坑指南(一) -
Kubernetes v1.15.3 升级到 v1.18.5 心得 -
根据 PID 获取 K8S Pod名称 - 反之 POD名称 获取 PID
最后
-
欢迎您加我微信【 ypxiaozhan01】,拉您进技术群,一块儿交流学习... -
欢迎您关注【 YP小站】,学习互联网最流行的技术,作个专业的技术人...

本文分享自微信公众号 - YP小站(ypxiaozhan)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。