쿠버네티스의 스토리지 리소스 종류에는 볼륨(volume)과 영구 볼륨(Persistentvolume) 그리고 영구 볼륨 클레임(PersistentVolumeClaim)이 있다. 볼륨은 미리 준비된 사용 가능한 볼륨(호스트 볼륨/nfs/iSCSI/Ceph) 등을 매니페스트에 직접 지정하여 사용할 수 있다. 하지만 쿠버네티스에서 신규 볼륨을 생성하거나 기존 볼륨을 삭제하는 작업은 할 수 없고 매니페스트에서도 볼륨 리소스를 생성하는 것도 불가능하다.
하지만 영구 볼륨은 외부 영구 볼륨을 제공하는 시스템과 연계하여 신규 볼륨을 생성하거나 기존 볼륨을 삭제하는 등의 작업이 가능하다. 영구 볼륨 클레임은 이름 그대로 생성된 영구 볼륨 리소스를 할당하는 리소스다. 영구 볼륨은 클러스터에 볼륨을 등록만 하기 때문에 실제 파드에서 사용하려면 영구 볼륨 클레임을 정의하고 사용해야 한다.
볼륨
쿠버네티스에서는 볼륨을 추상화하여 파드와 느슨하게 결합된 리소스로 정의하고 있다. 영구 볼륨과 다르게 파드에 정적으로 볼륨을 지정하는 형태이므로 플러그인에 따라서는 충돌이 있을 수 있으니 주의해야 한다.
emptyDir
emptyDir은 파드용 임시 디스크 영역으로 사용할 수 있다. 그리고 파드가 종료되면 삭제된다. 파드 안의 컨테이너끼리 생성 시 공유할 파일이 있을 시 자주 사용된다.
apiVersion: v1
kind: Pod
metadata:
name: pod-volume-1
spec:
containers:
- name: container1
image: kubetm/init
volumeMounts:
- name: empty-dir
mountPath: /mount1
- name: container2
image: kubetm/init
volumeMounts:
- name: empty-dir
mountPath: /mount2
volumes:
- name : empty-dir
emptyDir: {}
hostPath
hostPath는 쿠버네티스 노드 상의 영역을 컨테이너에 매핑하는 플러그인이다. emptyDir과 다르게 호스트의 임의 영역을 마운트 할 수 있기 때문에 사용할 때는 호스트의 어떤 영역을 사용할지 지정해야 한다.
apiVersion: v1
kind: Pod
metadata:
name: sample-hostpath
spec:
containers:
- image: nginx:1.16
name: nginx-container
volumeMounts:
- name: hostpath-sample
mountPath: /srv
volumes:
- name: hostpath-sample
hostPath:
path: /etc
type: DirectoryOrCreate
해당 YAML 파일은 호스트의 /etc 디렉터리를 컨테이너의 /srv로 마운트하는 것을 의미한다.
downwardAPI
downwardAPI는 파드 정보 등을 파이로 배치하기 위한 플러그인이다.
apiVersion: v1
kind: Pod
metadata:
name: sample-downward-api
spec:
containers:
- image: nginx:1.16
name: nginx-container
volumeMounts:
- name: downward-api-volume
mountPath: /srv
volumes:
- name: downward-api-volume
downwardAPI:
items:
- path: "podname"
fieldRef:
fieldPath: metadata.name
- path: "cpu-request"
resourceFieldRef:
containerName: nginx-container
resource: requests.cpu
생성 후 파드에는 파드 정보 등이 파일로 배치된다.
영구 볼륨(PV)
영구 볼륨은 영속성 영역으로 확보된 볼륨이다. 영구 볼륨은 기본적으로 네트워크를 통해 디스크를 attach 하는 디스크 타입이다. 영구 볼륨 플러그인에는 GCE Persistent Disk, AWS Elastic Block Store, Azure File, nfs, iSCSI, Ceph 등이 있다.
영구 볼륨을 생성할 때 다음과 같은 항목을 설정할 수 있다
- 레이블
- 용량
- 접근 모드
- Reclaim Policy
- 마운트 옵션
- 스토리지클래스
- 각 플러그인 특유의 설정
다음은 GCE 영구 디스크용 플러그인을 사용한 경우의 매니패스트이다.
apiVersion: v1
kind: PersistentVolume
metadata:
name: sample-pv
labels:
type: gce-pv
environment: stg
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReClaimPolicy: Retain
storageClassName: manual
gcePersistentDisk:
pdNAme: sample-gce-pv
fsType: ext4
레이블
동적 프로비저닝을 사용하지 않고 영구 볼륨을 생성하는 경우 영구 볼륨 종류를 알 수 없게 되기 때문에 레이블을 사용하는 것을 추천한다.
접근 모드는 세 가지가 정의되어 있다.
- ReadWriteOnce(RWO)
- 단일 노드에서 Read/Write 가능
- ReadOnlyMany(ROX)
- 여러 노드에서 Read 가능
- ReadWriteMany(RWX)
- 여러 노드에서 Read/Write 가능
Reclaim Policy는 영구 보륨을 사용한 후 처리 방법(삭제 또는 재사용 등)을 제어하는 정책이다.
- Delete
- 영구 볼륨 자체가 삭제된다
- GCP/AWS/OpenStack 등에서 확보되는 외부 볼륨의 동적 프로비저닝 때 사용되는 경우가 많다
- Retain
- 영구 볼륨 자체를 삭제하지 않고 유지한다
- 또 다른 영구 볼륨 클레임에 의해 이 영구 볼륨이 다시 마운트 되지 않는다
- Recycle
- 영구 볼륨 데이터를 삭제(rm -rf ./*)하고 재사용 가능한 상태로 만든다
- 다른 영구 볼륨 클레임에서 다시 마운트 가능
- 이 정책은 쿠버네티스에서 더 이상 사용하지 않음으로, 대신 동적 프로비저닝을 사용해야 한다
영구 볼륨 클레임(PVC)
영구 볼륨 클레임은 영구 볼륨을 요청하는 리소스다. 영구 볼륨 클레임에서 지정된 조건(용량, 레이블)을 기반으로 영구 볼륨에 대한 요청이 들어오면 스케줄러는 현재 가지고 있는 영구 볼륨에서 적당한 볼륨을 할당한다.
영구 볼륨 클레임을 생성할 때 다음과 같은 항목을 설정할 수 있다
- 레이블 셀렉터
- 용량
- 접근 모드
- 스토리지클래스
모두 영구 보륨에 정의한 값이며 이 영구 볼륨 클레임 요청에 일치하는 영구 볼륨이 할당된다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: sample-pvc
spec:
selector:
matchLabels:
type: gce-pv
matchExpression:
- key: environment
operator: In
values:
- stg
resources:
requests:
storage: 3Gi
accessModes:
- ReadWriteOnce
storageClassName: manual
파드에서 영구 볼륨 클레임을 사용하려면 spec.volumes에 persistentVolumeClaim.claimName을 지정한다.
apiVersion: v1
kind: Pod
metadata:
name: sample-pvc-pod
spec:
containers:
- image: nginx:1.16
name: nginx-container
volumeMounts:
- name: nginx-pvc
mountPath: "/usr/share/nginx/html"
volumes:
- name: nginx-pvc
persistentVolumeClaim:
claimName: sample-pvc
동적 프로비저닝
지금까지 영구 볼륨 클레임에서는 영구 볼륨을 미리 생성해 두고 영구 볼륨 클레임 요청에 따라 볼륨을 할당하는 순서로 진행되었다. 그래서 사전에 영구 볼륨을 생성해야 하는 번거로움과 영구 볼륨 클레임이 요청하는 용량 이상으로 영구 볼륨이 할당되어 낭비가 발생하는 문제가 있었다.
동적 프로비저닝을 사용한 영구 볼륨 클레임의 경우 영구 볼륨 클레임이 생성되는 타이밍에 동적으로 영구 볼륨을 생성하고 할당한다. 동적 프로비저닝을 사용하려면 사전에 어떤 영구 볼륨을 생성할지 정의한 스토리지클래스를 생성해야 한다.
'Kubernetes' 카테고리의 다른 글
쿠버네티스 헬스 체크 (0) | 2022.01.22 |
---|---|
쿠버네티스 리소스 관리 및 오토 스케일링 (0) | 2022.01.08 |
쿠버네티스 컨피그 API (0) | 2022.01.01 |
쿠버네티스 인그레스 (0) | 2022.01.01 |
쿠버네티스 서비스 기능 (0) | 2021.12.01 |