image.png
docker⽇志分为俩种,⼀种是容器的标准输出⽇志,也就是docker启动后控制台输出的⽇志,另⼀种是容器内的⽂件⽇志,通常是我们项⽬通过卷的形式挂载到宿主机上的。
k8s中卷volume⽀持很多形式,常见的如下
emptyDir
hostPath
nfs
glusterfs
还⽀持很多很多类型,如果挂载⽇志的⽅式volume选择emptyDir,则是直接在pod所在node上存放相关⽇志,只要pod⼀直运⾏在该node
上,emptyDir就会⼀直在。如果pod迁移到别的pod或者node宕机,⽇志都会消失,所以⼀般存储⽇志不会选择该⽅式。
hostPath⽅式是 允许Node上的⽂件系统挂载到pod⾥去,如果pod⾥需要node上的⽂件,可以使⽤该
种⽅式。⽐如pod需要node节点上的docker命令,kubectl命令等。该种⽅式如果pod迁移或者node宕机⽇志也会消失,所以也推荐使⽤该⽅式。
nfs和glusterfs这些⽂件存储系统, 看到的效果是把pod内的⽇志存储到他们⾃⼰的⽂件存储系统内,但本质是pod内的⽇志以emptyDir的⽅式先存储到node节点的某个⽬录上,然后nfs和glusterfs到node的这些⽂件⽬录中copy⽇志到⾃⼰⽂件存储系统中。
说这么多,想要表达的意思就是不管你以哪种⽅式在存储⽇志,k8s的worker节点都存在⽇志爆满的风险。
我们需要注意
kubelet 只⽀持两种⽂件系统分区。
nodefs ⽂件系统,kubelet 将其⽤于卷和守护程序⽇志等。
imagefs ⽂件系统,容器运⾏时⽤于保存镜像和容器可写层。
针对这俩种⽂件系统,k8s有4种相关的驱逐信号
驱逐信号描述
nodefs.available node.stats.fs.available
nodefs.inodesFree node.stats.fs.inodesFree
imagefs.available node.stats.runtime.imagefs.available
imagefs.inodesFree node.stats.runtime.imagefs.inodesFree
也就是说你的驱逐信号中如果包含nodefs相关的,触发阀值后kubelet会删除卷和守护程序⽇志,本质就是驱逐pod了。删除卷就是项⽬内的⽂件⽇志,删除守护程序⽇志就是容器的标准⽇志。
驱逐信号中如果包含imagefs相关的,触发阀值后kubelet会删除没有使⽤的镜像。
到此,已经知道了k8s节点因镜像或者⽇志占⽤磁盘空间占⽤过⼤的解决⽅案。
linux命令查看文件夹大小执⾏vim /etc/systemd/system/kubelet.service.f
在⾥⾯插⼊
Environment="KUBELET_OTHER_ARGS=
--eviction-hard=memory.available<2Gi,nodefs.available<5Gi,imagefs.available<5Gi
--eviction-minimum-reclaim=memory.available=500Mi,nodefs.available=5Gi,imagefs.available=5Gi --node-status-update-frequency=10s
--eviction-pressure-transition-period=30s"
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论