上云无忧 > 文档中心 > 腾讯云容器服务 - 节点磁盘爆满排障处理
容器服务 TKE
腾讯云容器服务 - 节点磁盘爆满排障处理

文档简介:
本文档介绍 TKE 集群中多场景下可能发生的磁盘爆满问题,并给出对应的排查思路及解决方案,请按照下文中的步骤进行排查并解决。
*此产品及展示信息均由腾讯云官方提供。免费试用 咨询热线:400-826-7010,为您提供专业的售前咨询,让您快速了解云产品,助您轻松上云! 微信咨询
  免费试用、价格特惠
本文档介绍 TKE 集群中多场景下可能发生的磁盘爆满问题,并给出对应的排查思路及解决方案,请按照下文中的步骤进行排查并解决。

可能原因

kubelet 支持 gc 和驱逐机制,可通过 --image-gc-high-threshold--image-gc-low-threshold--eviction-hard--eviction-soft--eviction-minimum-reclaim 等参数进行控制以实现磁盘空间的释放。当配置不正确,或者节点上有其它非 K8S 管理的进程在不断写数据到磁盘,将会占用大量空间时将导致磁盘爆满。
磁盘爆满将影响 K8S 运行,主要涉及 kubelet 和容器运行时两个关键组件。请按照以下步骤进行分析:
1. 执行 df 命令,查看 kubelet 和容器运行时所使用的目录是否存在于该磁盘。
2. 对应实际结果,选择以下方式进行问题精确定位:
容器运行时使用的目录所在磁盘爆满
Kubelet 使用的目录所在磁盘爆满

问题定位及解决思路

容器运行时使用的目录所在磁盘爆满

如果容器运行时使用的目录所在磁盘空间爆满,将可能会造成容器运行时无响应。例如,当前容器运行时为 docker,则执行 docker 相关的命令将会一直 hang 住,kubelet 日志也将看到 PLEG unhealthy,而 CRI 调用 timeout 也将导致容器无法创建或销毁,外在现象通常表现为 Pod 一直 ContainerCreating 或一直 Terminating。

docker 默认使用的目录

/var/run/docker:用于存储容器运行状态,通过 dockerd 的 --exec-root 参数指定。
/var/lib/docker:用于持久化容器相关的数据。例如,容器镜像、容器可写层数据、容器标准日志输出及通过 docker 创建的 volume 等。

Pod 启动过程事件

Pod 在启动过程中,可能会出现以下类似事件:

		

Warning FailedCreatePodSandBox 53m kubelet, 172.22.0.44 Failed create

pod sandbox: rpc error: code = DeadlineExceeded desc = context deadline exceeded

		

Warning FailedCreatePodSandBox 2m (x4307 over 16h) kubelet, 10.179.80.31

(combined from similar events): Failed create pod sandbox: rpc error: code

= Unknown desc = failed to create a sandbox for pod "apigateway-6dc48bf8b6-l8xrw":

Error response from daemon: mkdir /var/lib/docker/aufs/mnt/1f09d6c1c9f24e8daaea

5bf33a4230de7dbc758e3b22785e8ee21e3e3d921214-init: no space left on device

		

Warning Failed 5m1s (x3397 over 17h) kubelet, ip-10-0-151-35.

us-west-2.compute.internal (combined from similar events): Error:

container create failed: container_linux.go:336: starting container

process caused "process_linux.go:399: container init caused \"rootfs_linux.

go:58: mounting \\\"/sys\\\" to rootfs \\\"/var/lib/dockerd/storage/overlay

/051e985771cc69f3f699895a1dada9ef6483e912b46a99e004af7bb4852183eb/merged\\\"

at \\\"/var/lib/dockerd/storage/overlay/051e985771cc69f3f699895a1dada9ef6483

e912b46a99e004af7bb4852183eb/merged/sys\\\" caused \\\"no space left on device\\\"\""

Pod 删除过程事件

Pod 在删除过程中,可能会出现以下类似事件:

		

Normal Killing 39s (x735 over 15h) kubelet, 10.179.80.31 Killing

container with id docker://apigateway:Need to kill Pod

