노드의 CPU 관리 정책 제어하기

노드의 CPU 관리 정책 제어하기 (Control CPU Management Policies on the Node)

기능 상태: Kubernetes v1.26부터 Stable.

쿠버네티스는 파드가 노드에서 실행되는 방식의 많은 측면을 사용자로부터 추상화해요. 이것은 의도적이에요. 하지만 일부 워크로드는 허용 가능한 운영을 위해 지연 시간(latency) 및/또는 성능 측면에서 더 강한 보증을 요구해요. kubelet은 명시적인 배치 지시 없이 추상화를 유지하면서 더 복잡한 워크로드 배치 정책을 활성화하는 방법을 제공해요.

리소스 관리에 대한 자세한 내용은 파드와 컨테이너를 위한 리소스 관리 문서를 참고하세요. kubelet이 리소스 관리를 구현하는 방법에 대한 자세한 내용은 노드 리소스 매니저 문서를 참고하세요.

출처: 문서

본문

시작하기 전에 (Before you begin)

쿠버네티스 클러스터가 필요하고, kubectl 명령줄 도구가 클러스터와 통신하도록 구성돼 있어야 해요. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 두 개 이상 있는 클러스터에서 실행하는 것을 권장해요. 아직 클러스터가 없다면 minikube로 만들거나 다음 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있어요.

  • iximiuz Labs
  • Killercoda
  • KodeKloud

쿠버네티스 서버가 최소 v1.26 버전이어야 해요. 버전을 확인하려면 kubectl version을 입력하세요. 더 오래된 버전의 쿠버네티스를 실행 중이라면 실제 실행 중인 버전의 문서를 참고하세요.

CPU 관리 정책 구성하기 (Configuring CPU management policies)

기본적으로 kubelet은 CFS quota를 사용해 파드 CPU 제한을 강제해요. 노드가 CPU 집약적인 파드를 많이 실행할 때, 워크로드는 파드가 조절(throttled)되는지와 스케줄링 시점에 어떤 CPU 코어가 사용 가능한지에 따라 다른 CPU 코어로 이동할 수 있어요. 많은 워크로드는 이 이동에 민감하지 않아서 개입 없이 잘 동작해요.

하지만 CPU 캐시 어피니티와 스케줄링 지연 시간이 워크로드 성능에 크게 영향을 주는 워크로드에서는, kubelet이 노드에서 일부 배치 선호도를 결정하는 대체 CPU 관리 정책을 허용해요.

Windows 지원 (Windows Support)

기능 상태: Kubernetes v1.32부터 Alpha; 기본적으로 비활성화.

이 기능을 사용하려면 여러분(또는 클러스터 관리자)이 클러스터의 모든 관련 컴포넌트에 대해 WindowsCPUAndMemoryAffinity 기능 게이트를 활성화해야 해요. 기능 게이트 활성화/비활성화에 대한 자세한 내용은 참고하세요.

CPU Manager 지원은 WindowsCPUAndMemoryAffinity 기능 게이트를 사용해 Windows에서 활성화할 수 있고, 컨테이너 런타임의 지원이 필요해요. Windows에서는 NoneBestEffort 정책만 지원돼요.

CPU 관리 정책 (CPU management policies)

CPU Manager는 파드의 리소스 요청을 추적하고, 파드의 요청이 밀리 CPU 단위(예: 500m)인지 정수 CPU 단위(예: 2)인지에 따라 다른 배치 전략을 사용해요.

kubelet 구성 (Kubelet configuration)

kubelet 구성 파일의 cpuManagerPolicy 필드를 사용해 CPU 관리 정책을 선택할 수 있어요. kubelet은 두 가지 CPU 관리 정책을 지원해요.

  • None 정책 — 기본 값. 기본 CFS(completely fair scheduler) 동작을 유지해요.
  • Static 정책 — (Linux 전용) 워크로드의 CPU 친화성을 높여 성능을 향상시켜요.

cpuManagerPolicyNone으로 설정한 경우:

파드의 CPU 요청이 밀리 CPU 단위이면 CFS quota를 할당하고, 정수 CPU 단위이면 이전 버전의 kubelet이 했던 것처럼 실행돼요.

cpuManagerPolicyStatic으로 설정한 경우:

CPU 관리 정책이 Static일 때, 특정 조건을 충족하는 파드가 있는 노드는 노드의 공유 CPU 풀(shared CPU pool)이 아닌 개별 CPU 코어를 워크로드에 할당받을 수 있어요.

Static 정책에서 실행되는 kubelet은 노드의 총 CPU를 여러 부분으로 나눠요.

  • 공유 CPU 풀 (Shared CPU pool): 어떤 파드도 독점적으로 사용하지 않는 기본 CPU 집합.
  • 독점 CPU (Exclusive CPUs): Static 정책에서 요청을 충족하는 파드에 할당된 CPU.

Static 정책에서 파드가 독점 CPU를 받으려면 다음 조건을 모두 충족해야 해요.

  • Pod가 Guaranteed QoS 클래스에 있어야 해요.
  • 파드의 각 컨테이너가 requestslimits에 정수(밀리 CPU가 아닌) CPU를 지정해야 해요.
  • 파드의 모든 컨테이너가 시작돼야 해요 (즉, 시작 중이거나 재시작 중이면 안 됨).
  • 파드의 CPU 요청이 총 CPU 풀에 맞아야 해요 (requested와 limit이 같으므로 동일한 값).

노드의 CPU 풀은 다음과 같이 계산돼요.

allocatable CPUs = 총 CPU 수에서 kubeReserved/systemReserved/details로 예약된 CPU 제외
exclusive CPU 풀 = allocatable CPUs에서 특정 파드에 할당된 독점 CPU 제외

노드에 CPU 수가 소수인 경우(예: 2.5 CPU), Static 정책을 사용할 때 fractional CPU는 무시돼요. 예를 들어 노드에 2.5 CPU가 있고 Static 정책이 활성화돼 있으면 공유 풀에는 2 CPU가 할당돼요.

Static 정책에서 시작하는 방법 (Getting started with the Static policy)

Static 정책은 기본적으로 비활성화돼 있으며, cpuManagerPolicystatic으로 설정하면 활성화돼요.

다음 단계 (What's next)

  • 파드와 컨테이너를 위한 리소스 관리 문서
  • 노드 리소스 매니저 문서

더 알아보기 (Learn more)