在Kubernetes中使用DinD时实现容器镜像缓存的可行方案问询
K8s CI动态代理镜像缓存方案选型问题
背景
我们使用自建K8s集群运行CI动态代理,部分工作负载在Docker容器中执行,以此确保开发机与CI系统的构建流程一致。但每次构建前需拉取合计10GB的镜像,导致从Pod启动到构建开始的耗时较长,因此希望引入镜像缓存来缩短该时长。
现有方案分析
1. 多DinD方案
- 每个Pod包含一个DinD sidecar容器和一个CI代理容器
- DinD对接工作节点上的containerd,CI代理通过设置
DOCKER_HOST=localhost访问DinD /var/lib/docker挂载为emptyDir: {},每个新Pod均从零开始,无镜像缓存,需重复拉取镜像- 不足:无法利用缓存,耗时问题未得到解决
2. 单DinD方案
- 运行单个DinD容器的Pod,多个CI代理Pod通过其Service进行连接
- DinD的存储目录
/var/lib/docker采用hostPath类型的PV和PVC挂载到节点磁盘,实现镜像缓存,大幅缩短启动耗时 - 不足:单Daemon无法支持多个CI代理启动同名容器,容器隔离性不满足需求
核心需求
需找到满足以下两个条件的方案:
- 每个CI代理Pod具备镜像缓存能力
- 同名容器可实现运行隔离
备选方案的顾虑
我们考虑过挂载各工作节点的/run/containerd/containerd.sock,利用现有镜像缓存,并通过kube-fledged预拉取所需镜像,但担心CI代理Pod中的误操作(如执行docker prune)会干扰K8s平台的containerd镜像,进而破坏集群。
内容的提问来源于stack exchange,提问作者Jakub S
相关产品推荐
相关产品推荐

