k3s新特性分布式注册表镜像,加速镜像拉取
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存在后,就不会更新了