由于私有的镜像太大了,worker 节点的带宽很小,需要拉取将近 3 分钟左右,但是 k3s 每次都是在 2 分钟的时候报 ErrImagePull 错误。有什么方法能增大这个 2 分钟的限制吗?
P.S.
k3s 配置文件和 docker 的 daemon.json 快翻烂了,也没找到有关配置拉取时间的参数,临时的解决方法是手动在 worker 节点 pull 下镜像。我在 k3s 的 issue 中,发现有人回复说,这属于 docker 的问题,不属于 k3s 的范畴,但网上千篇一律的修改 dns 和镜像仓库加速似乎也不是解决镜像仓库的问题。
daemon.json -> https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file
docker version: 20.10.21 k3s version: v1.24.6+k3s1
1
tomqin 2023-03-26 11:10:39 +08:00 via Android
换一种思路,直接 docker save 然后 scp 过去在 worker 上 docker load ?
|
2
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 回答的 |
4
vmoewill OP @tomqin 因为我是在 rancher 上部署的,流程大概是 jenkins 编译打包镜像 -> 推送 Harbor -> 通知 Rancher ,镜像都是带 tag 的,当然也可以让 worker 提前得到镜像,但我觉得应该是有配置这个参数的,谢谢你的回复。
|
5
drizztdu 2023-03-26 11:25:38 +08:00 via iPhone
https://github.com/rancher-sandbox/rancher-desktop/issues/2303 看样子是 rancher 魔改了 k3s ,导致部分 kubelet 配置参数 runtime-request-timeout 失效了。
|
6
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); ``` |
7
dalamud 2023-03-26 13:20:26 +08:00
也可以提前到节点上用 crictl 把镜像拉到本地,多节点的话可以用 nodeSelector 之类的再指定到那个节点部署
|
8
liuxingdeyu 2023-03-26 13:34:59 +08:00
个人觉得,看你镜像里面是啥,如果是每次变动都很大的东西,比如模型啥的,那就最好是拷过去,cp 或者物理拷,如果是变动小的,就先拷个基础镜像啥的,然后再拉
|
9
vmoewill OP @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 感谢回复 |
10
Firxiao 2023-03-26 17:16:26 +08:00
看讨论应该是 docker 的锅 https://github.com/k3s-io/k3s/issues/6482
建议从私有仓库入手 毕竟拉取超过三分钟不正常 |
11
dislazy2023 2023-03-26 17:21:17 +08:00
现在拉镜像也不容易了 最靠谱的方案是通过 github action 啥的 把镜像 重新 推到自己的私仓(阿里云私仓)啥的 然后直接用私仓来下来对应的镜像
|
12
swulling 2023-03-26 17:24:58 +08:00
这个和 K3s 无关,Docker 直接写死了,现在只有两种办法
1. 换成 containerd 2. 修改 docker 代码 |
13
vmoewill OP @Firxiao
@dislazy2023 @swulling 感谢回复,目前临时的方法是在 rancher 滚动更新前,jenkins 先通知 worker 拉镜像,拉完在更。后续有更好的解决方法再说吧,此贴完结-。- |
14
julyclyde 2023-03-26 21:04:15 +08:00
你的 jenkins 是负责 build 吗?
push 到哪儿去了?搞个内网服务器存放呗 |
15
zzl22100048 2023-03-27 11:32:11 +08:00
k3s 默认 runtime 不是 containerd 吗?
|