볼륨이 필요한 이유
쿠버네티스에서 Pod 내부 컨테이너의 파일 시스템은 컨테이너가 종료되면 함께 사라지는 휘발성 저장소입니다.
따라서 컨테이너 생명주기와 무관하게 데이터를 유지하기 위해서는 별도의 저장공간(Volume) 이 필요합니다.
또한 각 컨테이너 별로 저장소는 공유가 되지 않기 때문에 데이터 공유가 필요할 때도 볼륨이 필요합니다.
볼륨의 두 가지 주요 역할
- 컨테이너 간 임시 저장 공간 공유
- 컨테이너 데이터 영구 저장 공간 제공(중요)
1. 컨테이너 간 임시 공간 공유 (emptyDir)
컨테이너들이 서로 데이터를 주고받아야 하는 경우, Pod가 살아있는 동안만 유지되는 임시 저장소인 emptyDir을 사용할 수 있습니다.
emptyDir은 Pod가 삭제될 때 함께 삭제되지만, 같은 Pod 내에서 컨테이너 재시작 간에는 데이터가 유지되므로 컨테이너 간 공유 용도로 적합합니다.
아래는 두 개의 컨테이너가 emptyDir을 이용해 데이터를 공유하는 예시입니다.
apiVersion: v1
kind: Pod
metadata:
name: my-empty-dir-pod
spec:
volumes:
- name: shared-data-volume
emptyDir: {}
containers:
- name: writer-container
image: busybox
command: ["/bin/sh", "-c", "echo 'Hello from Writer' > /data/message.txt && sleep 3600"]
volumeMounts:
- name: shared-data-volume
mountPath: /data
- name: reader-container
image: busybox
command: ["/bin/sh", "-c", "cat /data/message.txt && sleep 3600"]
volumeMounts:
- name: shared-data-volume
mountPath: /data
설명:
volumes에서emptyDir타입으로 볼륨을 정의합니다.- 각 컨테이너는 동일한 볼륨 이름을
volumeMounts로 마운트 하여 파일을 읽고 씁니다. - Pod가 삭제되면
emptyDir내부 데이터는 사라집니다.
2. 데이터를 영구적으로 저장하기 위한 공간 (PV, PVC)
컨테이너를 재시작하거나 Pod가 재생성되더라도 데이터를 유지하려면 영구 스토리지를 사용해야 합니다.
이때 그 영구 저장소를 PV로 지정하고 Pod와 영구 저장소(PV)를 매칭해 주는 것이 PVC입니다.
PV(Persistent Volume)
실제 저장 장소를 정의한 쿠버네티스 리소스입니다.
저장 장소는 컨테이너 바깥의 아무 저장소나 접근이 가능하다면 다 가능합니다.
특정 VM의 디렉터리로 할당할 수도 있고, NFS와 같은 네트워크 파일 저장소로 할당할 수도 있고, 또는 클라우드 저장소인 AWS EFS, EBS와 같은 공간을 할당할 수도 있습니다.
그리고 이러한 실제 스토리지 공간을 쿠버네티스에서 사용할 수 있도록 등록해 놓는 것이 PV입니다. (프로비저닝)
아래는 10.0.0.11 노드의 /mnt/data1을 PV로 할당하는 간단한 yaml문 예시입니다.
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
nfs:
server: 10.0.0.11
path: "/mnt/data1"
kubectl apply -f <파일명.yaml>로 PV를 등록할 수 있습니다.
PVC(Persistent Volume Claim)
Pod에서 별도의 저장 공간(영구 혹은 공용)이 필요할 때 위에서 선언해 둔 PV에 직접적으로 연결하지는 않습니다.
PVC를 이용하여 Pod는 필요한 공간에 대한 요구 사항만 다음과 같이 작성하면
쿠버네티스가 그 요구를 충족시키는 최적의 PV(저장공간)를 자동으로 Pod에 연결시켜 줍니다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
Pod에 저장소를 물릴 때 다음과 같이 생성된 PVC를 활용합니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-deployment
spec:
# ... (생략: selector, template metadata)
template:
spec:
containers:
- name: my-app-container
image: nginx:latest
# 🌟 1. volumeMounts: PVC를 컨테이너 내부 경로에 연결
volumeMounts:
- name: app-storage # 아래 volumes 이름과 일치
mountPath: /usr/share/nginx/html/data # 컨테이너 내부에서 데이터를 저장할 경로
# 🌟 2. volumes: Pod 레벨에서 PVC를 참조
volumes:
- name: app-storage # volumeMounts 이름과 일치
persistentVolumeClaim:
claimName: my-app-data-claim # 2단계에서 만든 PVC 이름
추가: ReadWriteMany 등 접근 모드 예시
ReadWriteOnce: 한 노드에서만 Read/Write 가능 (많이 사용)ReadOnlyMany: 여러 노드에서 읽기 전용ReadWriteMany: 여러 노드에서 읽기/쓰기 가능 (NFS, GlusterFS 등에서 지원)
PVC 예시에서 accessModes 값을 바꿔 사용 가능합니다.
정리
| 볼륨 종류 | 데이터 유지 범위 | 주요 목적 |
|---|---|---|
| emptyDir | Pod가 살아있는 동안 유지, Pod 삭제 시 삭제 | 컨테이너 간 임시 파일 공유 |
| PersistentVolume(PV) + PVC | Pod 재생성/종료 이후에도 데이터 유지 (스토리지 백엔드에 의존) | 영구 데이터 저장 |
'Kubernetes' 카테고리의 다른 글
| 쿠버네티스 환경에서의 부하분산(로드밸런싱) (0) | 2025.12.12 |
|---|---|
| 쿠버네티스 네트워크 (0) | 2025.12.12 |
| 쿠버네티스 아키텍처 (0) | 2025.12.09 |
| 쿠버네티스 명령어 정리 (kubectl) 및 yaml (0) | 2025.12.08 |
| 쿠버네티스 개념 및 용어 정리 (0) | 2025.12.08 |