创建简单的 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。
这是一个老问题,但我刚刚看到它,因为它还没有答案,所以我会写下我的答案。
我遇到了这个问题,由于磁盘压力,我的 pod 被驱逐了很多次,并且不同的命令(例如
df
或 du
)没有帮助。
在我写的答案here的帮助下,我发现主要问题是 Pod 的日志文件,并且由于 K8s 不支持日志轮换,它们可以增长到数百个 Gig。
有不同的日志轮换方法可用,但我目前正在寻找 K8s 的最佳实践,所以我还不能建议任何特定的方法。
我希望这能有所帮助。
正如 simohe 评论的那样,以下是阈值:https://kubernetes.io/docs/concepts/scheduling-eviction/node-Pressure-eviction/#hard-eviction-thresholds
以下是用于在节点上检查这一点的 Linux 命令:
free -hm | awk 'NR==2{print $7}' #output has to be higher than 100Mi
df -h / | awk 'NR==2{print $5}' #output has to be lower than 90%
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%
df -i / | awk 'NR==2{print $5}' #output has to be lower than 95%
要了解所有存储空间的使用情况:
du / -d 1 -h 2> /dev/null | sort -hr
就我个人而言,我无法使用 kube 命令解决问题,因为......
据说这是由于防病毒软件(McAfee)造成的。
重新安装公司认可的 docker-desktop 版本解决了问题。
我不确定这是否真的是问题所在,但执行以下操作对我的情况有帮助:
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
的答案
我这样做是因为我在 Rancher 中打开 Pod 日志时看到了消息
failed to create fsnotify watcher: too many open files
。它解决了这个问题,但也解决了我的节点上的磁盘压力
有类似的问题。
我的错误日志: 警告 FailedScheduling 3m23s 默认调度程序 0/3 个节点可用:1 个节点与 Pod 的节点亲和力/选择器不匹配,1 个节点有污点 {node-role.kubernetes.io/controlplane: true},即Pod 无法容忍,1 个节点有污点 {node.kubernetes.io/disk-Pressure: },Pod 无法容忍
对我来说,/ 分区已填充至 82%。清理一些不需要的文件夹解决了该问题。 使用的命令:-
我希望这可以节省某人的时间。
社区已向您提示了上述评论。会努力巩固它。
将一个或多个逐出信号映射到相应的节点条件。kubelet
如果达到硬驱逐阈值,或软驱逐 已达到阈值,与其相关的宽限期无关,
报告反映节点处于以下状态的情况 压力。kubelet
DiskPressure
节点根文件系统上的可用磁盘空间和索引节点 或图像文件系统已满足逐出阈值
所以问题可能是磁盘空间不足或文件系统已用完索引节点。您必须了解您的环境条件,然后将它们应用到您的 kubelet 配置中。
您不需要 ssh 进入 minikube,因为您是在主机内运行它: --vm-driver=无 -
在主机上而不是在主机上运行 Kubernetes 组件的选项 虚拟机。 Docker 需要使用此驱动程序,但不需要虚拟机管理程序。如果你 使用
,请务必指定桥 docker 的网络。否则它可能会在网络重新启动之间发生变化, 导致与集群的连接丢失。--vm-driver=none
您可以尝试检查是否存在与上述主题相关的一些问题:
kubectl describe nodes
看
df
报道:
df -i
df -h
进一步阅读一些内容,以便您可以掌握主题: 配置资源不足处理 - 节点条件部分。