V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
vmoewill
V2EX  ›  Kubernetes

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

  •  
  •   vmoewill · 2023-03-26 10:42:30 +08:00 · 2056 次点击
    这是一个创建于 390 天前的主题,其中的信息可能已经有所发展或是发生改变。

    由于私有的镜像太大了,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

    第 1 条附言  ·  2023-03-26 19:46:24 +08:00
    目前临时的方法是在 rancher 滚动更新前,jenkins 先通知 worker 拉镜像,拉完在更。后续有更好的解决方法再说吧,此贴完结-。-
    15 条回复    2023-03-27 11:32:11 +08:00
    tomqin
        1
    tomqin  
       2023-03-26 11:10:39 +08:00 via Android
    换一种思路,直接 docker save 然后 scp 过去在 worker 上 docker load ?
    hymzhek
        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 回答的
    vmoewill
        3
    vmoewill  
    OP
       2023-03-26 11:16:05 +08:00
    @hymzhek ChatGPT 我也问过了,很多参数根本不存在,还浪费很多的时间...
    vmoewill
        4
    vmoewill  
    OP
       2023-03-26 11:18:43 +08:00
    @tomqin 因为我是在 rancher 上部署的,流程大概是 jenkins 编译打包镜像 -> 推送 Harbor -> 通知 Rancher ,镜像都是带 tag 的,当然也可以让 worker 提前得到镜像,但我觉得应该是有配置这个参数的,谢谢你的回复。
    drizztdu
        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 失效了。
    feedcode
        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);
    ```
    dalamud
        7
    dalamud  
       2023-03-26 13:20:26 +08:00
    也可以提前到节点上用 crictl 把镜像拉到本地,多节点的话可以用 nodeSelector 之类的再指定到那个节点部署
    liuxingdeyu
        8
    liuxingdeyu  
       2023-03-26 13:34:59 +08:00
    个人觉得,看你镜像里面是啥,如果是每次变动都很大的东西,比如模型啥的,那就最好是拷过去,cp 或者物理拷,如果是变动小的,就先拷个基础镜像啥的,然后再拉
    vmoewill
        9
    vmoewill  
    OP
       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
        10
    Firxiao  
       2023-03-26 17:16:26 +08:00
    看讨论应该是 docker 的锅 https://github.com/k3s-io/k3s/issues/6482
    建议从私有仓库入手 毕竟拉取超过三分钟不正常
    dislazy2023
        11
    dislazy2023  
       2023-03-26 17:21:17 +08:00
    现在拉镜像也不容易了 最靠谱的方案是通过 github action 啥的 把镜像 重新 推到自己的私仓(阿里云私仓)啥的 然后直接用私仓来下来对应的镜像
    swulling
        12
    swulling  
       2023-03-26 17:24:58 +08:00
    这个和 K3s 无关,Docker 直接写死了,现在只有两种办法
    1. 换成 containerd
    2. 修改 docker 代码
    vmoewill
        13
    vmoewill  
    OP
       2023-03-26 19:46:11 +08:00
    @Firxiao
    @dislazy2023
    @swulling
    感谢回复,目前临时的方法是在 rancher 滚动更新前,jenkins 先通知 worker 拉镜像,拉完在更。后续有更好的解决方法再说吧,此贴完结-。-
    julyclyde
        14
    julyclyde  
       2023-03-26 21:04:15 +08:00
    你的 jenkins 是负责 build 吗?
    push 到哪儿去了?搞个内网服务器存放呗
    zzl22100048
        15
    zzl22100048  
       2023-03-27 11:32:11 +08:00
    k3s 默认 runtime 不是 containerd 吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5241 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 234ms · UTC 08:02 · PVG 16:02 · LAX 01:02 · JFK 04:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.