Kubernetes Pod가 CPU 1개로 최대치를 초과하고 있습니다.

Kubernetes Pod가 CPU 1개로 최대치를 초과하고 있습니다.

GKE Kubernetes 클러스터와 배포가 있습니다.

배포 시 리소스 스탠자를 다음과 같이 설정했습니다.

resources.requests.memory: 4G
resources.requests.cpu: 2
resources.limits.memory: 4G

CPU 제한이 설정되지 않았습니다.

Pod(Django 웹 앱)를 배포하고 부하 테스트를 실시합니다. 포화되면 포드 CPU 사용량은 최대 1CPU까지 올라가지만 본질적으로 1CPU를 초과하는 것을 거부합니다.

여기서 문제를 해결해야 할 아이디어가 있습니까?

답변1

이 글은 열어두었으니 닫도록 하겠습니다.

내 특별한 경우에는 실제로 병목 현상이 데이터베이스의 K8S 포드 업스트림에서 발생한 것으로 나타났습니다. Postgres 인스턴스는 충분히 크지 않았고 CPU 사용량이 100%로 정점에 도달하여 다운스트림 시간 초과가 발생했습니다.

Pod의 CPU 레벨링은 단순히 Pod가 업스트림의 응답을 기다리고 있었기 때문에 발생한 것으로 의심되지만 확실하지는 않습니다. 그리고 다른 할 일이 없었기 때문에 CPU 사용량을 1개 정도 늘릴 수 없었습니다.

또한 Django 인스턴스는 단일 스레드이고 UWSGI와 동일한 "하위 스레드" 모델을 갖지 않는 Django 채널과 ASGI 비동기 모델을 사용합니다. 또 다른 이유(혹은 실제 이유)는 Pod의 CPU 사용량이 1CPU에서 최대치를 초과하는 것입니다.

그래서 저는 이것을 확장하는 올바른 방법이 다음과 같다고 확신합니다.

  • Postgres를 수직으로 확장
  • 기본 포드 수 늘리기
  • 자동 확장 처리(HPA) 임계값을 낮추어 새 포드를 확장하고 추가하세요.

편집: 추가 정보

이 문제는 앱 자체가 디자인된 방식과도 관련이 있습니다. 우리는 Django Channels 비동기 Python을 사용하고 Daphne ASGI 컨테이너에서 htat를 실행하려고 합니다. 그러나 모든 앱이 비동기식인 것은 아니며 이는 분명히 나쁜 것입니다. 나는 이 비동기 대 동기화 애플리케이션 문제와 그에 따른 교착 상태에 대해 많은 연구를 수행했으며 개발 팀에서 앱을 재설계하도록 하는 동안 배포도 재설계했습니다.

  • 배포에 uWSGI 서버 추가
  • 두 개의 배포/Pod에 코드베이스 배포
    • 하나에는 ASGI 포드가 있습니다.
    • 하나에는 uWSGI Pod가 있습니다.
  • 모든 ASGI 엔드포인트(하나만 있음)를 수신 경로 규칙의 ASGI Pod로 라우팅합니다.
  • 모든 uWSGI 엔드포인트를 수신 경로 규칙의 동기화 포드로 라우팅합니다.

이것은 작동합니다. 그러나 아직 전체 부하 테스트를 완료하지 않았습니다.

관련 정보