如何修复 Kubernetes NodeUnderDiskPressure 错误?

问题描述 投票:0回答:6

创建简单的 hello world 部署后,我的 Pod 状态显示为“PENDING”。当我在 Pod 上运行

kubectl describe pod
时,我得到以下信息:

Events:
  Type     Reason            Age                From               Message
  ----     ------            ----               ----               -------
  Warning  FailedScheduling  14s (x6 over 29s)  default-scheduler  0/1 nodes are available: 1 NodeUnderDiskPressure.

如果我检查节点运行状况,我会得到:

Conditions:
  Type             Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
  ----             ------  -----------------                 ------------------                ------                       -------
  OutOfDisk        False   Fri, 27 Jul 2018 15:17:27 -0700   Fri, 27 Jul 2018 14:13:33 -0700   KubeletHasSufficientDisk     kubelet has sufficient disk space available
  MemoryPressure   False   Fri, 27 Jul 2018 15:17:27 -0700   Fri, 27 Jul 2018 14:13:33 -0700   KubeletHasSufficientMemory   kubelet has sufficient memory available
  DiskPressure     True    Fri, 27 Jul 2018 15:17:27 -0700   Fri, 27 Jul 2018 14:13:43 -0700   KubeletHasDiskPressure       kubelet has disk pressure
  Ready            True    Fri, 27 Jul 2018 15:17:27 -0700   Fri, 27 Jul 2018 14:13:43 -0700   KubeletReady                 kubelet is posting ready status. AppArmor enabled

所以问题似乎是“kubelet 有磁盘压力”,但我无法真正弄清楚这意味着什么。我无法通过 SSH 连接到 minikube 并检查其磁盘空间,因为我正在使用带有

--vm-driver=none
的 VMWare Workstation。

kubernetes
6个回答
15
投票

这是一个老问题,但我刚刚看到它,因为它还没有答案,所以我会写下我的答案。

我遇到了这个问题,由于磁盘压力,我的 pod 被驱逐了很多次,并且不同的命令(例如

df
du
)没有帮助。

在我写的答案here的帮助下,我发现主要问题是 Pod 的日志文件,并且由于 K8s 不支持日志轮换,它们可以增长到数百个 Gig。

有不同的日志轮换方法可用,但我目前正在寻找 K8s 的最佳实践,所以我还不能建议任何特定的方法。

我希望这能有所帮助。


9
投票

正如 simohe 评论的那样,以下是阈值:https://kubernetes.io/docs/concepts/scheduling-eviction/node-Pressure-eviction/#hard-eviction-thresholds

以下是用于在节点上检查这一点的 Linux 命令:

  • 内存.可用<100Mi
    free -hm | awk 'NR==2{print $7}' #output has to be higher than 100Mi
  • nodefs.可用<10%
    df -h / | awk 'NR==2{print $5}' #output has to be lower than 90%
  • imagefs.可用<15%
    • 容器:
      df -h /var/lib/containerd/io.containerd.snapshotter.v1.overlayfs | awk 'NR==2{print $5}' #output has to be lower than 85%
    • 码头工人:
       df -h /var/lib/docker | awk 'NR==2{print $5}' #output has to be lower than 85%
  • nodefs.inodesFree<5% (Linux nodes)
    df -i / | awk 'NR==2{print $5}' #output has to be lower than 95%

要了解所有存储空间的使用情况:

du / -d 1 -h 2> /dev/null | sort -hr


0
投票

就我个人而言,我无法使用 kube 命令解决问题,因为......
据说这是由于防病毒软件(McAfee)造成的。 重新安装公司认可的 docker-desktop 版本解决了问题。


0
投票

我不确定这是否真的是问题所在,但执行以下操作对我的情况有帮助:

sudo sysctl -w fs.inotify.max_user_watches=2099999999
sudo sysctl -w fs.inotify.max_user_instances=2099999999
sudo sysctl -w fs.inotify.max_queued_events=2099999999

来自ServerFault

的答案

我这样做是因为我在 Rancher 中打开 Pod 日志时看到了消息

failed to create fsnotify watcher: too many open files
。它解决了这个问题,但也解决了我的节点上的磁盘压力


-1
投票

有类似的问题。

我的错误日志: 警告 FailedScheduling 3m23s 默认调度程序 0/3 个节点可用:1 个节点与 Pod 的节点亲和力/选择器不匹配,1 个节点有污点 {node-role.kubernetes.io/controlplane: true},即Pod 无法容忍,1 个节点有污点 {node.kubernetes.io/disk-Pressure: },Pod 无法容忍

对我来说,/ 分区已填充至 82%。清理一些不需要的文件夹解决了该问题。 使用的命令:-

  1. ssh uname@IP_or_hostname(登录工作节点)
  2. df -h(检查磁盘使用情况)
  3. rm -rf 文件夹名称(删除不需要的文件夹,您正在强制删除该文件,因此请确保您确实要删除它)。

我希望这可以节省某人的时间。


-3
投票

社区已向您提示了上述评论。会努力巩固它。

kubelet
将一个或多个逐出信号映射到相应的节点条件。

如果达到硬驱逐阈值,或软驱逐 已达到阈值,与其相关的宽限期无关,

kubelet
报告反映节点处于以下状态的情况 压力。

DiskPressure

节点根文件系统上的可用磁盘空间和索引节点 或图像文件系统已满足逐出阈值

所以问题可能是磁盘空间不足或文件系统已用完索引节点。您必须了解您的环境条件,然后将它们应用到您的 kubelet 配置中。

您不需要 ssh 进入 minikube,因为您是在主机内运行它: --vm-driver=无 -

在主机上而不是在主机上运行 Kubernetes 组件的选项 虚拟机。 Docker 需要使用此驱动程序,但不需要虚拟机管理程序。如果你 使用

--vm-driver=none
,请务必指定桥 docker 的网络。否则它可能会在网络重新启动之间发生变化, 导致与集群的连接丢失。

您可以尝试检查是否存在与上述主题相关的一些问题:

kubectl describe nodes

df
报道:

df -i
df -h

进一步阅读一些内容,以便您可以掌握主题: 配置资源不足处理 - 节点条件部分。

© www.soinside.com 2019 - 2024. All rights reserved.