프로세스 ID 제한과 예약
프로세스 ID 제한과 예약 (Process ID Limits And Reservations)
Kubernetes를 사용하면 Pod가 사용할 수 있는 프로세스 ID(PID)의 개수를 제한할 수 있어요. 또한 각 노드에 운영체제와 데몬(즉 Pod가 아닌)이 사용할 수 있도록 할당 가능한 PIDs 중 일부를 예약할 수도 있습니다.
프로세스 ID(PID)는 노드에서 아주 기본적인 리소스예요. 다른 어떤 리소스 한계에도 걸리지 않은 채 작업 한계(task limit)에 금방 도달할 수 있고, 그러면 호스트 머신이 불안정해질 수 있죠. 클러스터 관리자는 클러스터에서 실행되는 Pod들이 PID 고갈을 유발해 호스트 데몬(예: kubelet, kube-proxy, 경우에 따라 컨테이너 런타임)이 실행되지 못하게 막을 수 없도록 해야 해요.
또한 Pod들이 같은 노드의 다른 워크로드에 미치는 영향을 제한하려면, Pod들 사이에서 PIDs를 제한하는 것도 중요합니다.
참고: 일부 Linux 설치에서는 운영체제가 PID 제한을
32768같은 낮은 기본값으로 설정해요./proc/sys/kernel/pid_max값을 높이는 것을 고려해 보세요.
kubelet을 설정해 특정 Pod가 소비할 수 있는 PID 개수를 제한할 수 있습니다. 예를 들어 노드의 호스트 OS가 최대 262144 PIDs를 사용하도록 설정되어 있고 250개 미만의 Pod를 호스팅할 것으로 예상한다면, 각 Pod에 1000 PIDs의 예산을 줘서 노드의 전체 가용 PIDs를 다 소진하지 않게 할 수 있어요. 관리자가 CPU나 메모리처럼 PID를 오버커밋하고 싶다면, 몇 가지 추가 위험을 감수하고 그렇게 할 수도 있습니다. 어느 쪽이든 단일 Pod가 전체 머신을 다운시키지는 못합니다. 이런 종류의 리소스 제한은 단순한 포크 폭탄(fork bomb)이 전체 클러스터 운영에 영향을 주는 것을 방지하는 데 도움이 돼요.
Pod별 PID 제한은 관리자가 한 Pod를 다른 Pod로부터 보호할 수 있게 해주지만, 그 호스트에 스케줄링된 모든 Pod가 노드 전체에 영향을 주지 못하게 보장하지는 않아요. Pod별 제한은 노드 에이전트 자체를 PID 고갈로부터 보호하지도 않습니다.
Pod에 할당하는 것과는 별개로, 노드 오버헤드를 위해 일정량의 PIDs를 예약할 수도 있어요. 이는 CPU, 메모리 또는 다른 리소스를 운영체제와 Pod·컨테이너 밖의 다른 시설이 사용하도록 예약하는 방식과 비슷합니다.
PID 제한은 컴퓨트 리소스 requests와 limits의 중요한 형제 기능이에요. 다만 지정 방식이 다릅니다. Pod의 .spec에서 리소스 limit을 정의하는 대신, kubelet의 설정으로 제한을 구성합니다. Pod 정의에서 PID 제한을 지정하는 것은 현재 지원되지 않아요.
주의: 이는 Pod에 적용되는 제한이 Pod가 스케줄링된 위치에 따라 달라질 수 있다는 뜻이에요. 간단하게 하려면 모든 노드가 동일한 PID 리소스 제한과 예약을 사용하는 것이 가장 좋습니다.
노드 PID 제한 (Node PID limits)
Kubernetes는 시스템 사용을 위해 일정 수의 프로세스 ID를 예약할 수 있게 해줍니다. 예약을 구성하려면 kubelet의 --system-reserved와 --kube-reserved 커맨드 라인 옵션에 pid=<number> 파라미터를 사용하세요. 지정한 값은 각각 시스템 전체와 Kubernetes 시스템 데몬을 위해 예약할 프로세스 ID 수를 선언합니다.
Pod PID 제한 (Pod PID limits)
Kubernetes는 Pod에서 실행되는 프로세스 수를 제한할 수 있게 해줍니다. 이 제한은 특정 Pod의 리소스 limit으로 구성하는 것이 아니라 노드 레벨에서 지정해요. 각 노드는 서로 다른 PID 제한을 가질 수 있습니다.
제한을 구성하려면 kubelet에 --pod-max-pids 커맨드 라인 파라미터를 지정하거나, kubelet 설정 파일에서 PodPidsLimit을 설정하면 됩니다.
PID 기반 축출 (PID based eviction)
kubelet이 비정상적으로 동작하며 비정상적인 양의 리소스를 소비하는 Pod를 종료하도록 구성할 수 있어요. 이 기능을 축출(eviction)이라고 합니다. 다양한 축출 신호에 대해 OOM 처리(Out of Resource Handling)를 구성할 수 있습니다.
Pod가 사용하는 PID 수에 대한 임계값을 구성하려면 pid.available 축출 신호를 사용하세요. 소프트(soft)와 하드(hard) 축출 정책을 모두 설정할 수 있어요.
하지만 하드 축출 정책이 있어도, PID 수가 아주 빠르게 늘어나면 노드가 노드 PID 한계에 부딪혀 불안정한 상태에 이를 수 있습니다. 축출 신호 값은 주기적으로 계산되며 그 자체로는 제한을 강제하지 않아요. Pod별·노드별 PID 제한이 하드 한계를 설정합니다.
일단 한계에 도달하면 워크로드는 새 PID를 얻으려 할 때 실패를 겪기 시작합니다. 워크로드가 그 실패에 어떻게 반응하는지, 그리고 Pod에 대해 liveness/readiness 프로브가 어떻게 구성되어 있는지에 따라 Pod가 재스케줄링될 수도 있고 아닐 수도 있어요.
하지만 제한을 올바르게 설정했다면, 한 Pod가 비정상적으로 동작할 때 다른 Pod 워크로드와 시스템 프로세스가 PID가 부족해지지 않는다는 것을 보장할 수 있습니다.
더 알아보기
- 리소스 관리하기 (Managing Resources for Containers)
- OOM 처리 구성하기 (Configure Out of Resource Handling)
- kubelet 설정
- 셀프 힐링(Self-healing)