노드별 볼륨 한도
노드별 볼륨 한도 (Node-specific Volume Limits)
이 페이지는 다양한 클라우드 제공자에 대해 노드에 연결할 수 있는 최대 볼륨 수를 설명합니다.
Google, Amazon, Microsoft 같은 클라우드 제공자는 보통 노드에 연결할 수 있는 볼륨 수에 제한이 있습니다. Kubernetes가 이러한 제한을 존중하는 것이 중요해요. 그렇지 않으면 노드에 스케줄된 Pod가 볼륨 연결을 기다리며 멈출 수 있습니다.
출처: 문서
Kubernetes 기본 한도 (Kubernetes default limits)
Kubernetes 스케줄러는 노드에 연결할 수 있는 볼륨 수에 대한 기본 한도가 있습니다.
| 클라우드 서비스 | 노드당 최대 볼륨 |
|---|---|
| Amazon Elastic Block Store (EBS) | 39 |
| Google Persistent Disk | 16 |
| Microsoft Azure Disk Storage | 16 |
동적 볼륨 한도 (Dynamic volume limits)
동적 볼륨 한도는 다음 볼륨 유형에 대해 지원됩니다.
- Amazon EBS
- Google Persistent Disk
- Azure Disk
- CSI
인트리(in-tree) 볼륨 플러그인이 관리하는 볼륨의 경우, Kubernetes가 자동으로 노드 유형을 결정하고 해당 노드에 적절한 최대 볼륨 수를 적용합니다. 예를 들어:
- Google Compute Engine에서 노드 유형에 따라 최대 127개의 볼륨을 노드에 연결할 수 있습니다.
- M5, C5, R5, T3, Z1D 인스턴스 유형의 Amazon EBS 디스크의 경우 Kubernetes는 노드에 25개의 볼륨만 연결하도록 허용합니다. Amazon Elastic Compute Cloud (EC2)의 다른 인스턴스 유형에서는 Kubernetes가 노드에 39개의 볼륨을 연결하도록 허용합니다.
- Azure에서 노드 유형에 따라 최대 64개의 디스크를 노드에 연결할 수 있습니다. 자세한 내용은 Azure의 가상 머신 크기를 참고하세요.
- CSI 스토리지 드라이버가 NodeGetInfo를 사용해 노드에 대한 최대 볼륨 수를 알리면, kube-scheduler가 그 한도를 존중합니다. 자세한 내용은 CSI 사양을 참고하세요.
- CSI 드라이버로 마이그레이션된 인트리 플러그인이 관리하는 볼륨의 경우, 최대 볼륨 수는 CSI 드라이버가 보고한 값이 됩니다.
변경 가능한 CSI 노드 할당 가능 개수 (Mutable CSI Node Allocatable Count)
이 기능은 Kubernetes에서 안정(stable) 기능이며 버전 1.36부터 적용됐어요. 처음 사용 가능해진 것은 v1.33 릴리스에서입니다.
CSI 드라이버는 런타임에 노드에 연결할 수 있는 최대 볼륨 수를 동적으로 조정할 수 있어요. 이는 스케줄링 정확도를 높이고 리소스 가용성 변화로 인한 Pod 스케줄링 실패를 줄입니다.
이 기능을 사용하려면 다음 컴포넌트에서 MutableCSINodeAllocatableCount 기능 게이트를 활성화해야 합니다.
- kube-apiserver
- kubelet
주기적 업데이트 (Periodic Updates)
활성화되면 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는 해당 노드에 대한 할당 가능 볼륨 수의 즉각적인 업데이트를 촉발합니다. 또한 kubelet은 영향을 받은 Pod를 Failed로 표시해 컨트롤러가 재생성을 처리하도록 합니다. 이는 Pod가 ContainerCreating 상태에서 무기한 멈추는 것을 방지합니다.
CSI 드라이버 없이 Pod 배치 방지 (Preventing Pod placement without CSI driver)
VolumeLimitScaling 기능 게이트는 Kubernetes v1.37에서 기본 활성화되어 있습니다.
그러나 CSI 드라이버가 없는 노드에 Pod 배치를 방지하려면 CSIDriver 객체의 spec.preventPodSchedulingIfMissing 필드를 통한 명시적 옵트인이 필요합니다.
preventPodSchedulingIfMissing 필드는 기본값이 false이며, CSI 드라이버가 없는 노드에 Pod가 스케줄되지 않게 하려면 true로 설정해야 합니다. 기본값을 false로 둔 결정은 하위 호환성과, 오토스케일링 단계에서 CSI 볼륨 한도를 인지하지 못할 수 있는 Cluster AutoScaler와의 호환성을 위해 내려졌어요(아래 섹션 참고).
apiVersion: storage.k8s.io/v1
kind: CSIDriver
metadata:
name: hostpath.csi.k8s.io
spec:
preventPodSchedulingIfMissing: true
CSI 볼륨 연결 한도와 클러스터 오토스케일러 (CSI volume attach limits and cluster autoscaler)
클러스터 오토스케일러는 --enable-csi-node-aware-scheduling=true일 때 CSI 볼륨 한도를 고려할 수 있어요. 이 옵션은 VolumeLimitScaling 기능 게이트와 독립적입니다.
클러스터 오토스케일러를 사용한다면, 클러스터 오토스케일러가 --enable-csi-node-aware-scheduling=true로 구성됐을 때만 spec.preventPodSchedulingIfMissing을 true로 설정하세요. 그렇지 않으면 그 스케줄링 시뮬레이션이 새 노드에 대한 필수 CSINode 정보를 포함하지 않아, CSI 볼륨을 사용하는 대기 중인 Pod에 대해 클러스터 오토스케일러가 스케일업하지 못할 수 있습니다.