K8s 뉴비의 쿠버네티스 정복기 (4)
3. 디스크 (볼륨/Volume)
볼륨이란 Pod에 종속되는 디스크 (컨테이너 단위 X)
Pod 단위이기 때문에, 그 Pod의 여러 컨테이너가 공유 가능
볼륨 종류
- 볼륨은 여러가지가 존재 : 일반 외장디스크 / Public Cloud에서 제공되는 디스크 / Private Cloud에서 제공되는 디스크
- emptyDir
- Pod 생성시 생성 / 삭제시 삭제되는 임시 볼륨
- 생명 주기는 Pod 단위
- Memory에도 저장 가능
- hostpath
- 노드의 로컬 디스크 경로를 Pod에 마운트하여 사용
- 같은 hostpath에 있는 볼륨은 여러 Pod 사이에서 공유되어 사용 (Node 기반)
- Pod가 삭제되어도 hostpath에 있는 파일들은 삭제되지 않고, 다른 Pod가 마운트하게 되면, 남아있는 파일 엑세스 가능
- Pod가 재시작되어서 다른 Node에서 기동될 경우, 이전 Node의 내용은 당연히 엑세스 불가능 (Node 기반)
- gitRepo
- 생성시 지정된 git repo 특정 리비전을 clone하여 내려받고, 디스크 볼륨 생성
- 물리적으로는 emptyDir이 생성
- html 처럼 정적 언어이거나 스크립트 언어 기반의 코드는 gitRepo 볼륨으로 쉽게 배포 가능
- PersistentVolume and PersistentVolumeClaim
- k8s는 인프라에 대한 복잡성을 추상화하여 간단하게 하고, 개발자들이 손쉽게 필요한 인프라(컨테이너, 디스크, 네트워크)를 설정할 수 있도록 하는 개념을 가지고 있음
- 그래서, 인프라 종속 부분은 시스템 관리자가 하게하고, 개발자는 이에 대한 이해없이 간단하게 사용하라! => PV / PVC
- 실제 물리 디스크 생성 후 PV로 k8s에 등록하고, PVC를 지정하여 관리자가 생성한 PV와 연결
- 주의 : 볼륨은 생성 후에, 직접 삭제하지 않으면 삭제 안됨 : PV 생명주기는 Pod의 생성 / 삭제 관련없이 별도로 관리
- PersistentVolume(PV)
- 물리 디스크를 k8s에 정의
- Capacity : 용량
- VolumeMode : default or raw
- Reclaim Policy : PV는 연결된 PVC 삭제 후 다른 PVC로 재사용 가능한데, 이전 디스크 내용 지울지 유지할지 정책 설정 (Retain/Recycle/Delete)
- AccessMode : PV에 대한 동시에 Pod에서 접근할 수 있는 정책 정의
- ReadWriteOnce(RWO) : PV는 1개 Pod만 마운트 / 1개 Pod에서만 읽고 쓰기 가능
- ReadOnlyMany(ROM) : 여러개 Pod에 마운트 가능, 읽기 가능 / 쓰기는 불가능
- ReadWriteMany(RWM) : 여러개 마운트 가능 / 여러개 동시에 읽고 쓰기 가능
- PV의 라이프사이클
- 생성되면 Avaliable 상태 => 이 상태에서 PVC에 바인딩 되면 Bound 상태로 바뀌고 사용됨
- 바인딩 된 PVC가 삭제되면 PV가 삭제되는 것이 아니라 Released 상태가 됨 : Avaliable이 아니면 사용 불가하고, 보관 상태 됨
- PV 생성(Provisioning)
- 위의 내용을 .yaml 파일로 수동 생성도 할 수 있지만, 필요시 자동 생성 가능(Dynamic Provisioning)
- PersistentVolumeClaim(PVC)
- Pod의 볼륨과 PV를 바인딩하는 관계 선언
- PV 만들고 PVC .yaml로 바인딩 가능
- Dynamic Provisioning
- PVC만 정의하면 이에 맞는 물리 디스크 생성 및 PV 생성 자동화
- 디스크 생성시 필요한 타입 정의 가능 : storageClass (미지정시 디폴트)
- 그냥 PVC 정의하고 필요한 Pod에 바로 바인딩하면 끝!
- Storage Class
- AWS EVS 디스크 / 구글 Persistent Disk
- PVC 정의시 storageClassName에 적으면 PVC와 바인딩됨
출처 - 조대협님 블로그 (https://bcho.tistory.com/1255)
댓글남기기