쿠버네티스 볼륨(Kubernetes Volume)
쿠버네티스 파드 내에서 돌아가는 컨테이너는 고유한 파일 시스템을 가지고 있다. 그러나 컨테이너 내의 디스크에 있는 파일은 임시적이며, 컨터에너가 크래시될 때 파일이 손상된다는 문제가 있다. 그리고 포드 내에서 같이 실행되는 컨테이너 간에 파일을 공유할 필요가 있을 때 문제가 생긴다.
쿠버네티스는 실제 데이터가 있는 디렉토리를 보존하기 위해 저장소 볼륨을 정의한다. 포드에 바인딩 되는 볼륨을 마운트하고 이를 로컬 파일시스템에 있는 것처럼 스토리지에 접근한다. 쿠버네티스에서 사용하가능한 볼륨 타입은 다양하다.
emtpyDir
emptyDir은 포드가 생성될때 생성되고, 포드가 삭제 될 때 같이 삭제되는 임시 볼륨이다. 그리고 emptyDir 볼륨은 이름 그대로 빈 디렉터리로 초기화되는 볼륨이다. 포드 내 모든 컨테이너는 emptyDir 볼륨에서 동일한 파일을 읽고 쓸 수 있으므로, 포드 내에서 실행중인 컨테이너 간 파일을 공유할 때 유용하다.
다음은 멀티 컨테이너로 구성된 포드에서 emptyDir을 마운트하는 yaml 파일의 예시이다.
apiVersion: v1
kind: Pod
metadata:
name: fortune
spec:
containers:
- image: noppy1004/fortune
name: web-generator
volumeMounts:
- name: html
mountPath: /webdata
- image: nginx:1.14
name: web-server
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
readOnly: true
ports:
- containerPort: 80
volumes:
- name: html
emptyDir: {}
hostPath
hostPath 볼륨은 노드의 파일시스템의 디렉토리나 파일을 컨테이너에 마운트해서 사용하는 것이다. 이 볼륨을 사용하면 파드 내 컨테이너 간 데이터를 공유할 수 있을 뿐만 아니라 같은 노드에 실행중인 파드 사이에서도 같은 파일 시스템을 공유할 수 있다. 그러나 포드가 재시작되서 다른 노드로 스케줄링되는 경우애는 그 노드의 hostPath를 사용하기 때문에 이전 데이터를 볼 수 없다는 점을 주의 해야한다.
다음은 hostPath를 사용한 예시이다.
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- image: nginx:1.14
name: nginx
ports:
- containerPort: 80
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
readOnly: true
volumes:
- name: html
hostPath:
path: /webdata
Persistent Volume & Persistent Volume Claim
쿠버네티스는 스토리지 구성과 애플리케이션 운영을 분리하여 적용할 수 있도록 지원하고 있다. 인프라 관련 운영은 시스템 운영자가 설정하도록 하고, 개발자는 애플리케이션에 필요한 볼륨을 요청하여 바로 사용할 수 있도록 지원하는 것이다. 시스템 운영자는 PersistentVolume(PV)으로 쿠버네티스에 볼륨을 등록하고, 개발자는 PersistentVolumeClaim(PVC)를 통해 시스템 운영자가 생성한 PV와 마운트한다.
다음은 PV의 예시이다.
- Capacity는 볼륨의 용량을 정의한다.
- Access Mode
ReadWriteOnce(RWO): 단일 노드에서 읽기/쓰기 마운트 가능
ReadOnlyMany(ROX): 다수 노드에서 읽기 전용으로 마운트 가능
ReadWriteMany(RWX): 다수 노드에서 읽기/쓰기 마운트 가능
- Reclaim Policy(persistentVolumeReclaimPolicy): PV는 연결된 PVC가 삭제된 후 다른 PVC에 의해 재사용이 가능하다.
그러므로 디스크의 내용을 그대로 유지할지, 지울지 등에 대한 정책을 Reclaim Policy를 이용하여 설정 가능하다.
Retain: PV 내용을 삭제하기 않고 유지한다. 수동으로 회수가 필요한 볼륨 운영 시 필요하다.
Recycle: 재사용이 가능하며, 재사용 시 데이터의 내용을 자동으로 rm -rf로 삭제한다.
Delete: 볼륨의 사용이 끝나면 해당 볼륨이 삭제된다. (AWS EBS, GCE PD,Azure Disk 등)
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv1
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
- ReadOnlyMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /pv1
server: 172.17.0.2
다음은 PVC의 예시이다.
클러스터 사용자가 포드 중 하나에서 PV를 사용해야 할 경우, 최소 크기와 Access mode를 지정해 PVC를 생성한다. 이후에 PVC를 포드 내부의 볼륨으로 마운트하여 사용할 수 있다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc1
spec:
resources:
requests:
storage: 1Gi
accessModes:
- ReadWriteOnce
- ReadOnlyMany
storageClassName: manuel
다음은 포드에서 PVC를 사용하는 예시이다.
포드가 실행될 때 할당된 PVC는 볼륨을 해재할 때까지 다른 포드가 할당해서 사용할 수 없다.
apiVersion: v1
kind: Pod
metadata:
name: pvc-pod
spec:
- image: nginx
name: web-server
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
ports:
- containerPort: 80
volumes:
- name: html
persistentVolumeClaim:
claimName: pvc1