Azure/EKS集群中ImagePullPolicy: Always未生效问题及性能测试咨询
Azure Kubernetes集群镜像拉取性能基准测试问题解答
测试背景
我正在针对Azure Kubernetes集群(AKS)进行镜像拉取性能基准测试,操作步骤如下:
- 创建Azure Kubernetes集群
- 创建Azure容器注册表(ACR)并推送一个约1GB的目标Docker镜像
- 创建100个在该K8s集群上并行运行的Job,使用已推送至ACR的镜像
- 在Job的YAML中设置
imagePullPolicy: Always,但观察到每个节点仅拉取一次镜像,后续该节点上调度的Job直接使用本地缓存,不会再次从ACR拉取。
测试用Job YAML文件
apiVersion: batch/v1 kind: Job metadata: name: image-pull-perf namespace: "test" spec: template: spec: imagePullSecrets: - name: regcred containers: - name: spark image: test.azurecr.io/data/spark_2.4:v1 imagePullPolicy: Always restartPolicy: Never backoffLimit: 4 completions: 100 parallelism: 100 completionMode: "Indexed" ttlSecondsAfterFinished: 10
问题解答
1. 为何设置imagePullPolicy为Always后,镜像并未始终从仓库拉取?
imagePullPolicy: Always的逻辑是每次启动容器前都会向镜像仓库发起请求,检查镜像的哈希摘要是否与本地缓存一致。如果仓库中的镜像哈希和本地缓存完全匹配,容器运行时(如containerd、Docker)会直接复用本地镜像,不会重新下载镜像层——这是容器运行时的优化逻辑,避免重复下载相同内容。只有当仓库中的镜像哈希更新(比如同标签指向了新镜像),才会拉取差异层或完整镜像。
你看到的每个节点只拉取一次,是因为同一节点上的Job使用的是同标签、同哈希的镜像,容器运行时校验后确认本地缓存有效,就跳过了重复下载。
2. 若Docker镜像的哈希值未发生变化,设置imagePullPolicy为Always时,会尝试重新拉取还是使用Docker缓存?
会发起校验请求,但不会重新下载镜像。容器运行时会向仓库查询该镜像标签对应的最新哈希,对比本地缓存的哈希:
- 如果哈希一致:直接使用本地缓存,不会下载任何镜像层
- 如果哈希不一致:拉取差异层或完整镜像(取决于镜像分层结构)
3. 是否可以禁用节点级别的Docker镜像缓存?
可以,但不建议在生产环境这么做,会大幅增加镜像拉取时间和带宽消耗。具体方式分两种:
- 容器运行时配置:比如containerd可以修改配置文件禁用镜像缓存;Docker可以在启动时添加
--storage-driver=overlay2 --no-cache参数,但需要重启节点上的容器运行时服务,且对所有容器生效。 - 临时清理缓存:在节点上执行
docker system prune -af或crictl rmi --all强制清理所有本地镜像缓存,但这是一次性操作,后续拉取的镜像仍会被缓存。
4. 若因节点级缓存导致Always拉取策略未生效,如何让每个Job运行时都始终拉取镜像?
有几种可行方案:
- 使用唯一镜像标签:每次测试时给镜像打唯一标签(比如加上时间戳
v1-$(date +%Y%m%d%H%M%S)),这样每个Job使用的镜像标签对应不同的哈希,容器运行时会每次从仓库拉取新镜像。这是最推荐的方案,无需修改节点配置或赋予特权,测试结果也更准确。 - 在Job中添加清理缓存的初始化容器:为每个Job添加一个初始化容器,在节点上清理目标镜像的缓存(比如执行
crictl rmi test.azurecr.io/data/spark_2.4:v1),但需要给Pod赋予节点上的特权权限(比如privileged: true),且会影响节点上其他容器的镜像使用。 - 使用Ephemeral Containers临时容器:不过这种方式更适合调试,不太适合批量Job场景。
5. 针对Azure/AWS容器注册表在Kubernetes集群(AKS或EKS)上的镜像拉取/推送性能基准测试,有哪些方法建议?
- 控制变量测试:
- 固定镜像大小(比如1GB、5GB),测试不同并行度下的拉取时间
- 测试不同节点类型(低带宽 vs 高带宽节点)的拉取性能
- 对比私有注册表(ACR/ECR)和公开注册表(Docker Hub)的拉取差异
- 使用专业测试工具:
- kube-bench:针对Kubernetes组件做性能测试,包括镜像拉取环节
- hey/vegeta:模拟大量并发的镜像拉取请求,测试注册表的吞吐量
- Prometheus + Grafana:监控节点的镜像拉取耗时、注册表的API请求延迟、节点带宽使用率等指标
- 注册表优化测试:
- 测试ACR的异地复制功能对跨区域拉取性能的影响
- 测试ECR的缓存策略或ACR的**内容分发网络(CDN)**加速效果
- 对比镜像分层推送/拉取 vs 完整镜像推送/拉取的性能差异
- Kubernetes调度策略优化:
- 测试不同调度策略(分散调度 vs 集中调度)对镜像拉取总耗时的影响
- 测试使用
ImagePullSecrets的不同配置(ServiceAccount关联Secret vs 直接在Pod中配置)的性能差异
内容的提问来源于stack exchange,提问作者pbajpai
相关产品推荐
相关产品推荐

