自2024 年1月起,分布式注册表镜像作为实验性功能提供:v1.26.13+k3s1、v1.27.10+k3s1、v1.28.6+k3s1、v1.29.1+k3s1
该功能基于开源项目spegel实现
一个无状态集群本地 OCI 注册表镜像
总结版: 通过公网只需要拉取一次后,共享给所有节点使用。集群中的每个节点都可以充当本地注册表镜像服务,允许节点在它们之间
共享
映像,节点已拉取的任何映像都可供群集中的任何其他节点拉取。
containerd
其他更多细节,可以阅读官方文档 spegel-org/spegel
需要将k3s更新到
最近版本
,且运行时使用内置containerd
才行。
控制平面节点,需要添加--embedded-registry
参数来开启
--embedded-registry (experimental/components) Enable embedded distributed container registry; requires use of embedded containerd
计算节点,需要添加--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
配置文件方式或者上述参数方式任选一个即可
这个文件需要所有参与共享的节点都需要
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'
如果没有特殊需求,我觉得没必要禁用回退,除非你指定了回退。
mirrors:
docker.io: # 没有回退,会尝试从节点拉取,如果节点都没有拉取失败
registry.k8s.io: # 没有回退,会尝试从节点拉取,如果节点都没有拉取失败
mirror.example.com: # 有个默认回退,会尝试从节点拉取,如果节点都没有,默认尝试从endpoint节点处拉取
endpoint:
- https://mirror.example.com
具体还可以阅读官网文档: Default Endpoint Fallback
一人中毒,全家中毒
这种ctr
相关操作将镜像加到都k8s.io
命名空间就可以了, 例如ctr -n k8s.io image pull