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

本文最后更新于 156 天前, 如有失效请评论区留言.

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存在后,就不会更新了

Sponsor

Like this article? $1 reward

Comments

linjie ·v1 陕西西安 Reply

我配置了,/etc/rancher/k3s/registries.yaml 私有仓库,也重写了,但是crictl info 的时候我看镜像都是空的,版本是v1.29.5+k3s1

ysicing 👨‍💻 ·v1 Reply

@linjie 可以看下这个 `/var/lib/rancher/k3s/agent/etc/containerd/config.toml` 文件。另外看看日志`/var/lib/rancher/k3s/agent/containerd/containerd.log`, 方便的话脱敏发现,或者加下我微信ysicing

linjie ·v1 陕西西安 Reply

你好,可以私信你吗

ysicing ·v1 北京 Reply

@linjie 可以的,邮箱或者tg或其他途径都可以

linjie ·v1 陕西西安 Reply

你好,配置了registries.yaml 但是拉取镜像老提示错误,k3s 咋解决的

ysicing 👨‍💻 ·v1 Reply

@linjie 具体啥报错,可以贴下配置🤔

刘郎 ·v1 IP未知 Reply

过来看看 顺便学习学习