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