容器在运行中产生的日志和临时如果没有限制,会很快占满宿主的磁盘空间,导致磁盘写爆,今天就介绍下常见的限制POD使用容量的方法。
POD容器的临时存储如果在kubelet的配置没有更改的情况下默认存储在/var/lib/kubelet/pods目录下,容器的日志存放在/var/log/pods目录下。
docker容器rootfs默认位于/var/lib/docker目录下
当节点磁盘存储资源不足,kubelet会驱逐掉一些POD来释放存储资源,这种检测磁盘资源不足的信息主要来源于imagesfs和nodefs,他们分别的作用是:
imagefs:容器运行时用作存储镜像、可写层的文件系统,当 imagefs用量到达驱逐阈值,Kubelet 会删除所有未使用的镜像,释放空间。
nodefs:Kubelet用作卷、守护进程日志的文件系统,当 nodefs用量到达阈值,Kubelet 会选择性的驱逐 Pod(及其容器)来释放空间。
POD可以设置request/limit资源的限制来限制POD容器使用的存储资源,如果POD使用资源超过了设定的限制,kubelet将设置驱逐信号,触发POD的驱逐流程:
对于容器级别的隔离,如果一个容器的可写层、日志占用磁盘超过限制,则Kubelet标记POD为待驱逐
对于POD级别的隔离,POD总用量限制,是每个容器限制之和。如果各容器用量之和+Pod的emptyDir卷超过Pod总用量限制,标记POD为待驱逐。
下面我们就来看下实例
apiVersion: apps/v1 kind: Deployment metadata: name: orion-toolkit namespace: orion spec: replicas: 1 selector: matchLabels: name: orion-toolkit template: metadata: labels: name: orion-toolkit spec: nodeName: k8s-node2 schedulerName: default-scheduler containers: - name: orion-toolkit image: toolkit:v2.1 imagePullPolicy: IfNotPresent command: ["bash", "-c"] args: ["while true; do sleep 30; done;"] resources: requests: cpu: "1" memory: 2Gi ephemeral-storage: 10Gi limits: cpu: "1" memory: 2Gi ephemeral-storage: 10Gi
创建上述POD以后,进入POD,然后使用dd命令创建一个超过10G的文件
dd if=/dev/zero of=/tmp/11G.txt bs=11M count=1024
接着我们等一会就会看到终端自动退出,退出码是137
此时该POD就被标记驱逐状态。