Windows 노드용 리소스 관리
Windows 노드용 리소스 관리 (Resource Management for Windows nodes)
이 페이지는 Linux와 Windows 사이에서 리소스가 관리되는 방식의 차이를 개괄해요.
Linux 노드에서는 리소스 제어를 위한 파드 경계로 cgroups가 사용돼요. 컨테이너는 네트워크·프로세스·파일 시스템 격리를 위해 그 경계 안에서 생성돼요. Linux cgroup API를 사용해 CPU, I/O, 메모리 사용 통계를 수집할 수 있어요.
반면 Windows는 컨테이너마다 job object와 시스템 네임스페이스 필터를 사용해 컨테이너 안의 모든 프로세스를 담고 호스트로부터 논리적 격리를 제공해요. (Job object는 Windows 프로세스 격리 메커니즘으로, 쿠버네티스가 말하는 Job과는 달라요.)
네임스페이스 필터링 없이 Windows 컨테이너를 실행할 방법은 없어요. 즉, 시스템 권한을 호스트의 맥락에서 단언할 수 없으므로 privileged 컨테이너를 Windows에서 사용할 수 없어요. Security Account Manager(SAM)가 별개이므로 컨테이너는 호스트에서 정체성을 가정할 수 없어요.
출처: 문서
본문
메모리 관리
Windows에는 Linux와 같은 out-of-memory 프로세스 킬러가 없어요. Windows는 항상 모든 사용자 모드 메모리 할당을 가상으로 취급하고, 페이지파일(pagefile)이 필수예요.
Windows 노드는 프로세스에 메모리를 오버커밋하지 않아요. 그 결과 Windows는 Linux처럼 메모리 부족(out of memory) 상태에 도달하지 않고, 프로세스는 OOM 종료 대신 디스크로 페이징돼요. 메모리가 과도하게 프로비저닝되고 모든 물리 메모리가 소진되면, 페이징이 성능을 저하시킬 수 있어요.
CPU 관리
Windows는 서로 다른 프로세스에 할당된 CPU 시간을 제한할 수 있지만 최소 CPU 시간을 보장하지는 못해요.
Windows에서 kubelet은 kubelet 프로세스의 스케줄링 우선순위를 설정하는 명령줄 플래그를 지원해요: --windows-priorityclass. 이 플래그는 Windows 호스트에서 실행되는 다른 프로세스와 비교해 kubelet 프로세스가 더 많은 CPU 시간 조각을 얻을 수 있게 해줘요. 허용되는 값과 그 의미에 대한 자세한 내용은 Windows Priority Classes에서 확인할 수 있어요.
실행 중인 파드가 kubelet의 CPU 주기를 굶기지 않도록 하려면 이 플래그를 ABOVE_NORMAL_PRIORITY_CLASS 이상으로 설정해요.
리소스 예약
운영 체제, 컨테이너 런타임, 그리고 kubelet 같은 쿠버네티스 호스트 프로세스가 사용하는 메모리와 CPU를 고려하려면 --kube-reserved 및/또는 --system-reserved kubelet 플래그로 메모리와 CPU 리소스를 예약할 수 있습니다(그리고 예약해야 해요). Windows에서 이 값들은 노드의 allocatable 리소스를 계산하는 데만 사용돼요.
주의:
워크로드를 배포할 때 컨테이너에 리소스 메모리·CPU 한도를 설정해요. 이것도 NodeAllocatable 에서 차감되며 클러스터 전체 스케줄러가 어떤 파드를 어떤 노드에 배치할지 결정하는 데 도움을 줘요.
한도 없이 파드를 스케줄링하면 Windows 노드를 과도하게 프로비저닝할 수 있고, 극단적인 경우 노드가 비정상 상태가 될 수 있어요.
Windows에서는 메모리를 최소 2GiB 이상 예약하는 것이 좋은 관행이에요.
예약할 CPU 양을 결정하려면 각 노드의 최대 파드 밀도를 식별하고 거기서 실행되는 시스템 서비스의 CPU 사용량을 모니터링한 다음, 워크로드 요구를 충족하는 값을 선택해요.