使用 Dragonfly 作为 ACR 的 P2P 缓存节点

解读

在国内云原生落地场景中,阿里云容器镜像服务 ACR 的公网拉取带宽费用高、跨地域延迟大,而 Dragonfly(CNCF 毕业级 P2P 分发项目) 可以把镜像层切片后通过内网节点互相共享,实现“就近缓存、多点并发、回源收敛”。
面试官问“怎么用 Dragonfly 给 ACR 做 P2P 缓存”,核心想验证三件事:

  1. 你是否理解 Docker 镜像拉取流程Registry 协议
  2. 能否把 Dragonfly 的 SuperNode/Manager + Dfget + Peer 角色与 ACR 域名、VPC 网络、镜像加速域名串成一条链路;
  3. 是否具备 镜像预热、命中率调优、回源降级、安全加固 的落地经验。
    回答要体现“可灰度、可观测、可回滚”的国内生产级要求,否则会被追问“如果 P2P 失败怎么办”。

知识点

  • Dragonfly 2 架构:Manager 做调度,Scheduler 选最优 Parent,Dfget 作为 Peer 代理 Docker/containerd 的 pull 请求;采用 Piece 任务分片 + 多线程下载 + 本地磁盘缓存
  • ACR 访问入口:标准版/企业版提供 专用网络域名.vpc.)和 加速域名.acr.),需配置 VPC 内网 DNS 劫持containerd registry mirror 把 pull 请求指向 Dragonfly。
  • 镜像层可复用性:利用 OCI Distribution Specmountredirect,Dragonfly 只缓存 blob 层(application/vnd.docker.image.rootfs.diff.tar.gzip),而 manifest 仍回源 ACR,保证 签名与元数据一致性
  • 预热策略:通过 ACR 事件触发(EventBridge)CI 阶段调用 Dragonfly HTTP API 提前把业务镜像推送到 P2P 网络,避免首次冷启动 miss。
  • 安全合规:Dragonfly Manager 与 ACR 之间使用 STS 临时令牌 + 最小化 RAM 角色;Peer 节点强制 只读缓存目录 + non-root UID + SELinux policy;传输层开启 mTLS 并同步 系统时钟(Chrony) 防止重放。
  • 观测与兜底:在 Prometheus + Grafana 中采集 dragonfly_peer_task_totaldfget_download_duration_secondspeer_cache_hit_ratio;当 P2P 失败率 >5% 或回源带宽突增,自动 降级到直连 ACR(通过修改 containerd config.tomlserver 字段权重)。

答案

生产级落地分五步:

  1. 网络与 DNS 准备
    在 ACK 集群 VPC 内部署 Dragonfly Helm Chart,把 Manager 和 Scheduler 固定在 弹性网卡 ENI 主节点 上,防止漂移。
    利用 PrivateZone 内网 DNS 劫持,将 *.acr.* 域名解析到 Dragonfly Peer 的 65001 端口(dfget proxy),实现 对业务 Pod 透明

  2. Containerd 镜像代理配置
    编辑 /etc/containerd/config.tomlplugins."io.containerd.grpc.v1.cri".registry.mirrors

    [plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.cn-hangzhou.aliyuncs.com"]
      endpoint = ["http://127.0.0.1:65001"]
    

    重启 containerd 后,kubelet 发起的所有镜像拉取先走本地 dfget,再由 dfget 向 SuperNode 查询 Piece。

  3. 缓存命中与预热
    GitLab CI 阶段构建完镜像并推送到 ACR 后,调用 curl -X POST http://dragonfly-manager:8080/api/v1/preheat 传入 镜像全称 + tag,Manager 会生成 Preheat Task,调度各节点提前下载并缓存 blob 层命中率可稳定在 90% 以上

  4. 安全加固

    • Peer 节点运行 non-root UID 65534,缓存目录挂载 nodev、nosuid、noexec
    • 通过 RAM 角色 + OIDC 让 Manager 临时获取 ACR 的 只读拉取权限不落地长期 AK/SK
    • 开启 dfget 的 --cacert 与 --cert 参数mTLS 双向校验,防止中间人伪造 Piece。
  5. 观测与回滚
    阿里云 Prometheus 实例 中配置 dragonfly job,Grafana 大盘 核心看 cacheHitRatiopeerTaskFailureRate
    连续 3 分钟命中率 <80%回源带宽 >100 Mbps 时,Argo Rollout 自动修改 containerd 的 mirror endpoint 权重,秒级回退到直连 ACR,保证业务扩容不受影响。

通过以上步骤,镜像拉取时间从平均 90s 降到 12s公网出流量费用下降 75%,且 零业务侵入、可灰度、可回滚,满足国内金融级客户合规要求。

拓展思考

  1. 混合云场景:如果线下 IDC 也想复用同一套 Dragonfly,可通过 智能接入网关 SAG 把 IDC 与阿里云 VPC 打通,Scheduler 基于 RTT 动态选择 Parent,但需额外做 跨域带宽限速QoS 标记,防止 P2P 打满专线。
  2. 镜像加密:当业务要求 OCI 镜像加密(CNCF 项目 ocicrypt) 时,Dragonfly 只能缓存加密后的 blob解密过程仍在 containerd 内部,此时需评估 缓存命中率与解密 CPU 开销 的平衡。
  3. Serverless 节点:对于 ASK/ECI 这类 Serverless 容器节点不可控,无法部署 Peer,可改用 Dragonfly 的“远程 Peer”模式,把 ECS 节点作为固定缓存池,通过 VPC 内网负载均衡 暴露 65001,ECI 通过 registry mirror 指向该 LB,实现 Serverless 场景下的 P2P 加速