Por que os pods exibem erros do tipo “ pull QPS exceeded ” durante o download de imagens?

Ao iniciar os pods, você pode observar erros indicando que as operações de download de imagens estão sendo limitadas, com mensagens como “ pull QPS exceeded ”.

Quando você implanta pods que precisam extrair imagens de contêineres, pode observar os seguintes sintomas:

  • Mensagens de erro contendo “ pull QPS exceeded ” durante a inicialização do pod
  • Tempos lentos de extração de imagens, especialmente ao extrair várias imagens grandes
  • Os pods estão demorando mais do que o esperado para chegar ao estado Running
  • Operações de extração de imagens que parecem estar sendo estranguladas ou com taxa limitada

A causa mais provável para a lentidão no carregamento de imagens, acompanhada de erros do tipo “ pull QPS exceeded ”, é que os nós de trabalho da sua VPC estejam atingindo o limite de largura de banda de E/S de disco.

Os nós de trabalho da VPC têm limites de largura de banda diferentes, dependendo de sua configuração:

  • Nós de trabalho padrão (sem armazenamento secundário): Limitado a 393 Mbps (49 MB/s) para operações de E/S de disco
  • Nós de trabalho com armazenamento secundário: Limites de largura de banda mais altos, dependendo da camada de armazenamento selecionada

Quando vários pods tentam extrair imagens de contêineres grandes simultaneamente:

  1. Cada operação de extração de imagem consome largura de banda de E/S do disco
  2. A demanda combinada de largura de banda pode saturar rapidamente o limite de 49 MB/s
  3. Quando o limite é atingido, as operações de extração de imagens ficam significativamente mais lentas
  4. Kubernetes pode relatar erros do tipo “ pull QPS exceeded ”, pois limita as operações

Para determinar se você está atingindo o limite de largura de banda do nó de trabalho da VPC, use os recursos de monitoramento do site IBM Cloud.

Verificar a largura de banda de E/S do disco

  1. Navegue até Observe → Metrics no console OpenShift do seu cluster.

  2. Use a seguinte consulta Prometheus para monitorar as taxas de leitura e gravação de disco:

    irate(node_disk_read_bytes_total[2m]) + irate(node_disk_written_bytes_total[2m])
    
  3. Interpretar os resultados:

    • Se algum dispositivo mostrar valores próximos ou em 49M (49 MB/s), você está atingindo o limite de largura de banda.
    • Valores sustentados nesse limite ou próximos a ele durante as operações de extração de imagens confirmam a saturação da largura de banda.
    • Vários picos nesse limite indicam restrições repetidas de largura de banda.

Verificar os tempos de extração de imagens

Você também pode verificar diretamente os tempos de extração da imagem:

oc get events -A | grep -E "Successfully pulled image"

Esse comando mostra o tempo que cada extração de imagem levou, ajudando você a identificar extrações lentas.

Resolva o problema

Solução primária: Usar pools de trabalho com armazenamento secundário

A solução recomendada é usar pools de trabalho com armazenamento secundário anexado. O armazenamento secundário com 10iops-tier fornece largura de banda de E/S dedicada que não compete com o disco de inicialização, resultando em uma taxa de transferência muito maior para extrações de imagens simultâneas e tempos de inicialização de pods mais rápidos.

  1. Crie um novo pool de trabalho com armazenamento secundário.

    • Quando você criar um novo pool de trabalho, selecione uma variante com armazenamento secundário.
    • Use uma das opções de armazenamento 10iops-tier para obter o melhor desempenho.
  2. Migre suas cargas de trabalho para o novo pool.

  3. Drenar e remover o pool de trabalho antigo após a conclusão da migração.

Considerações adicionais

Embora o upgrade para o armazenamento secundário seja a principal solução, você também pode:

Reduzir o tamanho das imagens
Use construções em vários estágios e minimize as camadas
Use o cache de imagens
Extraia previamente as imagens mais usadas para os nós de trabalho
Otimizar imagePullPolicy
Configure as especificações de seu pod para reduzir os pulls desnecessários:
  • Use imagePullPolicy: IfNotPresent para extrair imagens somente se elas ainda não existirem no nó.
  • Evite o site imagePullPolicy: Always, a menos que você precise especificamente obter a versão mais recente todas as vezes.
  • Para cargas de trabalho de produção, use tags de imagem específicas, não latest, combinadas com IfNotPresent para minimizar os pulls.
Configure o monitoramento e os alertas
Configure alertas para altas taxas de E/S de disco sustentadas que se aproximam de 49 MB/s.
  • Monitore os tempos de extração de imagens como parte das métricas de implantação.
  • Acompanhe os tempos de inicialização do pod para identificar a degradação do desempenho.