k3s 环境在高 CPU&&Memory&&IO 负载下,pod 中的 container 随机健康检查失败
文章简介:k3s 环境在高 CPU&&Memory&&IO 负载下,pod 中的 container 随机健康检查失败 问题排查及解决
在大数据量下压测业务时,发现比较随机的 pod 中的 container failed(重启次数不断累积), 健康检查失败。
kubectl describe pod postgres-xxxx
|
|
|
|
看到非常多如下日志:
|
|
当前部署的 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 containers 及 Pod 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 放到不同的目录下,解决高负载下稳定性问题。