Kubernetes 볼륨 스토리지용 Amazon EC2 인스턴스 스토어
Kubernetes 볼륨 스토리지용 Amazon EC2 인스턴스 스토어 (Amazon EC2 instance store for Kubernetes volume storage)
Amazon EC2 Instance Store CSI 드라이버는 Kubernetes가 EC2 인스턴스 스토어 볼륨을 사용할 수 있게 해주는 CSI(Container Storage Interface) 플러그인이에요. 인스턴스 스토어 볼륨은 호스트 컴퓨터에 물리적으로 연결된 임시 블록 수준 스토리지를 제공해요. 이 드라이버는 이러한 NVMe 스토리지 볼륨의 수명 주기를 관리하고 Kubernetes 영구 볼륨으로 사용할 수 있게 해줘요.
Amazon EC2 Instance Store CSI 드라이버는 로컬 Linux 작업을 통해 백엔드 NVMe 장치와 상호작용해요. AWS API 호출이 없으므로 IAM 역할이 필요하지 않아요.
출처: 문서
본문
고려 사항 (Considerations)
중요
Amazon EC2 Instance Store CSI 드라이버는 설치 중 임시 디스크의 모든 데이터를 지워요. 다른 CSI 드라이버나 볼륨 관리 시스템(예: LVM, raw 파일시스템, LUKS 등)이 임시 디스크를 관리하고 있다면, 데이터 손실을 피하기 위해 Amazon EC2 Instance Store CSI 드라이버를 설치하기 전에 데이터를 백업하세요.
- Amazon EC2 Instance Store CSI 드라이버는 EKS Auto Mode와 작동하지 않아요.
- Amazon EC2 인스턴스 스토어 볼륨을 Fargate Pod에 마운트할 수 없어요.
- Amazon EC2 Instance Store CSI 드라이버는 다음 인스턴스 유형에서는 사용할 수 없어요: C1, C3, C4, C5d, C5ad, C6gd, D2, D3, D3en, DL1, E3, Edge1gd, F1, G2, G3, G4ad, G4dn, H1, HSM1, I2, I3, I3.metal, I3en, M1, M2, M3, M4, M5d, M5ad, M5dn, M6gd, P2, P3, P3dn, P4d, P4de, R3, R4, R5d, R5ad, R5dn, R6gd, T1, T2, X1, X1e, X2gd, Z1d.
- 최신 추가 기능 버전과 이전 버전 하나가 지원돼요. 최신 버전에서 발견된 버그나 취약점에 대한 수정은 새 마이너 버전으로 이전 릴리스에 백포트돼요.
- 인스턴스 스토리지는 임시 스토리지예요. 노드가 종료되면 데이터가 손실돼요. 중요한 데이터에는 애플리케이션 수준 복제나 백업을 구현하세요.
- 볼륨 확장은 지원되지 않아요.
- 모든 볼륨에서 워크로드 간 공정한 대역폭 공유를 보장하기 위해 I/O 스로틀링이 기본적으로 활성화돼 있어요. 자세한 내용은 I/O 스로틀링을 참고하세요.
- 새로 시작된 인스턴스는 같은 유형의 이전 인스턴스와 비교해 업데이트된 NVMe identify 명령 응답을 가져요. 도구가 특정 NVMe identify 값에 의존한다면 호환성을 위해 로직을 검토하세요. 자세한 내용은 새로 시작된 인스턴스의 NVMe 네임스페이스 변경을 참고하세요.
사전 요구 사항 (Prerequisites)
시작하기 전에 다음이 있는지 확인하세요.
- 기존 Amazon EKS 클러스터. 추가 기능의 모든 사용 가능한 버전을 보려면 다음 AWS CLI 명령을 실행하세요.
aws eks describe-addon-versions --addon-name aws-ec2-local-instance-store-csi-driver
Amazon EC2 Instance Store CSI 드라이버 설치
Amazon EC2 Instance Store CSI 드라이버는 Amazon EKS 추가 기능으로 사용할 수 있어요. 드라이버를 설치하면 클러스터가 Pod 스토리지에 인스턴스 스토어 볼륨을 사용할 수 있어요.
드라이버를 설치하려면 Amazon EC2 Instance Store CSI 드라이버 추가 기능을 클러스터에 추가하세요. 지침은 Amazon EKS 추가 기능 생성하기를, EKS 추가 기능에 대한 자세한 내용은 Amazon EKS 추가 기능을 참고하세요.
샘플 애플리케이션 배포
드라이버를 설치한 후 샘플 애플리케이션을 배포해 인스턴스 스토어 볼륨이 클러스터와 올바르게 작동하는지 확인할 수 있어요. 다양한 샘플 앱을 배포하고 필요에 따라 수정할 수 있어요.
I/O 스로틀링
Amazon EC2 Instance Store CSI 드라이버에는 같은 NVMe 컨트롤러에서 워크로드 간 공정한 대역폭 공유를 보장하는 내장 I/O 스로틀링이 포함돼 있어요. 스로틀링은 모든 볼륨에서 기본적으로 활성화되어 있어, 단일 워크로드가 같은 노드의 다른 워크로드를 희생하며 불균형한 I/O 대역폭을 소비하는 것을 방지해요.
스로틀링 구성
스로틀링은 두 수준에서 구성할 수 있어요.
- StorageClass 매개변수 – StorageClass 정의에서
throttling매개변수를"true"(기본값) 또는"false"로 설정하세요. - PVC 어노테이션 – 개별 PersistentVolumeClaim에
lis.csi.aws.com/throttling어노테이션을"true"또는"false"로 설정하세요. 존재하면 StorageClass 설정을 재정의해요.
다음 표는 StorageClass 매개변수와 PVC 어노테이션이 상호작용하는 방식을 보여줘요.
| PVC 어노테이션 | StorageClass 매개변수 | 결과 |
|---|---|---|
| 설정 안 함 | 설정 안 함 | 스로틀링 활성화(기본값) |
| 설정 안 함 | "false" |
스로틀링 비활성화 |
"false" |
"true" 또는 설정 안 함 |
스로틀링 비활성화 |
"true" |
"false" |
스로틀링 활성화 |
스로틀링되지 않은 StorageClass 만들기
StorageClass의 모든 볼륨에 대해 스로틀링을 비활성화하려면:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ec2-instance-store-unthrottled
provisioner: lis.csi.aws.com
parameters:
throttling: "false"
volumeBindingMode: WaitForFirstConsumer
단일 PVC의 스로틀링 비활성화
스로틀링된 StorageClass를 사용하면서 개별 PVC의 스로틀링을 비활성화하려면:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: high-perf-pvc
annotations:
lis.csi.aws.com/throttling: "false"
spec:
accessModes:
- ReadWriteOnce
storageClassName: ec2-instance-store-sc
resources:
requests:
storage: 100Gi
스로틀링 고려 사항
- 스로틀링은 NVMe 컨트롤러를 공유하는 모든 워크로드에 예측 가능한 성능을 제공하기 위해 기본적으로 활성화돼요.
- 볼륨에서 스로틀링을 비활성화하면 더 많은 I/O 대역폭을 소비할 수 있으며, 이는 같은 컨트롤러의 다른 스로틀링된 볼륨의 성능에 영향을 줄 수 있어요.
- 스로틀링되지 않은 워크로드를 전용 노드에 격리하는 것을 고려하세요.
- 여러 컨트롤러에 걸친 RAID-0 볼륨의 경우 스로틀링이 모든 멤버 파티션에 적용돼요.
- 스로틀 상태는 노드 재부팅에도 유지돼요.
새로 시작된 인스턴스의 NVMe 네임스페이스 변경
로컬 인스턴스 스토리지가 있는 새로 시작된 EC2 인스턴스는 업데이트된 NVMe Identify Controller 및 Identify Namespace 명령 응답을 가져요. 이러한 변경은 EC2 로컬 인스턴스 스토리지에서 NVMe 네임스페이스 관리를 지원해요. 기존 실행 중인 인스턴스는 영향을 받지 않으며, 모든 인스턴스의 수명 주기 동안 값은 안정적으로 유지돼요.
업데이트된 필드 값
같은 유형의 이전 인스턴스와 비교해 새로 시작된 인스턴스에서 다음 필드가 변경됐어요.
- Identify Controller (
nvme id-ctrl)- OACS의 Bit 3: 0에서 1로 변경
- OAES의 Bit 8: 0에서 1로 변경
- NN: 1에서 256 이하의 값으로 변경
- TNVMCAP: 0에서 로컬 스토리지의 실제 크기로 변경
- Identify Namespace (
nvme id-ns)- NVMCAP: 0에서 로컬 스토리지의 실제 크기로 변경
- NGUID: 모두 0에서 유효한 NGUID로 변경
모든 업데이트된 값은 NVMe 사양을 따릅니다.
변경 범위
이러한 변경은 EC2 로컬 인스턴스 스토리지에만 적용돼요. Amazon EBS 볼륨은 영향을 받지 않아요. EBS 볼륨과 로컬 인스턴스 스토리지를 구분하려면 다음 명령을 실행하세요.
sudo nvme list
출력에서:
Amazon Elastic Block Store= EBS 볼륨Amazon EC2 NVMe Instance Storage= 로컬 인스턴스 스토리지
NVMe identify 값 검색
nvme-cli로 이러한 값을 쿼리하려면:
# Identify Controller
sudo nvme id-ctrl /dev/nvme1
# Identify Namespace
sudo nvme id-ns /dev/nvme1n1
필요한 조치
필요한 조치는 없어요. 이러한 변경은 하위 호환되며 NVMe 사양을 따릅니다. 하지만 애플리케이션이나 도구가 NVMe identify 명령의 특정 값을 검증하거나 의존한다면, 새로 시작된 인스턴스의 업데이트된 값과의 호환성을 위해 로직을 검토하세요.