k8s磁盘容量限制的方法

容器在运行中产生的日志和临时如果没有限制,会很快占满宿主的磁盘空间,导致磁盘写爆,今天就介绍下常见的限制POD使用容量的方法。

POD容器的临时存储如果在kubelet的配置没有更改的情况下默认存储在/var/lib/kubelet/pods目录下,容器的日志存放在/var/log/pods目录下。

docker容器rootfs默认位于/var/lib/docker目录下

当节点磁盘存储资源不足,kubelet会驱逐掉一些POD来释放存储资源,这种检测磁盘资源不足的信息主要来源于imagesfs和nodefs,他们分别的作用是:

  1. imagefs:容器运行时用作存储镜像、可写层的文件系统,当 imagefs用量到达驱逐阈值,Kubelet 会删除所有未使用的镜像,释放空间。

  2. nodefs:Kubelet用作卷、守护进程日志的文件系统,当 nodefs用量到达阈值,Kubelet 会选择性的驱逐 Pod(及其容器)来释放空间。

POD可以设置request/limit资源的限制来限制POD容器使用的存储资源,如果POD使用资源超过了设定的限制,kubelet将设置驱逐信号,触发POD的驱逐流程:

  1. 对于容器级别的隔离,如果一个容器的可写层、日志占用磁盘超过限制,则Kubelet标记POD为待驱逐

  2. 对于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

微信截图_20231205204807.png

此时该POD就被标记驱逐状态。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/937.html

我要评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。