简介
在 Kubernetes 集群中,频繁发布、扩容服务时,节点通常会直接从远程镜像仓库拉取镜像,这不仅加重了镜像仓库的压力,还容易受到如 DockerHub 等公共仓库的速率限制,导致镜像拉取变慢甚至失败。Spegel 正是为了解决这些问题,通过在本地节点缓存镜像,加速镜像分发,提升集群部署效率。
但是Spegel 目前仅支持 Containerd,如你使用的是 Docker,可以忽略后续内容。
原理
Spegel 通过在每个 Kubernetes 节点上部署本地镜像缓存代理,拦截并缓存节点拉取的镜像。当节点需要拉取镜像时,优先从本地 Spegel 缓存获取;如果本地没有,则从远程仓库拉取并缓存到本地。这样,后续节点或同一节点再次拉取同一镜像时,就可以直接从本地缓存获取,大幅提升拉取速度,减少对外部仓库的依赖和带宽消耗。
Spegel 依赖 Containerd 的镜像拉取机制,通过配置 Containerd 的 Registry Mirror,将镜像请求重定向到本地 Spegel 服务,实现透明加速和缓存。
修改containerd配置
Spegel 依赖于 containerd 的本地镜像层缓存,需确保 discard_unpacked_layers
配置为 false。编辑 /etc/containerd/config.toml
,找到如下字段并修改:
[plugins."io.containerd.grpc.v1.cri".containerd]
discard_unpacked_layers = false
如需针对不同 K8s 发行版的详细配置方法,可参考官方文档
https://spegel.dev/docs/getting-started/
下面是我在eks上的脚本
grep "discard_unpacked_layers" /etc/containerd/config.toml && \
sudo cp /etc/containerd/config.toml /etc/containerd/config.toml.bak && \
sudo sed -i 's/^\(\s*\)discard_unpacked_layers\s*=\s*true/\1discard_unpacked_layers = false/' /etc/containerd/config.toml && \
grep "discard_unpacked_layers" /etc/containerd/config.toml && \
sudo systemctl restart containerd
如果上面修改失败,那么下面部署的时候Spegel容器不会启动成功
部署
Spegel 的部署非常简单,推荐使用 Helm 或 Kustomize 进行一键安装。以下以 Kustomization 方式为例,直接贴出 kustomization.yaml 配置:
helmCharts:
- name: spegel
repo: oci://ghcr.io/spegel-org/helm-charts
releaseName: spegel
namespace: spegel
valuesFile: values.yaml
values.yaml
默认可以不用修改任何东西
https://github.com/spegel-org/spegel/blob/main/charts/spegel/values.yaml
之后使用argocd部署就好了
测试
你可以创建一个pod,然后观察Spegel的日志,当缓存不在节点上时候会提示
"err":"mirror with image component sha256:5fcf7ef29eb9819794924a97aba79c77c8810292cad53a90cbda7be1bd892d33 could not be found"
然后
"OCI event","key":"sha256:5fcf7ef29eb9819794924a97aba79c77c8810292cad53a90cbda7be1bd892d33","type":"CREATE"
当缓存在节点上会提示
"status":200,"method":"GET","latency":"107.376902ms","ip":"x.x.x.x","handler":"blob"
欢迎关注我的博客www.bboy.app
Have Fun