Kubernetes集群运行一段时间后,通常会出现磁盘占用过高的问题。这里聊聊排查这类问题的方法和思路。
问题点如果是正常的Linux服务器出现这种情况,解决方案无非是ssh到该主机查看大文件然后进行删除。Kubernetes上也是如此,但问题在于,其中的节点由Kubernetes自己管理,登录秘钥管理人员很可能不知道。
所以通常的问题点是:无法进入Kubernetes节点。就磁盘问题来说,是无法进入节点的文件系统。
进入节点有两个进入节点的方式
使用Lens管理软件,它是一个非常厉害的Kubernetes IDE,提供直接进入节点的能力。自建pod,将节点根目录挂载在该pod的子目录。即挂载整个文件系统
本文专注第二种方式,这类deployment的Manifest如下,关键点:节点亲和性设置到想要管理的节点
apiVersion: apps/v1kind: Deploymentmetadata: labels: app: admin-entry name: admin-entry namespace: defaultspec: replicas: 1 selector: matchLabels: app: admin-entry strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: labels: app: admin-entry spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchexpressions: - key: kubernetes.io/hostname operator: In values: - cn-shenzhen.172.18.18.192 containers: - image: 'busybox:latest' name: admin-entry resources: requests: cpu: 10m memory: 512Mi stdin: true tty: true volumeMounts: - mountPath: /host-dir name: volume-1611735574911 dnsPolicy: ClusterFirst restartPolicy: Always volumes: - hostPath: path: / type: '' name: volume-1611735574911
然后创建
# 创建kubectl apply -f xxx.yaml# 进入podkubectl exec -it admin-entry-xxx -- sh
大文件占用排查与文件相关的有两个命令
du:统计列举文件或文件夹的大小df:列出整个文件系统的占用情况。列出的是磁盘设备的占用率
一般大文件排查用du命令。涉及到三个参数
-h:以人类可读的方式展示-d N:展示指定层级的目录-a:不只展示文件夹,文件也展示
其它参数通过du --help查看,对当前这个问题有如下:
# 进入挂载的目录/ # cd /host-dir/# 列出当前文件夹下第一层文件夹的大小/host-dir # du -h -d 10./sys4.0K./media384.0K./root4.0K./srv37.5M./etc46.0M./opt32.0K./tmp2.2G./usr4.3M./run4.0K./home131.2M./boot0./proc4.0K./mnt33.3G./var16.0K./lost+found0./dev35.7G.
可以看出主要占用在/var下。继续排查发现占用高主要问题有两个
/var/lib/docker/overlay2,docker创建的容器、镜像、其他资源占用,不能随便删除/var/log,产生的日志,这里我们可以删除不用的,能节省较多空间 总结
本文说的这种进入节点的方式,只能管理文件系统,但是无法管理pod之外的其它进程。使用lens则可以。
对于Kubernetes的磁盘占用率过高,通过上述两种清理闲置镜像 + 多余log文件的形式,可以节省出较多空间。如果能加个定期任务做这两件事,基本可以直接解决该问题。
#!/bin/shdocker image prune -a -f;rm /var/log/messages*