home..

Node Allocatable

kubernetes msa mont-kim aws eks pod node allocatable eviction reserved

Node Capacity

쿠버네티스의 노드 용량(Capacity)은 해당 노드에서 사용할 수 있는 리소스의 총량을 말합니다. 일반적으로, 노드의 용량은 CPU, 메모리, 저장소가 있습니다. 각각의 노드는 이들 리소스에 대한 최대 용량을 가지고 있으며, 이 용량을 기반으로 쿠버네티스 스케줄러는 파드를 해당 노드에 할당 여부를 결정합니다.

쿠버네티스 노드의 용량은kubectl describe node <node-name> 명령어를 통해 조회할수있으며, 노드의 용량(Capacity)과 현재 사용 중인 리소스(Allocatable)의 정보가 담겨있습니다.

노드의 용량(Capacity)은 실제 노드에서 사용할 수 있는 리소스의 총량을 나타내지만, Allocatable은 시스템이 파드에 할당하기 위해 보유하고 있는 리소스의 양을 말합니다. Allocatable 리소스는 용량에서 시스템 데몬 등에 의해 예약된 리소스를 제외한 나머지를 나타냅니다.

노드가 자원을 과도하게 사용하면, 시스템 데몬과 파드간에 경쟁이 일어나고, 이는 노드에서 리소스 기아 상태를 초래할 수 있습니다. 이 문제를 해결하기 위해, 쿠버네티스는 ‘Node Allocatable’ 이라는 기능을 제공합니다.

노드 할당 가능(Node Allocatable)

Node Allocatable은 쿠버네티스 노드에서 파드에 사용 가능한 컴퓨팅 리소스의 양을 정의합니다. Node Allocatable은 쿠버네티스 노드가 파드에게 할당할 수 있는 리소스 양을 나타냅니다. 이는 쿠버네티스 스케줄러가 새로운 파드를 노드에 할당할 때 사용할 수 있는 리소스 양을 결정하는 데 사용됩니다. 노드 자체를 실행하는 데 필요한 OS 데몬들, 쿠버네티스 시스템 데몬들(예: kubelet, 컨테이너 런타임 등), 그리고 cgroup 오버헤드 등이 포함될 수 있습니다.

Untitled

시스템 데몬을 위한 리소스 설정

kubelet은 두 가지 범주의 시스템 데몬에 대한 리소스를 설정 할 수 있습니다.

Kube Reserved

kubelet, 컨테이너 런타임, 노드 문제 감지기(node problem detector) 등의 쿠버네티스 시스템 데몬에 대한 리소스 예약을 위해 존재합니다. 예시로는 kubelet, 컨테이너 런타임, 노드 문제 탐지기 등이 있습니다.

  • Kubelet 플래그: -kube-reserved=[cpu=100m][,][memory=100Mi]

System Reserved

쿠버네티스가 운영 체제(OS) 시스템 데몬들을 위한 리소스를 어떻게 예약하고 관리하는지에 대한 설명입니다.

system-reserved는 OS 시스템 데몬들을 위한 리소스 예약을 위한 kubelet 플래그입니다. OS 시스템 데몬들이란, 쿠버네티스 관련 데몬들이 아닌, 운영체제를 구동하는 데 필요한 프로세스들을 말합니다. 이들에는 커널 스레드, 시스템 데몬(such as sshd, udev), 그리고 기타 커널 사용자 공간 요소들이 포함됩니다.

설정 가능한 리소스에는 CPU, 메모리, ephemeral-storage(일시적인 스토리지), 그리고 프로세스 ID(PID)가 있습니다. 예를 들어, --system-reserved=memory=1Gi 옵션을 kubelet에 설정하면, 1GiB의 메모리가 OS 시스템 데몬들을 위해 예약되며, 이 리소스는 쿠버네티스의 워크로드에는 사용되지 않습니다.

이렇게 설정하면, kubelet은 쿠버네티스의 워크로드를 위한 리소스를 계산할 때, 이 예약된 리소스를 고려합니다. 즉, 노드에 사용 가능한 총 리소스에서 이 예약된 리소스를 빼고, 그 결과를 쿠버네티스 워크로드에 할당할 수 있는 리소스로 간주합니다.

Reserved CPUS

reserved-cpus 옵션은 주로 특정 용도를 가진 시스템에서 사용됩니다. 이는 주로 OS 시스템 데몬과 쿠버네티스 시스템 데몬이 독립적으로 특정 CPU를 사용할 수 있도록 예약해주는 기능입니다.

데몬 프로세스는 시스템의 정상적인 운영을 위해 필요한 기능을 수행합니다. OS 또는 쿠버네티스 관련 시스템 데몬들이 CPU 리소스를 필요로 할 때, 해당 리소스가 이미 다른 작업에 의해 사용중인 경우, 시스템의 성능이 저하될 수 있습니다.

이를 방지하기 위해, reserved-cpus 옵션을 사용하여 특정 CPU를 시스템 데몬들만을 위해 예약해 둘 수 있습니다. 이렇게 하면, 해당 CPU는 시스템 데몬들이 필요로 하는 작업을 처리하는 데 전용으로 사용되며, 다른 작업에는 사용되지 않습니다.

Eviction Thresholds

