EmptyDir
Pod 내 컨테이너들 간에 데이터를 공유하기 위해 제공되는 임시 스토리지 볼륨
- 볼륨을 컨테이너 파일 시스템의 특정 지점과 연결
- Pod와 같은 라이프사이클을 가짐 (Pod가 삭제되면 볼륨도 삭제)
- 동일 Pod의 컨테이너들이 하나의 볼륨을 공유하도록 할 수 있음

EmptyDir 예시
volumes에 볼륨을 정의하고, VolumesMounts에서 컨테이너의 디렉터리와 볼륨을 마운트
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
volumeMounts:
- name: nginx-volume
mountPath: /data
volumes:
- name: nginx-volume
emptyDir: {}
해당 pod의 볼륨 타입이 EmptyDir로 생성됨
kubectl apply -f emptyDir-pod.yaml
kubectl describe pod nginx

HostPath
Pod의 컨테이너가 노드의 파일 시스템에 직접 접근할 수 있도록 하는 볼륨 타입
- Pod가 호스트의 파일 시스템을 이용하므로 Pod가 삭제되어도 데이터는 보존됨
- Pod가 다른 노드에 스케줄링되면, 기존 노드에 저장된 데이터는 사용할 수 없음
- Pod가 로컬 리소스에 접근할 필요가 있을때 사용
- 일반적으로 특정 노드에서만 Pod가 배치되는 상황에서 사용

hostPath 예시
- volumes에서 호스트 디렉터리의 마운트 지점 지정
- volumeMounts에 컨테이너 디렉터리의 마운트 지점 지정
- type은 DirectoryOrCreate으로 경로가 존재하지 않으면 디렉터리를 생성
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
volumeMounts:
- name: host-volume
mountPath: /data
volumes:
- name: host-volume
hostPath:
path: /tmp/data
type: DirectoryOrCreate
적용하면, 볼륨이 HostPath로 생성됨
kubectl apply -f hostPath-pod.yaml
kubectl describe pod nginx

PV/PVC
PV: 물리적 또는 가상 디스크와 같은 외부 스토리지 자원을 추상화하여, 쿠버네티스 클러스터의 파드에서 사용할 수 있도록 제공
PVC: 파드에서 스토리지 자원을 요청하는 방법
정적(static) 프로비저닝: 클러스터 관리자가 미리 적정 용량의 PV를 만들어 두고 사용자의 요청이 있으면 미리 만들어둔 PV를 할당
동적(dynamic) 프로비저닝: 사용자가 PVC를 거쳐서 PV를 요청했을 때 생성해 제공
바인딩(Binding): 프로비저닝으로 만든 PV를 PVC와 연결하는 단계
- PV와 PVC의 매핑은 1대1 관계
PV 예시
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-hostpath
spec:
capacity:
storage: 1Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: manual
hostPath:
path: /tmp/data
- capacity: PV의 용량
- volumeMode: 볼륨의 유형
- accessModes: PV를 접근하는 모드
- persistentVolumeReclaimPolicy: 사용 후 PV의 상태를 관리하는 정책
- storageClassName: PV가 사용하려는 StorageClass 이름
- hostPath: 로컬 디렉터리를 PV로 사용
PV 적용하고, 생성된 PV 확인하기
kubectl apply -f pv-hostpath.yaml
kubectl get pv

PVC 예시
- storageClassName에 PV에서 지정한 StorageClass 이름 입력
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nginx-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: manual
PV 적용하고, 생성된 PVC 확인하면 생성해둔 PV에 Binding 됨
kubectl apply -f nginx-pvc.yaml
kubectl get pvc

Pod에서 PVC 사용 예시
- persistentVolumeClaim.claimName에 nginx-pvc 지정
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
volumeMounts:
- mountPath: /data
name: pvc-storage
volumes:
- name: pvc-storage
persistentVolumeClaim:
claimName: nginx-pvc
적용하고 확인해보면 PVC에 의해 PV를 할당 받음
kubectl apply -f nginx-pvc-pod.yaml
kubectl describe pod nginx

참고:
https://infosecwriteups.com/kubernetes-container-escape-with-hostpath-mounts-d1b86bd2fa3
'DevOps > Kubernetes' 카테고리의 다른 글
[k8s] RBAC (0) | 2025.02.18 |
---|---|
[k8s] ConfigMap & Secret (0) | 2025.01.09 |
[k8s] Service (0) | 2025.01.09 |
[k8s] Deployment (0) | 2025.01.09 |
[k8s] Pod (0) | 2025.01.09 |