노드별 볼륨 한도

노드별 볼륨 한도 (Node-specific Volume Limits)

이 페이지는 다양한 클라우드 제공자에 대해 Node에 부착할 수 있는 볼륨의 최대 수를 설명해요.

Google, Amazon, Microsoft 같은 클라우드 제공자는 보통 Node에 부착할 수 있는 볼륨 수에 제한이 있어요. Kubernetes가 이러한 제한을 존중하는 것이 중요해요. 그렇지 않으면 Node에 스케줄링된 Pod가 볼륨이 부착되기를 기다리며 멈출 수 있어요.

Kubernetes 기본 한도

Kubernetes 스케줄러는 Node에 부착할 수 있는 볼륨 수에 대한 기본 한도를 가져요.

클라우드 서비스 노드당 최대 볼륨 수
Amazon Elastic Block Store (EBS) 39
Google Persistent Disk 16
Microsoft Azure Disk Storage 16

동적 볼륨 한도

FEATURE STATE: Kubernetes v1.17 [stable]

동적 볼륨 한도는 다음 볼륨 유형에 대해 지원돼요.

  • Amazon EBS
  • Google Persistent Disk
  • Azure Disk
  • CSI

in-tree 볼륨 플러그인이 관리하는 볼륨의 경우 Kubernetes가 Node 유형을 자동으로 결정하고 노드에 적절한 최대 볼륨 수를 시행해요. 예를 들어:

  • Google Compute Engine에서는 노드 유형에 따라 노드에 최대 127개의 볼륨을 부착할 수 있어요.
  • M5, C5, R5, T3, Z1D 인스턴스 유형의 Amazon EBS 디스크의 경우 Kubernetes는 Node에 25개의 볼륨만 부착하도록 허용해요.
  • Amazon Elastic Compute Cloud (EC2)의 다른 인스턴스 유형에서는 Kubernetes가 Node에 39개의 볼륨 부착을 허용해요.
  • Azure에서는 노드 유형에 따라 노드에 최대 64개의 디스크를 부착할 수 있어요. 자세한 내용은 Azure의 가상 머신 크기를 참고하세요.
  • CSI 스토리지 드라이버가( NodeGetInfo를 사용해) Node에 대한 최대 볼륨 수를 광고하면 kube-scheduler가 그 한도를 따릅니다. 자세한 내용은 CSI 스펙을 참고하세요.
  • CSI 드라이버로 마이그레이션된 in-tree 플러그인이 관리하는 볼륨의 경우 최대 볼륨 수는 CSI 드라이버가 보고하는 값이 돼요.

변경 가능한 CSI Node 할당 가능 수

FEATURE STATE: Kubernetes v1.36 [stable](기본적으로 활성화)

CSI 드라이버는 런타임에 Node에 부착할 수 있는 최대 볼륨 수를 동적으로 조정할 수 있어요. 이는 스케줄링 정확도를 향상시키고 리소스 가용성 변화로 인한 pod 스케줄링 실패를 줄여요.

이 기능을 사용하려면 다음 컴포넌트에서 MutableCSINodeAllocatableCount 기능 게이트를 활성화해야 해요.

  • kube-apiserver
  • kubelet

주기적 갱신

활성화되면 CSI 드라이버는 CSIDriver 스펙의 nodeAllocatableUpdatePeriodSeconds 필드를 설정해 볼륨 한도에 대한 주기적 갱신을 요청할 수 있어요. 예를 들어:

apiVersion: storage.k8s.io/v1
kind: CSIDriver
metadata:
  name: hostpath.csi.k8s.io
spec:
  nodeAllocatableUpdatePeriodSeconds: 60

kubelet은 nodeAllocatableUpdatePeriodSeconds에 지정된 간격을 사용해 해당 CSI 드라이버의 NodeGetInfo 엔드포인트를 주기적으로 호출해 부착 가능한 최대 볼륨 수를 새로 고침해요. 이 필드의 최소 허용 값은 10초예요.

볼륨 부착 작업이 ResourceExhausted 오류(gRPC 코드 8)로 실패하면 Kubernetes는 해당 Node의 할당 가능 볼륨 수에 대한 즉시 갱신을 트리거해요. 추가로 kubelet은 영향을 받는 pod를 Failed로 표시해서 컨트롤러가 재생성을 처리하도록 해요.

이를 통해 pod가 ContainerCreating 상태에 무기한 갇히는 것을 방지해요.

CSI 드라이버 없이 Pod 배치 방지

FEATURE STATE: Kubernetes v1.35 [alpha](기본적으로 비활성화)

VolumeLimitScaling 기능 게이트가 활성화되어 있고 CSI 드라이버에 spec.preventPodSchedulingIfMissing이 true로 설정된 해당 CSIDriver 객체가 설치되어 있으면, 스케줄러는 아직 CSI 드라이버가 설치되지 않은 노드에 pod를 배치하지 않도록 방지해요. 예를 들어:

apiVersion: storage.k8s.io/v1
kind: CSIDriver
metadata:
  name: hostpath.csi.k8s.io
spec:
  preventPodSchedulingIfMissing: true

이 제한은 해당 CSI 볼륨이 필요한 pod에만 적용돼요.

CSI 볼륨 부착 한도와 클러스터 오토스케일러

cluster-autoscaler에서 --enable-csi-node-aware-scheduling 옵션이 활성화되어 있으면, cluster-autoscaler는 CSI 볼륨이 필요한 pending pod를 충족하는 데 필요한 노드 수를 정확히 계산할 수 있어요.

Kubernetes 클러스터에서 cluster-autoscaler를 사용한다면, cluster-autoscaler에도 --enable-csi-node-aware-scheduling 명령줄 옵션이 활성화되어 있지 않으면 PreventPodSchedulingIfMissing 필드로 pod 배치를 방지하는 것을 권장하지 않아요. VolumeLimitScaling 기능이 alpha인 동안 이 제한이 있는 근본 이유는, cluster-autoscaler가 아직 CSI 볼륨 한도를 인지하지 못하면 pod 배치 방지가 cluster-autoscaler가 실행하는 스케줄링 시뮬레이션을 깨뜨릴 수 있기 때문이에요.

CSI 볼륨을 사용하고 있고 cluster-autoscaler로 새 노드를 띄울 때 CSI 볼륨이 필요한 모든 pending pod를 충족하는 데 필요한 올바른 노드 수를 현재 버전의 cluster-autoscaler가 계산하지 못해서 너무 많은 pod가 노드에 몰리는 문제를 겪고 있다면, 관련 이슈를 참고하세요.