k3s 如何解决 ErrImagePull 拉取镜像超时

2023-03-26 10:42:30 +08:00
 vmoewill

由于私有的镜像太大了,worker 节点的带宽很小,需要拉取将近 3 分钟左右,但是 k3s 每次都是在 2 分钟的时候报 ErrImagePull 错误。有什么方法能增大这个 2 分钟的限制吗?

P.S.

  1. k3s 配置文件和 docker 的 daemon.json 快翻烂了,也没找到有关配置拉取时间的参数,临时的解决方法是手动在 worker 节点 pull 下镜像。我在 k3s 的 issue 中,发现有人回复说,这属于 docker 的问题,不属于 k3s 的范畴,但网上千篇一律的修改 dns 和镜像仓库加速似乎也不是解决镜像仓库的问题。

  2. daemon.json -> https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file

  3. docker version: 20.10.21 k3s version: v1.24.6+k3s1

2212 次点击
所在节点    Kubernetes
15 条回复
tomqin
2023-03-26 11:10:39 +08:00
换一种思路,直接 docker save 然后 scp 过去在 worker 上 docker load ?
hymzhek
2023-03-26 11:13:11 +08:00
K3s 允许你配置拉取镜像的超时时间。你可以在启动 K3s 时使用 --image-timeout 参数指定超时时间,例如:



sudo k3s server --image-timeout 5m
上面的命令将超时时间设置为 5 分钟。

如果你正在使用 systemd 或者 OpenRC 来管理 K3s 服务,则可以编辑服务配置文件来设置超时时间。对于 systemd ,可以编辑 /etc/systemd/system/k3s.service 文件,在 [Service] 部分添加 --image-timeout 参数,例如:

ExecStart=/usr/local/bin/k3s server --image-timeout 5m
对于 OpenRC ,可以编辑 /etc/init.d/k3s 文件,在 start() 函数中添加 --image-timeout 参数,例如:


start() {
/usr/local/bin/k3s server --image-timeout 5m &
}
注意,超时时间的单位为秒或分钟,可以在参数值后面添加 s 或 m 来指定。如果未指定单位,默认为秒。



不知道行不行 gpt 回答的
vmoewill
2023-03-26 11:16:05 +08:00
@hymzhek ChatGPT 我也问过了,很多参数根本不存在,还浪费很多的时间...
vmoewill
2023-03-26 11:18:43 +08:00
@tomqin 因为我是在 rancher 上部署的,流程大概是 jenkins 编译打包镜像 -> 推送 Harbor -> 通知 Rancher ,镜像都是带 tag 的,当然也可以让 worker 提前得到镜像,但我觉得应该是有配置这个参数的,谢谢你的回复。
drizztdu
2023-03-26 11:25:38 +08:00
https://github.com/rancher-sandbox/rancher-desktop/issues/2303 看样子是 rancher 魔改了 k3s ,导致部分 kubelet 配置参数 runtime-request-timeout 失效了。
feedcode
2023-03-26 11:49:30 +08:00
那个 issue 是关于 rancher desktop 的,github 里的代码逻辑还是在的,
https://github.com/k3s-io/kubernetes/blob/master/pkg/kubelet/kubelet.go#L319-L322

```
remote.NewRemoteRuntimeService(kubeCfg.ContainerRuntimeEndpoint, kubeCfg.RuntimeRequestTimeout.Duration, kubeDeps.TracerProvider);
```
dalamud
2023-03-26 13:20:26 +08:00
也可以提前到节点上用 crictl 把镜像拉到本地,多节点的话可以用 nodeSelector 之类的再指定到那个节点部署
liuxingdeyu
2023-03-26 13:34:59 +08:00
个人觉得,看你镜像里面是啥,如果是每次变动都很大的东西,比如模型啥的,那就最好是拷过去,cp 或者物理拷,如果是变动小的,就先拷个基础镜像啥的,然后再拉
vmoewill
2023-03-26 15:13:46 +08:00
@drizztdu
@feedcode
`runtime-request-timeout` 这个参数我也测试过了,好像并不行。我是在 `/etc/rancher/k3s/config.yaml` 中添加了 `kubelet-arg: "--runtime-request-timeout=5m"` ,在 k3s 的启动日志中,也发现 kubelet `--runtime-request-timeout=5m`,但是到 2 分钟后依旧会报错。


@dalamud
@liuxingdeyu
感谢回复
Firxiao
2023-03-26 17:16:26 +08:00
看讨论应该是 docker 的锅 https://github.com/k3s-io/k3s/issues/6482
建议从私有仓库入手 毕竟拉取超过三分钟不正常
dislazy2023
2023-03-26 17:21:17 +08:00
现在拉镜像也不容易了 最靠谱的方案是通过 github action 啥的 把镜像 重新 推到自己的私仓(阿里云私仓)啥的 然后直接用私仓来下来对应的镜像
swulling
2023-03-26 17:24:58 +08:00
这个和 K3s 无关,Docker 直接写死了,现在只有两种办法
1. 换成 containerd
2. 修改 docker 代码
vmoewill
2023-03-26 19:46:11 +08:00
@Firxiao
@dislazy2023
@swulling
感谢回复,目前临时的方法是在 rancher 滚动更新前,jenkins 先通知 worker 拉镜像,拉完在更。后续有更好的解决方法再说吧,此贴完结-。-
julyclyde
2023-03-26 21:04:15 +08:00
你的 jenkins 是负责 build 吗?
push 到哪儿去了?搞个内网服务器存放呗
zzl22100048
2023-03-27 11:32:11 +08:00
k3s 默认 runtime 不是 containerd 吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/927224

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX