Openshift节点Disk pressure
OpenShift 监控以下指标,并定义以下垃圾回收的驱逐阈值。请参阅产品文档以更改任何驱逐值。
nodefs.available
从 cadvisor 来看,该node.stats.fs.available指标表示节点文件系统(所在位置)上有多少可用(剩余)的文件系统空间/var/lib/kubelet。
默认驱逐阈值:<10%
nodefs.inodesFree
从 cadvisor 来看,该node.stats.fs.inodesFree指标表示节点文件系统中剩余的可用 inode 数量。该文件系统取决于节点所在位置/var/lib/kubelet,在 RHCOS 或标准 RHEL FS 布局中,这是映射到的文件系统/。
默认驱逐阈值:<5%
imagefs.available
从 cadvisor 来看,该node.stats.runtime.imagefs.available指标表示镜像存储文件系统(所在位置)上有多少可用(剩余)的文件系统空间/var/lib/containers/。
默认驱逐阈值:<15%
imagefs.inodesFree
从 cadvisor 来看,该node.stats.runtime.imagefs.inodesFree指标表示图像存储文件系统中剩余的可用 inode 数量。
默认驱逐阈值:<5%
注意:使用df -h 和df -i 在哪里是 或nodefs,imagefs应该显示由 cadvisor 提取的相同指标。
本文的读者还应参考我们的资源储备文档,以获取有关提高节点可靠性/稳定性的更多信息。
1.监控DiskPressure
使用PrometheusRule
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:name: diskpressure-rulesnamespace: openshift-monitoring
spec:groups:- name: node-diskpressure-alertsrules:- alert: nodefsAvailableLowannotations:description: '节点{{ $labels.instance}}分区/var/lib/kubelet使用率过高已经超过85%,当超过90%,会出现Disk Pressure污点'summary: '节点{{ $labels.instance}}分区/var/lib/kubelet使用率过高.'expr: |1 - node_filesystem_avail_bytes{mountpoint="/var/lib/kubelet"}/node_filesystem_size_bytes{mountpoint="/var/lib/kubelet"} > 0.85for: 1mlabels:severity: warning- alert: nodefsInodesFreeLowannotations:description: '节点{{ $labels.instance}}分区/var/lib/kubelet文件系统中使用的inode数量已经超过90%,当超过95%,会出现Disk Pressure污点'summary: '节点{{ $labels.instance}}分区/var/lib/kubelet文件系统可使用的inode数量低.'expr: |1 - node_filesystem_files_free{mountpoint="/var/lib/kubelet",fstype!~"tmpfs|overlay"}/node_filesystem_files{mountpoint="/var/lib/kubelet",fstype!~"tmpfs|overlay"} > 0.9for: 1mlabels:severity: warning- alert: imagefsAvailableLowannotations:description: '节点{{ $labels.instance}}分区/var/lib/containers使用率过高已经超过80%,当超过85%,会出现Disk Pressure污点'summary: '节点 {{ $labels.instance }} 分区/var/lib/containers磁盘使用率过高.'expr: |1- node_filesystem_avail_bytes{mountpoint="/var/lib/containers"}/node_filesystem_size_bytes{mountpoint="/var/lib/containers"} > 0.8for: 1mlabels:severity: warning- alert: imagefsInodesFreeLowannotations:description: '节点{{ $labels.instance}}分区/var/lib/containers文件系统中使用的inode数量已经超过90%,当超过95%,会出现Disk Pressure污点'summary: '节点{{ $labels.instance}}分区/var/lib/containers文件系统可使用的inode数量低.'expr: |1 - node_filesystem_files_free{mountpoint="/var/lib/containers",fstype!~"tmpfs|overlay"}/node_filesystem_files{mountpoint="/var/lib/containers",fstype!~"tmpfs|overlay"} > 0.9for: 1mlabels:severity: warning
2.如何调查 DiskPressure
问题
一些 OpenShift 节点获取DiskPressure、OutOfDisk和NotReady状态。
识别主机上使用大磁盘的 pod。
解决
pods硬盘资源主要消耗的是overlay目录和emptydir目录。
目录与pod的相关信息列在/var/lib/containers/storage/overlay-containers/volatile-containers.json文件中(OCP 4.11及以下版本中,这些信息列在文件中/var/lib/containers/storage/overlay-containers/containers.json)。文件pod-name中记录的containers.json由组成 k8s_<Kubernetes Pod Name>_<Kubernetes Namespace>_<Pod Id>_0
。
注意:如果pods已经被驱逐并转移到其他节点,则需要调查pods其他节点上的驱逐情况。
为了释放磁盘空间,可以按照使用 OpenShift 4 中的图像修剪器从节点中删除未使用的image中的说明配置垃圾收集器。
根本原因
pods硬盘资源主要消耗的是overlay目录和emptydir目录。
诊断步骤
首先,调查节点中的磁盘使用情况:
$ oc debug node/<node name>
$ chroot /host
# df -h
# du -h --max-depth=1 /var | sort -hr
# du -h --max-depth=1 /var/log | sort -hr
# du -h --max-depth=1 /var/lib | sort -hr
如果/var/lib目录过大,需要pods按照如下步骤排查哪个目录占用了较大的磁盘:
识别覆盖层中使用大磁盘的覆盖层 ID。以下示例中为f47d8f457d3ef1b119f238807202d6590d07b548c961f036197ae4e70668f1dc
# du -h --max-depth=1 /var/lib/containers/storage/overlay | sort -hr
SIZE OVERLAY PATH
...............................
2.4G /var/lib/containers/storage/overlay/f47d8f457d3ef1b119f238807202d6590d07b548c961f036197ae4e70668f1dc
然后,通过覆盖 ID 识别 Pod 名称
# cat /var/lib/containers/storage/overlay-containers/volatile-containers.json | jq -c '.[] | select( .layer | contains("<overlay id>")) | .metadata' | jq -r | jq '."pod-name"'
k8s_downloads-665d985cd5-5268z_openshift-console_d4a527d0-42a3-4ff8-8651-64508dbb74b6_0
用同样的方法,在 emptydir 中识别使用大磁盘的 pod id。在下面的例子中,它是59f09a5d-05ab-45a6-bb73-e46b8fa2b28b
# du -h --max-depth=1 /var/lib/kubelet/pods | sort -hr
SIZE POD ID
...............................
3.0M /var/lib/kubelet/pods/59f09a5d-05ab-45a6-bb73-e46b8fa2b28b
然后通过 pod id 识别 pod 名称
# cat /var/lib/containers/storage/overlay-containers/volatile-containers.json | jq -r '[.[] | select( .names[] | contains("<pod id>")) | .metadata][0]' | jq -r '."pod-name"'
k8s_grafana-989b557fb-6vn2k_openshift-monitoring_59f09a5d-05ab-45a6-bb73-e46b8fa2b28b_0
3.快速解决办法:给磁盘扩容
假如/dev/sdb1是挂在/var/lib/containers上,当/var/lib/containers容量不足85%,会引发disk pressure
先从虚拟机的层面扩容sdb
echo '1' > /sys/block/sdb/device/rescan
growpart /dev/sdb 1
xfs_growfs /dev/sdb1
参考:
https://access.redhat.com/articles/4766521
https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/node-pressure-eviction/
https://docs.redhat.com/zh-cn/documentation/openshift_container_platform/4.14/html/nodes/nodes-nodes-garbage-collection#nodes-nodes-garbage-collection-configuring_nodes-nodes-configuring
https://access.redhat.com/solutions/5341801