IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    k3s新特性分布式注册表镜像,加速镜像拉取

    ysicing (i@ysicing.me)发表于 2024-06-18 12:36:31
    love 0

    k3s新特性分布式注册表镜像,加速镜像拉取

    自2024 年1月起,分布式注册表镜像作为实验性功能提供:v1.26.13+k3s1、v1.27.10+k3s1、v1.28.6+k3s1、v1.29.1+k3s1

    该功能基于开源项目spegel实现

    什么是spegel

    一个无状态集群本地 OCI 注册表镜像

    应用场景

    • 本地缓存来自外部注册表的映像,无需显式配置
    • 避免在外部注册表停机期间发生群集故障
    • 通过首先从本地缓存中拉取镜像来提高镜像拉取速度和 Pod 启动时间。
    • 从外部注册表(例如 Docker Hub)提取映像时避免速率限制。
    • 减少群集网络外部的出口流量。
    • 提高边缘节点部署中的映像拉取效率

    总结版: 通过公网只需要拉取一次后,共享给所有节点使用。集群中的每个节点都可以充当本地注册表镜像服务,允许节点在它们之间共享映像,节点已拉取的任何映像都可供群集中的任何其他节点拉取。

    硬性要求

    • 只支持containerd

    其他更多细节,可以阅读官方文档 spegel-org/spegel

    k3s配置

    需要将k3s更新到最近版本,且运行时使用内置containerd才行。

    server管理节点

    控制平面节点,需要添加--embedded-registry参数来开启

    --embedded-registry                        (experimental/components) Enable embedded distributed container registry; requires use of embedded containerd
    

    agent计算节点

    计算节点,需要添加--disable-default-registry-endpoint

    配置文件方式

    使用配置文件方式: /etc/rancher/k3s/config.yaml

    write-kubeconfig-mode: "0644"
    embedded-registry: true
    disable-default-registry-endpoint: true
    node-external-ip: 1.1.1.1
    

    配置文件方式或者上述参数方式任选一个即可

    registries.yaml 配置文件

    这个文件需要所有参与共享的节点都需要

    mirrors:
      docker.io:
      registry.k8s.io:
      gcr.io:
      quay.io:
      ghcr.io:
    

    私有仓库也是可以支持

    mirrors:
      ccr.ccs.tencentyun.com:
        endpoint:
          - https://ccr.ccs.tencentyun.com
    configs:
      ccr.ccs.tencentyun.com:
        auth:
          username: testuser
          password: password
    

    自 2024 年 3 月版本起提供通配符支持:v1.26.15+k3s1、v1.27.12+k3s1、v1.28.8+k3s1、v1.29.3+k3s1

    mirrors:
      "*":
    

    配置完成后验证

    kubectl get --raw /api/v1/nodes/<NODENAME>/proxy/metrics | grep -F 'spegel'
    

    --disable-default-registry-endpoint 禁用默认回退

    如果没有特殊需求,我觉得没必要禁用回退,除非你指定了回退。

    mirrors:
      docker.io:           # 没有回退,会尝试从节点拉取,如果节点都没有拉取失败
      registry.k8s.io:     # 没有回退,会尝试从节点拉取,如果节点都没有拉取失败
      mirror.example.com:  # 有个默认回退,会尝试从节点拉取,如果节点都没有,默认尝试从endpoint节点处拉取
        endpoint:
          - https://mirror.example.com
    

    具体还可以阅读官网文档: Default Endpoint Fallback

    其他问题

    • 安全性,你要保证你的环境可信,不然就一人中毒,全家中毒这种
    • 由于分布式注册表是只读模式,不支持push,但是你可以通过ctr相关操作将镜像加到都k8s.io命名空间就可以了, 例如ctr -n k8s.io image pull
    • 缓存问题,推荐每次都用新tag,而不是反复一个latest或者同一个tag来更新,因为同名tag存在后,就不会更新了


沪ICP备19023445号-2号
友情链接