K3S 因为镜像过大而导致无法启动容器的解决方法
Johann Li | October 06, 2022
当尝试在 K3S 中使用一些超大的镜像的时候,比如 3GB+ 大的镜像,K3S 在启动的时候,会报一个 "CreateContainerError: context deadline exceeded", 如果这个镜像采用 docker 或者 containerd 单独运行没有问题的话,K3S 本身也能正常启动 POD 的话,那可能就是 镜像太大导致 kubelet request 超时而导致 POD/container 无法启动的原因。
这个问题,实际上不好解决,不太容易在互联网上找到解决方案,所以这里,记录一下相关的解决方法。参考了如下的内容
- https://github.com/rancher-sandbox/rancher-desktop/issues/2303
- https://serverfault.com/questions/1062564/createcontainererror-context-deadline-exceeded
解决方法,就是通过设置 kubelet 的 runtime-request-timeout
参数为更长的时间即可。
对于 K3S 来说就是 k3s server
中的 --kubelet-arg
参数中,指定 runtime-request-timeout
。
具体的来说,在安装 K3S 的时候,在 K3S_EXEC
环境变量里面添加设个时长设置,例如 K3S_EXEC="--kubelet-arg=runtime-request-timeout=1h1m1s"
就是把超时的时间设置为了 1小时1分钟1秒。或者在 K3S 的 systemd 配置的文件中,或者其他类似的地方 (k3s.service 或者 k3s-agent.service) 中添加一个命令行参数 --kubelet-arg=runtime-request-timeout=1h1m1s
。