[k8s] Storage
안녕하세요. CloudNet@ K8S Study를 진행하며 해당 내용을 이해하고 공유하기 위해 작성한 글입니다. DevOps 이정훈님의 도서 ‘24단계 실습으로 정복하는 쿠버네티스’ 의 내용을 바탕으로 스터디를 하며 어떻게 k8s에 적용할지 고민하며 정리해봤습니다.
사전작업
EC2 인스턴스 스토어(임시 블록 스토리지) 설정 작업을 진행합니다.[참고]
인스턴스 스토어는 인스턴스에 블록 수준의 임시 스토리지를 제공합니다.


- 인스턴스 스토어는 스토리지 정보에 출력되지 않습니다.
스토리지 기본
- 파드 내부의 데이터는 파드가 정지되면 모두 삭제됩니다. 즉, 파드가 모두 상태가 없는(Stateless) 애플리케이션입니다.
- 데이터베이스(파드)처럼 데이터 보존이 필요 == 상태가 있는(Stateful) 애플리케이션 → 로컬 볼륨(hostPath) ⇒ 퍼시스턴트 볼륨(Persistent Volume, PV) — 어느 노드에서도 연결하여 사용 가능, 예시) NFS, AWS EBS, Ceph 등
- 파드가 생성될 때 자동으로 볼륨을 마운트하여 파드에 연결하는 기능을 동적 프로비저닝(Dynamic Provisioning)이라고 합니다.
[참고] 스테이트리스(Stateless) Linux 애플리케이션 배포 — 스테이트리스(Stateless) 애플리케이션은 클러스터 또는 영구 스토리지에 데이터 또는 애플리케이션 상태를 저장하지 않는 애플리케이션입니다.
[참고] 스테이트풀(Stateful) 애플리케이션 배포— 스테이트풀(Stateful) 애플리케이션은 서버, 클라이언트, 기타 애플리케이션에서 사용할 수 있도록 영구 디스크 스토리지에 데이터를 저장합니다. 스테이트풀(Stateful) 애플리케이션의 예시로는 데이터가 저장되고 다른 애플리케이션에 의해 검색되는 데이터베이스 또는 키-값 저장소가 있습니다.
[참고] 스토리지 — 김태민 기술 블로그
기본 컨테이너 환경의 임시 디스크 사용
- 파드 삭제 후 다시 생성 후 파일 정보 확인했을 때 이전 기록이 보존되어 있지 않는 것을 확인할 수 있습니다.
호스트 Path 를 사용하는 PV/PVC : local-path-provisioner 스트리지 클래스 배포
- 퍼시스턴트 볼륨의 사용이 끝났을 때 해당 볼륨은 어떻게 초기화할 것인지 별도로 설정할 수 있는데, 쿠버네티스는 이를 Reclaim Policy 라고 부릅니다.
- Reclaim Policy 에는 크게 Retain(보존), Delete(삭제, 즉 EBS 볼륨도 삭제됨) 방식이 있습니다.
PV/PVC 를 사용하는 파드 생성
- 주의 : 볼륨을 binding 하기 위해서는 access Modes 동일하게 설정
hostpath 형태의 데이터 저장소의 문제점 확인
Kubestr & sar 모니터링 및 성능 측정 확인 (NVMe SSD)
- Kubestr 이용한 성능 측정 : local-path 와 NFS 등 스토리지 클래스의 IOPS 차이를 확인
- IOPS(Input/Output Operations Per Second, IOPS)는 HDD, SDD 또는 NVMe등 저장장치의 속도를 나타내는데 사용도는 측정 단위
AWS EBS Controller
- Amazon Elastic Block Store(Amazon EBS) : 고성능 블록 스토리지 서비스로서 Amazon Elastic Compute Cloud(Amazon EC2)용으로 설계
Block Storage : 사용자의 데이터를 volume에 block 단위로 저장하거나 access 하는 스토리지 유형. local disk, san/iSCSI, NTFS, ExtFS, ZFS 등
- 데이터를 스토리지에 저장할 때, block 이라는 일정 크기의 단위로 분할
- 분할된 block은 스토리지에 분산되어 저장
- 각 block은 고유 식별자를 가지고 있음
- 저장된 데이터를 불러올 때는 식별자를 통해 block을 찾아 재조합
- 가장 일반적인 데이터 스토리지 저장 방식 중 하나
- 장점 : 균일하게 block을 분산하여 저장하기 때문에 데이터 입출력에 대한 성능 및 효율이 좋음. 데이터를 사용하는 os 환경과 상관없이 저장 가능. 대규모 트랜젝션을 수행하는 작업에 알맞은 저장방식.
- block storage 사용 형태 : 보통은 전용 block storage 장치를 구축 후 서버와 연동하여 사용. 서버와 storage 구간은 고속 네트워크로 연결하여 공유 스토리지로 사용. san(storage area network) 또는 iSCSI와 같은 네트워크 기반 스토리지 많이 사용
EBS(Elastic Block Storage) : EC2를 위한 비휘발성 블록 스토리지
- 생성 시 할당 받는 용량 만큼만 비용 지불
- api 기반의 볼륨 생성, 연결, 삭제 가능.
- 다양한 타입 지원(Random IO를 위한 SSD, Sequential IO를 위한 HDD)
- 네트워크를 통한 연결(인스턴스 간 연결 및 해제 언제든 가능, 특수한 경우 제외하고 EBS Volume은 동시에 하나의 instance 연결 가능)
- 온라인 변경(디스크 추가 및 scale up)
- EBS 볼륨과 인스턴스는 같은 AZ에 있는 경우에만 연결 가능(EBS는 단일 AZ에서만 사용가능하므로 VM의 AZ가 변경된 경우 기존 EBS의 데이터를 사용할 수 없으므로 EBS 스냅샷을 이용하여 운영하고 VM의 AZ가 변경되면 스냅샷으로 복구함)
- SSD/HDD Type 지원

