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

K8s创建Deployment时SuccessfulMountVolume后至Pulling前等待时间过长

排查K8s集群Redis Deployment副本创建缓慢问题

根据你描述的场景——32台虚拟机组成的K8s集群,创建3个及以上副本的redis-cache Deployment时,首个Pod秒级进入RUNNING,但其余副本在Schedule和SuccessfulMountVolume完成后、Pulling阶段前卡了超1分钟——这种情况在规模稍大的集群里并不少见,我来帮你拆解可能的原因和排查方案:

核心场景回顾

环境:32节点K8s集群
症状:多副本Deployment中,首个Pod创建快,后续副本卡在调度完成、卷挂载成功后,镜像拉取前长时间等待

可能的根因分析

  • 容器运行时镜像拉取并发限制:默认情况下,containerd、Docker这类容器运行时会限制同时拉取镜像的数量(比如containerd默认是3个并发),首个Pod占用了拉取资源,后续副本只能排队等待。
  • 节点资源竞争:虽然Pod已经调度到节点,但节点的CPU、内存或者磁盘IO被首个Pod或其他现有负载占满,导致容器运行时无法启动镜像拉取进程。
  • Kubelet调度后处理瓶颈:大规模集群中,Kubelet的事件处理队列可能积压,特别是当多个Pod被同时调度到不同节点时,Kubelet需要处理的初始化任务过多,导致延迟。
  • 存储卷挂载后的隐性开销:如果使用了PersistentVolume,卷挂载完成后可能存在元数据同步、权限配置等隐性操作,这些操作在单节点多Pod场景下可能出现排队。

分步排查操作

  1. 检查容器运行时并发配置
    以containerd为例,查看当前的镜像拉取并发数:

    crictl info | grep -A5 max_concurrent_downloads
    

    如果结果显示max_concurrent_downloads: 3,那大概率是并发数不够导致的排队。

  2. 查看节点资源瓶颈
    登录到等待Pod所在的节点,用以下命令检查资源使用:

    # 查看CPU、内存占用
    top
    # 查看磁盘IO状态(重点看镜像存储目录,比如/var/lib/containerd)
    iostat -x 1 5
    # 查看内存交换和系统负载
    vmstat 1 5
    

    如果发现CPU使用率接近100%,或者磁盘IO Wait很高,那就是资源竞争导致的延迟。

  3. 分析Kubelet日志
    实时查看Kubelet的日志,找调度完成到镜像拉取之间的异常:

    journalctl -u kubelet -f | grep -E "(SuccessfulMountVolume|Pulling|Failed)"
    

    重点看有没有资源不足、超时之类的报错,比如insufficient resources或者timeout waiting for container runtime。

  4. 手动验证镜像拉取速度
    在等待Pod的节点上手动拉取Redis镜像,确认单拉取的耗时:

    crictl pull redis:your-image-tag
    

    如果手动拉取很快,那基本可以排除镜像本身的问题,锁定在并发或资源竞争上。

针对性解决方案

  1. 调大容器运行时镜像拉取并发数
    修改containerd的配置文件/etc/containerd/config.toml,找到max_concurrent_downloads参数,调整为8-10(根据节点资源情况调整):

    [plugins."io.containerd.grpc.v1.cri".pull]
      max_concurrent_downloads = 8
    

    重启containerd生效:

    systemctl restart containerd
    
  2. 分散Pod调度,避免单节点竞争
    给Deployment添加Pod反亲和规则,让Redis副本尽量分散到不同节点:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: redis-cache
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: redis-cache
      template:
        metadata:
          labels:
            app: redis-cache
        spec:
          affinity:
            podAntiAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
              - weight: 100
                podAffinityTerm:
                  labelSelector:
                    matchExpressions:
                    - key: app
                      operator: In
                      values:
                      - redis-cache
                  topologyKey: kubernetes.io/hostname
          containers:
          - name: redis
            image: redis:your-image-tag
    
  3. 预热镜像到所有节点
    提前在集群所有节点上拉取Redis镜像,避免Pod创建时的拉取等待:
    可以用Kubernetes Job批量执行,或者用Shell脚本批量在节点上运行:

    crictl pull redis:your-image-tag
    
  4. 优化Kubelet配置
    如果是Kubelet处理能力不足,可以调整以下参数(修改kubelet配置文件后重启kubelet):

    • 关闭镜像拉取序列化:--serialize-image-pulls=false(允许同时拉多个镜像,注意节点资源)
    • 适当调大--max-pods(如果节点资源足够,允许节点运行更多Pod)

内容的提问来源于stack exchange,提问作者Yong Li

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:12:13