프로세스 ID 한도 및 예약

프로세스 ID 한도 및 예약 (Process ID Limits And Reservations)

쿠버네티스는 파드가 사용할 수 있는 프로세스 ID(PID)의 개수를 제한할 수 있게 해줘요. 또한 각 노드에 대해 운영체제와 데몬이 사용할(파드용이 아닌) 할당 가능한(allocatable) PID를 예약할 수도 있어요.

출처: 문서

본문

프로세스 ID(PID)는 노드의 근본적인(fundamental) 리소스예요. 다른 리소스 한도에는 전혀 걸리지 않으면서 작업 한도(task limit)에 쉽게 도달할 수 있는데, 그러면 호스트 머신이 불안정해질 수 있어요.

클러스터 관리자는 클러스터에서 실행 중인 파드가 PID 고갈을 유발해서 호스트 데몬(kubelet, kube-proxy, 그리고 잠재적으로 컨테이너 런타임)이 실행되지 못하게 만드는 상황을 막을 수 있는 메커니즘이 필요해요. 또한 같은 노드의 다른 워크로드에 미치는 영향을 제한하기 위해 파드들 사이에서 PID를 제한하는 것도 중요해요.

참고:

kubelet을 구성해서 특정 파드가 소비할 수 있는 PID 수를 제한할 수 있어요. 예를 들어 노드의 호스트 OS가 최대 262144개의 PID를 사용하도록 설정되어 있고 250개 미만의 파드를 수용할 것으로 예상된다면, 각 파드에 1000개의 PID 예산을 주어 노드의 전체 가용 PID 수를 소진하지 않게 할 수 있어요. 관리자가 CPU나 메모리처럼 PID를 오버커밋(overcommit)하고 싶다면 약간의 위험을 감수하면서 그렇게 할 수도 있어요. 어느 쪽이든 단일 파드 하나로 머신 전체를 다운시킬 수는 없어요. 이런 리소스 제한은 단순한 fork bomb이 전체 클러스터 운영에 영향을 주는 것을 막는 데 도움이 돼요.

파드별 PID 제한은 관리자가 한 파드를 다른 파드로부터 보호할 수 있게 해주지만, 그 호스트에 스케줄링된 모든 파드가 노드 전체에 영향을 주지 못하게 보장하지는 않아요. 파드별 제한은 노드 에이전트 자체를 PID 고갈로부터 보호하지도 못해요.

파드에 할당하는 것과 별개로, 노드 오버헤드용으로 PID를 예약할 수도 있어요. 이는 CPU, 메모리, 그리고 파드와 그 컨테이너 밖의 운영체제·기타 시설이 쓰도록 리소스를 예약하는 방식과 비슷해요.

PID 제한은 컴퓨트 리소스 요청과 한도(request/limit)의 중요한 형제 역할이에요. 다만 지정 방식은 달라요. 파드의 .spec에 파드 리소스 한도를 정의하는 대신, kubelet의 설정으로 한도를 구성해요. 파드에 정의된 PID 한도는 현재 지원되지 않아요.

주의:

노드 PID 한도 (Node PID limits)

쿠버네티스는 시스템 사용을 위한 프로세스 ID를 예약할 수 있게 해줘요. 예약을 구성하려면 kubelet의 --system-reserved--kube-reserved 명령줄 옵션에서 pid=<number> 파라미터를 사용해요. 지정한 값은 그만큼의 프로세스 ID를 각각 시스템 전체와 쿠버네티스 시스템 데몬을 위해 예약한다는 뜻이에요.

파드 PID 한도 (Pod PID limits)

쿠버네티스는 파드에서 실행되는 프로세스 수를 제한할 수 있게 해줘요. 이 한도는 특정 파드의 리소스 한도로 구성하는 것이 아니라 노드 수준에서 지정해요. 각 노드는 서로 다른 PID 한도를 가질 수 있어요. 한도를 구성하려면 kubelet에 --pod-max-pids 명령줄 파라미터를 지정하거나, kubelet 구성 파일에서 PodPidsLimit을 설정하면 돼요.

PID 기반 축출 (PID based eviction)

kubelet을 구성해서 파드가 오동작하며 비정상적인 양의 리소스를 소비하기 시작하면 그 파드를 종료하도록 할 수 있어요. 이 기능을 축출(eviction)이라고 해요. 다양한 축출 신호에 대해 '리소스 부족 처리(Out of Resource Handling) 구성'을 할 수 있어요. 파드가 사용하는 PID 수의 임계값을 구성하려면 pid.available 축출 신호를 사용해요. 소프트(soft) 및 하드(hard) 축출 정책을 설정할 수 있어요. 하지만 하드 축출 정책이라도 PID 수가 아주 빠르게 증가하면 노드 PID 한도에 도달해 노드가 여전히 불안정한 상태에 빠질 수 있어요. 축출 신호 값은 주기적으로 계산되며, 그 한도를 강제로 집행하지 않아요.

PID 제한은 파드별·노드별로 하드 한도를 설정해요. 한도에 도달하면 워크로드는 새 PID를 얻으려 할 때 실패를 겪기 시작해요. 워크로드가 이런 실패에 어떻게 반응하는지, 그리고 파드의 liveness·readiness 프로브가 어떻게 구성되어 있는지에 따라 파드의 재스케줄링으로 이어질 수도 있고 아닐 수도 있어요. 하지만 한도가 올바르게 설정되었다면, 한 파드가 오동작할 때 다른 파드의 워크로드와 시스템 프로세스가 PID를 다 써 버리지 않는다는 것을 보장할 수 있어요.

더 알아보기 (Learn more)

  • PID 제한 개선(enhancement) 문서를 참고하세요.
  • 역사적 배경으로는 쿠버네티스 1.14의 'Process ID Limiting for Stability Improvements' 문서를 읽어 보세요.
  • 컨테이너 리소스 관리 문서를 읽어 보세요.
  • 리소스 부족 처리 구성 방법을 배워 보세요.