CSI 드라이버가 노드의 연결 가능한 볼륨 수 정보를 업데이트하는 기능은 Kubernetes v1.33에서 알파(Alpha) 기능으로 처음 도입되었으며, Kubernetes v1.34 릴리스에서 **베타(Beta)**로 승격되었습니다! 이는 오래된 연결 가능한 볼륨 용량 정보로 인해 발생하는 스케줄링 실패를 줄여 스테이트풀(stateful) 파드 스케줄링의 정확도를 높이는 데 중요한 이정표가 됩니다.
배경
기존에는 Kubernetes CSI 드라이버가 초기화될 때 정적인 최대 볼륨 연결 한도를 보고했습니다. 하지만 실제 연결 용량은 노드의 라이프사이클 동안 다양한 이유로 변경될 수 있습니다. 예를 들어:
- Kubernetes 제어 외부에서 볼륨을 연결/분리하는 수동 또는 외부 작업.
- 동적으로 연결된 네트워크 인터페이스 또는 특수 하드웨어(GPU, NIC 등)가 사용 가능한 슬롯을 소모하는 경우.
- 하나의 CSI 드라이버 작업이 다른 드라이버가 보고하는 사용 가능한 용량에 영향을 미치는 다중 드라이버 시나리오.
정적인 보고는 Kubernetes가 용량이 있는 것처럼 보이는 노드에 파드를 스케줄링하게 만들 수 있으며, 이는 파드가 ContainerCreating 상태에 멈추는 결과를 초래합니다.
CSI 볼륨 한도 동적 조정
이 새로운 기능을 통해 Kubernetes는 CSI 드라이버가 런타임에 노드 연결 용량을 동적으로 조정하고 보고할 수 있도록 합니다. 이를 통해 스케줄러와 이 정보에 의존하는 다른 구성 요소들이 노드 용량에 대한 가장 정확하고 최신 정보를 확보할 수 있습니다.
작동 방식
Kubernetes는 보고된 노드 볼륨 한도를 업데이트하는 두 가지 메커니즘을 지원합니다:
- 주기적 업데이트 (Periodic Updates): CSI 드라이버는 노드의 할당 가능한 용량을 주기적으로 새로 고치는 간격을 지정합니다.
- 반응형 업데이트 (Reactive Updates): 리소스 소진(
ResourceExhausted에러)으로 인해 볼륨 연결이 실패했을 때 즉시 트리거되는 업데이트입니다.
기능 활성화
이 베타 기능을 사용하려면 다음 구성 요소에서 MutableCSINodeAllocatableCount 피처 게이트를 활성화해야 합니다:
kube-apiserverkubelet
CSI 드라이버 구성 예시
다음은 60초마다 주기적 업데이트를 활성화하도록 CSI 드라이버를 구성하는 예시입니다:
apiVersion: storage.k8s.io/v1
kind: CSIDriver
metadata:
name: example.csi.k8s.io
spec:
nodeAllocatableUpdatePeriodSeconds: 60
이 구성은 kubelet이 60초마다 CSI 드라이버의 NodeGetInfo 메서드를 주기적으로 호출하여 노드의 할당 가능한 볼륨 수를 업데이트하도록 지시합니다. Kubernetes는 정확도와 리소스 사용량의 균형을 맞추기 위해 최소 업데이트 간격을 10초로 제한합니다.
연결 실패 시 즉시 업데이트
볼륨 연결 작업이 ResourceExhausted 에러(gRPC 코드 8)로 인해 실패하면, Kubernetes는 다음 주기적 업데이트를 기다리지 않고 즉시 할당 가능한 수를 업데이트합니다. 그런 다음 Kubelet은 영향을 받는 파드를 Failed로 표시하여 해당 컨트롤러가 파드를 다시 생성할 수 있도록 합니다. 이는 파드가 ContainerCreating 상태에 영구적으로 멈추는 것을 방지합니다.
시작하기
Kubernetes v1.34 클러스터에서 이 기능을 활성화하려면:
kube-apiserver및kubelet구성 요소에서MutableCSINodeAllocatableCount피처 게이트를 활성화합니다.nodeAllocatableUpdatePeriodSeconds를 설정하여 CSI 드라이버 구성을 업데이트합니다.- 스케줄링 정확도 및 파드 배치 안정성의 개선 사항을 모니터링하고 관찰합니다.
다음 단계
이 기능은 현재 베타(beta) 상태이며, Kubernetes 커뮤니티는 여러분의 피드백을 환영합니다. 이 기능을 테스트하고 경험을 공유하여 GA(General Availability) 안정성으로 발전할 수 있도록 도와주세요.
Kubernetes Storage Special Interest Group (SIG-Storage)의 토론에 참여하여 Kubernetes 스토리지 기능의 미래를 함께 만들어가세요.