You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 07:22:42