故障
现场 k8s node 很多 pod 都被硬性驱逐显示 Evicted
,现场人员查看分区容量和 inode 都正常,但是一直 reclaim ephemeral-storage
。
处理
环境信息
1 | $ uname -a |
过程
向日葵远程上去看了下,根分区容量都是正常的,inode 也是。看了下 uptime -s
重启过,现场说重启过还是没用。重启 kubelet 的话,看了下还是一直 reclaim ephemeral-storage
1 | $ du -h |
看了一会儿后发现上面的 ephemeral-storage
不对,Capacity
居然是 2038Mi
。
源码的一些探索
本地开发环境起了下 kubelet 调试了下,一些信息:
1 | ./build/run.sh make kubelet GOFLAGS="-v -tags=nokmem" GOGCFLAGS="all=-N -l" KUBE_BUILD_PLATFORMS=linux/amd64 |
容量这部分我现场通过特性 --feature-gates=LocalStorageCapacityIsolation=false
后删掉 node restart 后 describe 看不到 ephemeral-storage
了,但是还是问题还在,看了下源码,这个容量大小是 vendor/github.com/google/cadvisor/container/docker
下从 docker 获取的,嵌套的 interface 太多了,查看麻烦。现场是已经重启过机器了,docker 我重启和查看日志也没啥有用的地方。
最终解决
ephemeral-storage
这个 limit 是 1.15 alpha 的,暂时不想折腾了。 尝试换下 kubelet 的 root 目录。
1 | $ systemctl cat kubelet |
主要修改 WorkingDirectory
和给 kubelet 增加参数 --root-dir
以及 --docker-root
,现场 /data
是单独分区的,切到 /data/kube/kubelet
下,--docker-root
则是 docker 的 data-root
:
1 | $ vi /etc/systemd/system/kubelet.service |
1 | systemctl daemon-reload |
问题解决。后面才发现 /var 是单独分区的,客户现场动过分区表,之前是 /var 没有单独分区,后面他们创建了个 lv 并写在 /etc/fstab 里,并没有挂载和重启。一周前他们重启了下,而且有一些服务在 /var/log 输出日志,所以造成了这次故障。
参考
- https://github.com/kubernetes/kubernetes/tree/v1.15.5/vendor/github.com/google/cadvisor/manager/manager.go#L724
- https://github.com/kubernetes/kubernetes/tree/v1.15.5/vendor/github.com/google/cadvisor/container/libcontainer/handler.go
- https://github.com/kubernetes/kubernetes/tree/v1.15.5/vendor/github.com/docker/docker/pkg/mount/mountinfo_linux.go