这是一个非常经典的 Kubernetes/Linux 系统参数限制问题。
根本原因:
Rancher(以及 Kubernetes)查看日志时,底层机制类似于 tail -f,需要使用 Linux 的 inotify 机制来监听文件变化。当节点上运行的容器太多,或者日志文件太多时,宿主机的 inotify 监听句柄(watches) 被用光了,就会报 too many open files 或 failed to create fsnotify watcher。
这无法在 Rancher 网页界面上点击修复,必须通过 SSH 登录到运行该 Pod 的 Kubernetes 宿主机(Node)上执行命令。
解决方案
请登录到你的 K8s 节点(如果有多个节点,建议在所有节点上都执行),按顺序执行以下步骤:
1. 临时生效(立即解决问题)
在宿主机终端执行:
bash
# 增加 max_user_watches (通常瓶颈在这里,默认值太小)
sysctl -w fs.inotify.max_user_watches=524288
# 增加 max_user_instances (建议一并调大)
sysctl -w fs.inotify.max_user_instances=8192
执行完后,不需要重启任何服务,回到 Rancher 界面刷新一下,应该就能看到日志了。
2. 永久生效(防止重启服务器后失效)
为了防止服务器重启后问题复发,需要写入配置文件:
bash
# 1. 将配置追加到 sysctl.conf 文件
cat >> /etc/sysctl.conf <<EOF
fs.inotify.max_user_watches=524288
fs.inotify.max_user_instances=8192
EOF
# 2. 重新加载配置
sysctl -p
为什么会这样?
- 默认值太低: 大多数 Linux 发行版(如 CentOS/Ubuntu)默认的
max_user_watches只有 8192。 - 消耗大: 每个容器的日志、ConfigMap 更新、Secret 更新都需要占用 watch 句柄。Rancher 的日志查看器也会占用。
- 推荐值: 对于生产环境的 K8s 节点,524288 是一个业界公认的安全推荐值(Rancher 官方文档和 ElasticSearch 等应用都推荐此值)。
操作建议:
如果你不知道具体是哪个节点出了问题,或者这是一个多节点集群,建议在所有 Worker 节点上都执行一遍上面的"永久生效"命令。