Kubelet 使用的目录所在磁盘爆满

kubelet 默认使用的目录

/var/lib/kubelet:通过 kubelet 的 --root-dir 参数指定,用于存储插件信息、Pod 相关的状态以及挂载的 volume(例如,emptyDirConfigMapSecret)。

Pod 事件

Kubelet 使用的目录所在磁盘空间爆满(通常是系统盘),新建 Pod 时无法成功进行 mkdir,导致 Sandbox 也无法创建成功,Pod 通常会出现以下类似事件:

		

Warning UnexpectedAdmissionError 44m kubelet, 172.22.0.44 Update

plugin resources failed due to failed to write checkpoint file

"kubelet_internal_checkpoint": write /var/lib/kubelet/device-plugins

/.728425055: no space left on device, which is unexpected.

处理步骤

当容器运行时为 docker 时发生磁盘爆满问题,dockerd 也会因此无法正常响应,在停止时会卡住,从而导致无法直接重启 dockerd 来释放空间。需要先手动清理部分文件腾出空间以确保 dockerd 能够停止并重启。恢复步骤如下:
1. 手动删除 docker 的部分 log 文件或可写层文件。通常删除 log 文件,示例如下:

		
$ cd /var/lib/docker/containers
$ du -sh * # 找到比较大的目录
$ cd dda02c9a7491fa797ab730c1568ba06cba74cecd4e4a82e9d90d00fa11de743c

$ cat /dev/null > dda02c9a7491fa797ab730c1568ba

06cba74cecd4e4a82e9d90d00fa11de743c-json.log.9 # 删除log文件

注意
删除文件时,建议使用 cat /dev/null > 方式进行删除,不建议使用 rm。使用 rm 方式删除的文件,不能够被 docker 进程释放掉,该文件所占用的空间也就不会被释放。
log 的后缀数字越大表示时间越久远,建议优先删除旧日志。
2. 执行以下命令,将该 Node 标记为不可调度,并将其已有的 Pod 驱逐到其它节点。
		
kubectl drain <node-name>
该步骤可以确保 dockerd 重启时将原节点上 Pod 对应的容器删掉,同时确保容器相关的日志(标准输出)与容器内产生的数据文件(未挂载 volume 及可写层)也会被清理。
3. 执行以下命令,重启 dockerd。
		
systemctl restart dockerd
# or systemctl restart docker
4. 等待 dockerd 重启恢复,Pod 调度到其它节点后,排查磁盘爆满原因并进行数据清理和规避操作。
5. 执行以下命令,取消节点不可调度标记。
		
kubectl uncordon <node-name>
相似文档
  • 本文档介绍如何在 TKE 集群中,通过工具定位异常是否由高负载造成,请按照以下步骤进行问题排查。 现象描述: 节点高负载将会导致进程无法获得足够运行所需的 CPU 时间片,通常表现为网络 Timeout、健康检查失败或服务不可用。
  • 本文档介绍如何判断 TKE 集群中存在问题是否由内存碎片化引起,并给出解决方法,请按照以下步骤进行排查并解决。
  • 排查思路: 1. 确保集群 DNS 正常运行 容器内解析 DNS 通过集群 DNS(通常是 CoreDNS),首先要确保集群 DNS 运行正常。kubelet 启动参数--cluster-dns可以看到 DNS 服务的 Cluster IP:
  • 在使用 TKE 集群服务的过程中,某些场景下,可能会出现服务访问不通的问题,如果确认后端 Pod 访问正常,则可能是由于 kube-proxy 组件版本较低,导致节点上的 iptables 或 ipvs 服务转发规则下发失败。本文档整理了低版本 kube-proxy 存在的若干问题,并给出相应的修复指引。若本文档无法解决您所遇到的问题,请 联系我们 来寻求帮助。
  • 开启内网访问后无法访问: 您可以直接在容器服务控制台上 开启内网访问。如果开启内网访问之后仍出现无法访问的情况,建议您对应集群类型进行如下检查: 托管集群: 参考 查看节点安全组配置 检查集群中节点的安全组是否正确放通30000-32768端口区间。
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部