目录

k3s 环境在高 CPU&&Memory&&IO 负载下,pod 中的 container 随机健康检查失败

目录

文章简介:k3s 环境在高 CPU&&Memory&&IO 负载下,pod 中的 container 随机健康检查失败 问题排查及解决

在大数据量下压测业务时,发现比较随机的 pod 中的 container failed(重启次数不断累积), 健康检查失败。

kubectl describe pod postgres-xxxx

1
TODO
1
tail -f /var/lib/rancher/k3s/agent/containerd/containerd.log

看到非常多如下日志:

1
2
3
4
5
time="2024-08-21T08:42:37.199951601+08:00" level=error msg="ExecSync for \"69994ab2f7a951735b5d613d80b9ac33e1c1366a3e0fae5fd9ec24fb545cb1d6\" failed" error="rpc error: code = DeadlineExceeded desc = failed to exec in container: timeout 5s exceeded: context deadline exceeded"

...
time="2024-07-30T10:39:39.772561484+08:00" level=error msg="get state for 39756d9fdea7fcf15eb76d0c792614681b1d801fb8a70bc72c3042503e619473" error="context deadline exceeded: unknown"
...

当前部署的 k3s 已经为了解决 etcd 稳定性问题,将 etcd 的存储挂载到了 ssd 下。而 /var/lib/rancher/k3s/agent/containerd 下目录放到机械硬盘上了。这次的问题就在于 k3s 的健康检查设置的时间为 5s,健康检查是 containerd 执行命令,5s 内 containerd 未实际执行完对应的命令,超时失败多次后,pod 健康检查失败,pod 进入 unhealthy 状态。对外的表现就是访问对应的 service 的请求 timeout 导致业务不可用。社区 issue 可以参考 Containerd fails to stop containersPod stuck terminating / KillContainerError

解决办法:将 /var/lib/rancher/k3s/agent/containerd/ 挂载到 ssd 下即可。

k3s 的文档中已经在 Resource Profiling 中描述,为了保证 k3s 的稳定性,需要将 /var/lib/rancher/k3s/{agent,server,storage} 三个目录分开互不影响。我们将 k3s agent 及 server 放到 ssd 下,与 storage 放到不同的目录下,解决高负载下稳定性问题。