이미지를 가져올 때 포드에서 ‘ pull QPS exceeded ’ 오류가 발생하는 이유는 무엇인가요?

포드가 시작될 때, “ pull QPS exceeded ”와 같은 메시지와 함께 이미지 가져오기 작업이 제한되고 있음을 나타내는 오류가 표시될 수 있습니다.

컨테이너 이미지를 가져와야 하는 파드를 배포할 때 다음과 같은 증상이 나타날 수 있습니다:

  • 포드 시작 시 ‘ pull QPS exceeded ’가 포함된 오류 메시지
  • 특히 여러 개의 큰 이미지를 가져올 때 느린 이미지 가져오기 시간
  • 파드가 Running 상태에 도달하는 데 예상보다 오래 걸립니다
  • 이미지 풀 작업이 스로틀링되거나 속도가 제한되는 것처럼 보이는 경우

pull QPS exceeded 오류와 함께 이미지 불러오기 속도가 느려지는 가장 유력한 원인은 VPC 워커 노드가 디스크 I/O 대역폭 한계에 도달했기 때문입니다.

VPC 워커 노드는 구성에 따라 대역폭 제한이 다릅니다:

  • 표준 워커 노드(보조 스토리지 제외): 디스크 I/O 작업 시 393Mbps(초당 49MB )로 제한됨
  • 보조 스토리지가 있는 워커 노드: 선택한 스토리지 계층에 따라 대역폭 제한이 더 높음

여러 개의 파드가 동시에 대용량 컨테이너 이미지를 가져오려고 시도하는 경우:

  1. 각 이미지 풀 작업은 디스크 I/O 대역폭을 소비합니다
  2. 결합된 대역폭 수요로 인해 초당 49MB 제한이 빠르게 포화될 수 있습니다
  3. 한도에 도달하면 이미지 풀 작업 속도가 크게 느려집니다
  4. Kubernetes 작업 속도를 조절하기 때문에 ‘ pull QPS exceeded ’ 오류가 발생할 수 있습니다

VPC 워커 노드 대역폭 제한에 도달했는지 확인하려면 IBM Cloud 모니터링 기능을 사용하세요.

디스크 I/O 대역폭 확인

  1. 클러스터의 OpenShift 콘솔에서 관찰 → 메트릭으로 이동합니다.

  2. 다음 Prometheus 쿼리를 사용하여 디스크 읽기 및 쓰기 속도를 모니터링하세요:

    irate(node_disk_read_bytes_total[2m]) + irate(node_disk_written_bytes_total[2m])
    
  3. 결과를 해석합니다:

    • 49M (초당 49MB )에 근접하거나 이에 근접하는 값을 표시하는 디바이스가 있다면 대역폭 제한에 도달한 것입니다.
    • 이미지 풀 작업 중 이 한계치 또는 그 근처에서 값이 지속되면 대역폭 포화 상태를 확인합니다.
    • 이 한도까지 여러 번 급증하면 대역폭 제약이 반복된다는 의미입니다.

이미지 풀 시간 확인

이미지 가져오기 시간을 직접 확인할 수도 있습니다:

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

이 명령은 각 이미지 풀에 걸린 시간을 표시하여 느린 풀을 식별하는 데 도움이 됩니다.

문제 해결

기본 솔루션: 보조 스토리지와 함께 워커 풀 사용

권장되는 솔루션은 보조 스토리지가 연결된 워커 풀을 사용하는 것입니다. 10iops-tier 을 사용하는 보조 스토리지는 부팅 디스크와 경쟁하지 않는 전용 I/O 대역폭을 제공하므로 동시 이미지 풀의 처리량이 훨씬 증가하고 파드 시작 시간이 빨라집니다.

  1. 보조 스토리지로 새 작업자 풀을 만듭니다.

    • 새 워커 풀을 만들 때 보조 저장소가 있는 플레이버를 선택합니다.
    • 최적의 성능을 위해 10iops-tier 스토리지 옵션 중 하나를 사용하세요.
  2. 워크로드 마이그레이션 를 새 풀에 추가합니다.

  3. 마이그레이션이 완료된 후 기존 작업자 풀을 비우고 제거합니다.

추가 고려사항

보조 스토리지로 업그레이드하는 것이 기본 솔루션이지만, 다른 방법을 사용할 수도 있습니다:

이미지 크기 줄이기
다단계 빌드 사용 및 레이어 최소화
이미지 캐싱 사용
자주 사용하는 이미지를 워커 노드에 미리 풀링하기
최적화 imagePullPolicy
불필요한 풀을 줄이도록 포드 사양을 구성하세요:
  • 이미지가 노드에 아직 존재하지 않는 경우에만 imagePullPolicy: IfNotPresent 을 사용하여 이미지를 가져옵니다.
  • 특별히 매번 최신 버전을 가져와야 하는 경우가 아니라면 imagePullPolicy: Always 을 사용하지 마세요.
  • 프로덕션 워크로드의 경우 IfNotPresent 과 결합된 latest 이 아닌 특정 이미지 태그를 사용하여 풀을 최소화하세요.
모니터링 및 알림 설정
초당 49MB에 육박하는 높은 디스크 I/O 속도가 지속될 경우 알림을 설정하세요.
  • 배포 지표의 일부로 이미지 풀 시간을 모니터링하세요.
  • 포드 시작 시간을 추적하여 성능 저하를 파악하세요.