다음을 통해 공유


AKS 클러스터의 메모리 포화 문제 해결

이 문서에서는 메모리 포화 문제를 해결하는 방법을 설명합니다. 메모리 포화는 컨테이너 호스트가 제공할 수 있는 것보다 하나 이상의 애플리케이션 또는 프로세스에 더 많은 메모리가 필요하거나 호스트가 사용 가능한 메모리를 소모하는 경우에 발생합니다.

필수 구성 요소

증상

다음 표에서는 메모리 포화의 일반적인 증상에 대해 간략하게 설명합니다.

증상 설명
예약할 수 없는 Pod 노드가 설정된 메모리 제한에 가까워지면 추가 Pod를 예약할 수 없습니다.
Pod 제거 노드에 메모리가 부족하면 kubelet은 Pod를 제거할 수 있습니다. 컨트롤 플레인은 리소스가 있는 다른 노드에서 제거된 Pod의 일정을 조정하려고 하지만 다른 노드에서 이러한 Pod를 실행하기에 충분한 메모리가 있다는 보장은 없습니다.
노드가 준비되지 않음 메모리 포화로 인해 kubeletcontainerd 가 응답하지 않아 결국 노드 준비 문제가 발생할 수 있습니다.
OOM(메모리 부족) 킬 Pod 제거가 노드 문제를 방지할 수 없는 경우 OOM 문제가 발생합니다.

문제 해결 검사 목록

메모리 포화도를 줄이려면 효과적인 모니터링 도구를 사용하고 모범 사례를 적용합니다.

1단계: 메모리 포화가 있는 노드 식별

다음 방법 중 하나를 사용하여 메모리 포화가 있는 노드를 식별합니다.

  • 웹 브라우저에서 Azure Portal AKS의 Container Insights 기능을 사용합니다.

  • 콘솔에서 Kubernetes 명령줄 도구(kubectl)를 사용합니다.

Container Insights는 컨테이너 워크로드 성능을 모니터링하는 AKS 내의 기능입니다. 자세한 내용은 AKS(Azure Kubernetes Service) 클러스터에 컨테이너 인사이트 사용을 참조하세요.

  1. Azure PortalKubernetes 서비스를 검색하여 선택합니다.

  2. Kubernetes 서비스 목록에서 클러스터의 이름을 선택합니다.

  3. 클러스터의 탐색 창에서 모니터링 제목을 찾은 다음 인사이트를 선택합니다.

  4. 적절한 시간 범위 값을 설정합니다.

  5. 노드 탭 선택합니다.

  6. 메트릭 목록에서 메모리 작업 집합(할당 가능에서 계산됨)을 선택합니다.

  7. 백분위수 선택기에서 샘플을 최대로 설정한 다음 최대 % 열 레이블을 두 번 선택합니다. 이 작업은 테이블 노드를 가장 높은 메모리에서 가장 낮은 메모리의 최대 백분율로 정렬합니다.

    Azure Portal AKS(Azure Kubernetes Service) 클러스터 내 Container Insights의 노드 보기 스크린샷

  8. 첫 번째 노드의 메모리 사용량이 가장 높기 때문에 해당 노드를 선택하여 노드에서 실행되는 Pod의 메모리 사용량을 조사합니다.

    Azure Portal AKS(Azure Kubernetes Service) 클러스터 내의 Container Insights에 있는 노드 보기 아래의 노드 컨테이너 스크린샷

    참고

    Pod에 대한 CPU 또는 메모리 사용량의 백분율은 컨테이너에 대해 지정된 CPU 요청을 기반으로 합니다. 노드에 대한 CPU 또는 메모리 사용량의 백분율을 나타내지 않습니다. 따라서 Pod에 대한 CPU 또는 메모리 사용량의 백분율이 아닌 실제 CPU 또는 메모리 사용량을 확인합니다.

이제 높은 메모리를 사용하는 Pod를 식별했으므로 Pod에서 실행되는 애플리케이션을 식별할 수 있습니다.

2단계: 메모리 포화를 방지하기 위한 모범 사례 검토

다음 표를 검토하여 메모리 포화를 방지하기 위한 모범 사례를 구현하는 방법을 알아봅니다.

모범 사례 설명
메모리 요청 및 제한 사용 Kubernetes는 컨테이너의 최소 메모리 크기(요청) 및 최대 메모리 크기(제한)를 지정하는 옵션을 제공합니다. Pod에 대한 제한을 구성하여 노드의 메모리 압력을 방지할 수 있습니다. 실행 중인 모든 Pod에 대한 집계 제한이 노드의 사용 가능한 메모리를 초과하지 않는지 확인합니다. 이 상황을 초과 커밋이라고 합니다. Kubernetes 스케줄러는 QoS( 서비스 품질 )를 통해 설정된 요청 및 제한에 따라 리소스를 할당합니다. 적절한 제한이 없으면 스케줄러는 단일 노드에서 너무 많은 Pod를 예약할 수 있습니다. 그러면 결국 노드가 다운될 수 있습니다. 또한 kubelet은 Pod를 제거하면서 메모리 사용량이 정의된 요청을 초과하는 Pod의 우선 순위를 지정합니다. 메모리 요청을 실제 사용량에 가깝게 설정하는 것이 좋습니다.
가로 Pod 자동 크기 조정기 사용 클러스터 크기를 조정하여 많은 Pod에서 요청의 균형을 조정하여 메모리 포화를 방지할 수 있습니다. 이 기술은 특정 노드의 메모리 공간을 줄일 수 있습니다.
선호도 방지 태그 사용 메모리가 의도적으로 바인딩되지 않은 시나리오의 경우 노드 선택기 및 선호도 또는 선호도 방지 태그를 사용하여 워크로드를 특정 노드로 격리할 수 있습니다. 선호도 방지 태그를 사용하면 다른 워크로드가 이러한 노드에서 Pod를 예약하지 못하도록 방지할 수 있습니다. 이렇게 하면 메모리 포화 문제가 줄어듭니다.
더 높은 SKU VM 선택 RAM(임의 액세스 메모리)이 더 많은 VM(가상 머신)은 높은 메모리 사용량을 처리하는 데 더 적합합니다. 이 옵션을 사용하려면 새 노드 풀을 만들고, 노드를 코돈하고(예약할 수 없도록) 기존 노드 풀을 드레이닝해야 합니다.
시스템 및 사용자 워크로드 격리 사용자 노드 풀에서 애플리케이션을 실행하는 것이 좋습니다. 이 구성을 사용하면 Kubernetes 관련 Pod를 시스템 노드 풀로 격리하고 클러스터 성능을 유지할 수 있습니다.

추가 정보

타사 정보 고지 사항

이 문서에 나와 있는 다른 공급업체 제품은 Microsoft와 무관한 회사에서 제조한 것입니다. Microsoft는 이들 제품의 성능이나 안정성에 관하여 명시적이든 묵시적이든 어떠한 보증도 하지 않습니다.

타사 연락처 고지

Microsoft는 이 항목에 대한 추가 정보를 찾는 데 도움이 되는 타사 연락처 정보를 제공합니다. 이 연락처 정보는 공지 없이 변경될 수 있습니다. Microsoft는 타사 연락처 정보의 정확성을 보장하지 않습니다.

도움을 요청하십시오.

질문이 있거나 도움이 필요한 경우 지원 요청을 생성하거나Azure 커뮤니티 지원에 문의하세요. Azure 피드백 커뮤니티에 제품 피드백을 제출할 수도 있습니다.