gp2 I/O Bursting
- gp2 type 경우 할당된 disk 사이즈에 비례하여 기본 보장 IOPS가 자동 결정. 이와 별개로 최대 3000 iops 까지 사용 가능(bursting mode)
- traffic이 몰릴 때, bursting 관련 문제가 생기기 쉬움. iops 관련 이슈는 bursting 관련 문제가 생각하고 gp2 type을 변경하거나 충분한 iops를 보장해주는 것이 중요
- 사용 예 : I/O 집약적 애플리케이션을 위해 클라우드에서 SAN 구축, 관계형 데이터베이스 또는 NoSQL 데이터베이스 실행, 적정 크기의 빅 데이터 분석 엔진
EBS Volume Snapshot : EBS 볼륨을 특정 시간 기준으로 복사한 데이터, EBS 백업 용도로 사용, snapshot 파일은 s3에 저장(여러 AZ에서 사용가능), lifecycle 관리 기능 제공

- Volume (ebs-csi-controller) : EBS CSI driver 는 볼륨 생성 및 파드에 볼륨 연결을 합니다.
- CSI는 Kubernetes가 컨테이너화된 워크로드에 임의의 스토리지 시스템을 노출할 수 있게 해주는 개방형 표준 API입니다.
AWS Volume SnapShots Controller
- volume snapshots 사용
- volume snapshot : EBS 볼륨을 특정 시간 기준으로 복사한 데이터(EBS 백업 용도로 사용, snapshot 파일은 s3에 저장, lifecycle 관리 기능 제공)

EBS Volume Snapshot 동작 방식
- EBS Volume Snapshot 동작 방식 : 마지막 스냅샷 이후 변경분만 저장되는 증분식 백업(incremental) 방식 사용, 볼륨의 데이터 변경 부분만 신규 스냅샷에 저장되며 나머지 부분은 기존 스냅샷을 참조하는 형태
AWS EFS Controller
- Amazon EFS 컨테이너 스토리지 인터페이스(CSI) 드라이버 : Amazon EFS 파일 시스템의 수명 주기를 관리하기 위해 AWS에서 실행되는 Kubernetes 클러스터를 허용하는 CSI 인터페이스를 제공합니다.

- AWS EFS : AWS에서 제공하는 File Storage 서비스로 표준 파일 시스템(NFS v4.0, v4.1), 수천 개의 인스턴스 간 공유 가능, 페타바이트 규모 확장가능, 사용하는 용량에 따른 자동 성능 확장 등 제공

AWS EFS 구조
- EFS 기본 구성은 File system과 Mount target으로 구성됩니다.
- EFS Throughput Mode : Bursting Mode(EFS 기본 모드), Provisioned Mode(기본 처리량을 지정하여 보장 받는 방식)
AWS → EFS → 파일 시스템 : 네트워크 → 탑재 대상 ID 를 확인합니다.

AWS S3
- AWS S3는 AWS에서 제공하는 object storage 서비스입니다.
- 언제 어디서나 원하는 양의 데이터를 저장, 검색할 수 있는 객체 기반 스토리지입니다.
- 무한히 확장 가능한 구조로 bucket은 논리적인 구조입니다. bucket에 저장하는 object 또한 무제한입니다.

blog migration project
written in 2023.3.13
https://medium.com/techblog-hayleyshim/k8s-storage-a0d91cb3ecbf