“Eviction Thresholds”는 쿠버네티스에서 노드의 리소스가 고갈되는 상황을 관리하기 위한 메커니즘입니다. 쿠버네티스는 OOM 상황을 방지하기 위해 “Eviction Thresholds” 메커니즘을 제공합니다.

kubelet은 --eviction-hard 플래그를 통해 설정된 임계값을 관찰하고, 노드의 사용 가능한 메모리가 이 임계값 아래로 떨어질 경우 파드를 추방(evict)하려고 시도합니다.

이러한 eviction은 노드의 전체 메모리 리소스가 고갈되어 시스템이 불안정해지는 것을 막는데 도움을 줍니다. 사용 가능한 메모리가 임계값 아래로 떨어지면, kubelet은 더 이상 사용하지 않는 파드를 중단시키고 해당 리소스를 회수합니다. 이렇게 함으로써, 더 중요한 시스템 작업을 위한 메모리를 확보하고, 노드의 전체 리소스 사용을 안정화시키는 것이 가능합니다.

Eviction 되는 파드의 선택은 다양한 요인에 따라 결정되며, 이 중 하나는 파드의 ‘QoS class’(Quality of Service 클래스)입니다. 예를 들어, BestEffort QoS 클래스를 가진 파드는 Guaranteed QoS 클래스를 가진 파드보다 먼저 eviction될 가능성이 높습니다.

따라서, --eviction-hard 옵션은 시스템 메모리 부족 상황을 관리하고 시스템의 안정성을 유지하기 위한 중요한 도구입니다. 노드 관리자는 이 임계값을 신중하게 설정해야 합니다. 너무 높게 설정하면 파드가 너무 일찍 eviction될 수 있고, 너무 낮게 설정하면 OOM 상황을 피할 수 없을 수 있습니다.

Enforcing Node Allocatable

Node Allocatable은 쿠버네티스 노드에서 파드가 사용할 수 있는 리소스의 양을 정의합니다. 이 값은 노드의 총 리소스에서 시스템 구성 요소를 위해 예약된 리소스가 뺀 값으로 계산됩니다. 예약된 리소스에는 kube-reserved, system-reserved, 그리고 각 파드를 실행하는 데 필요한 기본적인 리소스가 포함됩니다.

Enforcing Node Allocatable은 이 Node Allocatable값을 쿠버네티스가 강제하는 방법에 관한 것입니다. 기본적으로 kubelet은 파드 간에 ‘Allocatable’을 강제로 적용합니다. 즉, 모든 파드에서의 전체 사용량이 Node Allocatable을 초과하면 kubelet은 파드를 추방(evict)하여 리소스 사용량을 제한합니다.

’–enforce-node-allocatable’ 플래그를 사용하면 kubelet에 어떤 리소스가 강제되어야 하는지 지정할 수 있습니다. 예를 들어, 이 플래그에 pods, system-reserved, kube-reserved 값을 지정하면 kubelet은 파드, 시스템 예약, 그리고 kubelet 예약 리소스를 모두 강제합니다.

그러나 kube-reserved 또는 system-reserved를 강제하려면 각각 --kube-reserved-cgroup 또는 --system-reserved-cgroup을 지정해야 합니다. 이 플래그들은 각 리소스가 강제되는 cgroup을 결정합니다. cgroup은 Linux에서 프로세스들의 리소스 사용을 제한하고 격리하는 기능을 가진 커널의 기능입니다.

따라서 Enforcing Node AlloEnforcing Node Allocatableable은 파드와 시스템 서비스가 노드 리소스를 과도하게 소비하지 않도록 하는 중요한 방법입니다. 이를 통해 쿠버네티스는 노드의 안정성을 유지하고 각 파드에 적절한 리소스를 할당할 수 있습니다.

적용 예제

노드가 32Gi의 메모리, 16개의 CPU, 그리고 100Gi의 저장공간을 가지고 있다고 가정하겠습니다.

  • -kube-reserved는 cpu=1,memory=2Gi,ephemeral-storage=1Gi로 설정되어 있습니다.
  • -system-reserved는 cpu=500m,memory=1Gi,ephemeral-storage=1Gi로 설정되어 있습니다.
  • -eviction-hard는 memory.available<500Mi,nodefs.available<10%로 설정되어 있습니다.

이 경우, Node Allocatable 은 14.5개의 CPU, 28.5Gi의 메모리, 그리고 88Gi의 로컬 스토리지가 됩니다. 스케줄러는 이 노드의 모든 파드의 메모리 요청 합계가 28.5Gi를 초과하지 않도록 하며, 스토리지는 88Gi를 초과하지 않도록 합니다.

마치며

이렇게 쿠버네티스 노드에서 노드의 한계가 어떻게 설정되는지, 이러한 상황에서는 어떤식으로 관리를 할 수 있는지 알아보았습니다. 만약 pod에 할당 가능한 리소스를 모두 사용하게되면 node-pressure 상황에 들어가 pod eviction이 일어나게되는데, 이때 eviction 이 일어나는 규칙은 QoS ClassPriority Class 항목을 보면 될 것 같습니다.

이전 게시글에서 정리한적이 있으니 링크에서 참조하시면 좋을것 같습니다 Pod Eviction & Priority Class

© 2024 mont kim   •  Powered by Soopr   •  Theme  Moonwalk