Day 5 - Kubernetes Volume
Day 5 - Kubernetes Volume
목차
- 1. Pod Volume - emptyDir
- 2. 컨테이너 유지 - sleep command
- 3. hostPath 볼륨
- 4. PersistentVolume 생성
- 5. PersistentVolumeClaim 생성
- 6. Pod - PVC 연동
- 7. PV/PVC 매칭 실습
1. Pod Volume - emptyDir

두 컨테이너가 emptyDir 볼륨을 공유하는 예제
spec:
containers:
- name: pod-temp-1
image: ubuntu:24.04
volumeMounts:
- name: pod-vol
mountPath: /data1
- name: pod-temp-2
image: ubuntu:24.04
volumeMounts:
- name: pod-vol
mountPath: /data2
volumes:
- name: pod-vol
emptyDir: {}
# 컨테이너 1에서 파일 생성
kubectl exec -it pod-temp -c pod-temp-1 -- bash -c "echo 'Hello' > /data1/a.txt"
# 컨테이너 2에서 확인
kubectl exec -it pod-temp -c pod-temp-2 -- cat /data2/a.txt
2. 컨테이너 유지 - sleep command

command: ["/bin/sh", "-c", "sleep infinity"]
command vs stdin/tty
| 항목 | command | stdin/tty |
|---|---|---|
| 컨테이너 유지 | sleep infinity | 터미널 대기 |
| 리소스 | sleep 프로세스 | 입력 대기 |
3. hostPath 볼륨

노드의 파일 시스템을 Pod에 마운트
volumes:
- name: pod-vol
hostPath:
path: /home/pista/pub
type: DirectoryOrCreate
# 노드에서 파일 생성
ssh k8s-n2 'echo "<h1>Hello!</h1>" > /home/pista/pub/index.html'
# Pod에서 확인
curl http://<PodIP>:80
emptyDir vs hostPath
| 항목 | emptyDir | hostPath |
|---|---|---|
| 저장 위치 | Pod 내부 | 노드 파일시스템 |
| Pod 삭제 시 | 데이터 삭제 | 데이터 유지 |
4. PersistentVolume 생성

apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-1
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
storageClassName: local-storage
local:
path: /DATA1
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- {key: kubernetes.io/hostname, operator: In, values: [k8s-n1]}
Access Modes
| 모드 | 약자 | 설명 |
|---|---|---|
| ReadWriteOnce | RWO | 단일 노드 읽기/쓰기 |
| ReadOnlyMany | ROX | 다중 노드 읽기 |
| ReadWriteMany | RWX | 다중 노드 읽기/쓰기 |
5. PersistentVolumeClaim 생성

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-1
spec:
accessModes:
- ReadWriteOnce
storageClassName: local-storage
resources:
requests:
storage: 1Gi
PV vs PVC
| 항목 | PV | PVC |
|---|---|---|
| 역할 | 스토리지 제공 | 스토리지 요청 |
| 범위 | Cluster | Namespace |
| 관리자 | 인프라 관리자 | 개발자 |
6. Pod - PVC 연동

volumes:
- name: pod-vol
persistentVolumeClaim:
claimName: pvc-1
# 노드에 디렉토리 생성
ssh k8s-n1 "sudo mkdir /DATA1"
# 파일 생성
ssh k8s-n1 'sudo bash -c "echo \"<h1>Hello from PV!</h1>\" > /DATA1/index.html"'
# 확인
curl http://<PodIP>
7. PV/PVC 매칭 실습

PV 4개, PVC 5개 생성 시 매칭 결과
| PVC | StorageClass | 상태 | 연결된 PV |
|---|---|---|---|
| pvc-1 | local-storage | Bound | pv-1 |
| pvc-2 | local-storage | Bound | pv-2 |
| pvc-3 | local-storage | Bound | pv-3 |
| pvc-4 | local-storage-2 | Bound | pv-4 |
| pvc-5 | local-storage-2 | Pending | 없음 |
pvc-5는 매칭할 PV가 없어서 Pending 상태
