背景
无论是使用共有的镜像仓库,或者自建的,拉取镜像都是非常重要的一环。一般企业都是使用自建的私有仓库,且不联网,保证安全性。
虽然镜像仓库保证了高可用,但是如果:
- 集群节点数很多,某个应用大规模的迁移或者紧急扩容,然后这个镜像文件又很大,容器的镜像拉取策略imagePullPolicy又是always,这批节点都去拉取镜像。
- 批处理作业需要启动很多pod,这些pod都来拉取镜像。
这两种情况对镜像仓库的压力都是很大的,很可能会导致镜像仓库崩掉。镜像拉取失败了,k8s还有重试策略,恢复起来也很困难。
所以能不能采用镜像缓存的方式来减少镜像仓库的压力,就可以使用Dragonfly。
介绍
项目地址:https://github.com/dragonflyoss/Dragonfly2
官方文档:https://d7y.io/zh/docs/
Dragonfly 是一款基于 P2P 的智能镜像和文件分发工具。它旨在提高文件传输的效率和速率,最大限度地利用网络带宽,尤其是在分发大量数据时,例如应用分发、缓存分发、日志分发和镜像分发。
特点
- 基于 P2P 的文件分发
- 高性能
- 非侵入式支持所有类型的容器技术
- 自动隔离异常
- 机器级别的限速
- 对文件源无压力
- 被动式 CDN
- 支持标准 HTTP 头文件
- 高度一致性
- 有效的 Registry 鉴权并发控制
- 磁盘保护和高效IO
- 简单易用
镜像下载流程
- dfget proxy:也称为 dfdaemon,会拦截来自 docker pull 或 docker push 的 HTTP 请求,然后使用 dfget 来处理请求。
- Registry:镜像仓库。
- cluster manager:协调组件,整个系统的控制中心。
- docker pull 被 dfget proxy 拦截,然后,由 dfget proxy 向 Cluster-Manager 发送调度请求。
- Cluster-Manager 在收到请求后会检查对应的下载文件是否已经被缓存到本地,如果没有被缓存,则会从 Registry 中下载对应的文件。
- 如果已经缓存了,那么直接生成分块任务,dfget proxy解析任务,并从其他peer下载block数据。
- 当某个 Layer 的所有分块下载完成后,一个 Layer 也就下载完毕了,同样,当所有的 Layer 下载完成后,整个镜像也就下载完成了。
安装
helm repo add dragonfly https://dragonflyoss.github.io/helm-charts/
helm install --create-namespace --namespace dragonfly-system dragonfly dragonfly/dragonfly
我这里安装失败了,包下载不了。根据报错中的下载链接,浏览器下载再上传到服务器上。
# 修改value.yaml
containerRuntime:
containerd:
enable: true
# 安装
k create ns dragonfly-system
helm install dragonfly dragonfly/ -n dragonfly-system
# 查看pod
k get po -n dragonfly-system
# 我这里node1的dfdaemon报错了,未解决。。。
k logs -f dragonfly-dfdaemon-8fwfv -n dragonfly-system
Error: can not find available addresses