쿠버네티스에서 애플리케이션이 데이터를 저장하고 유지하는 방법은 매우 중요합니다.
이번 글에서는 PersistentVolumeClaim(PVC)과 HostPath를 활용하여 데이터 유지 방법을 설정하는 방법을 다룹니다.
📌 글에서 다루는 상황들
1️⃣ PersistentVolumeClaim을 사용하는 Pod
2️⃣ HostPath를 이용한 특정 노드 파일 공유
각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.
1️⃣ PersistentVolumeClaim을 사용하는 Pod
📍 상황 설명
운영팀에서 애플리케이션이 재시작되더라도 데이터가 유지되어야 하는 상황이 발생했습니다.
이를 위해 PersistentVolumeClaim(PVC)을 활용하여 스토리지를 유지해야 합니다.
• Pod의 이름은 app-with-pvc이어야 합니다.
• 애플리케이션이 데이터를 /data 디렉터리에 저장해야 합니다.
• PVC를 사용하여 10Gi의 스토리지를 할당해야 합니다.
• 스토리지가 유지되어야 하며, Pod이 재시작되어도 데이터가 삭제되지 않아야 합니다.
🛠️ 해결 방법
1. PersistentVolumeClaim(PVC)을 생성하여 스토리지를 요청해야 합니다.
• spec.resources.requests.storage를 사용하여 필요한 용량(10Gi)을 설정
• storageClassName을 설정하여 동적 프로비저닝이 가능하도록 구성
2. Pod에서 PVC를 마운트하여 데이터를 저장하도록 설정해야 합니다.
• volumeMounts를 사용하여 /data 경로에 스토리지를 연결
✅ 정답 Manifest (PVC를 사용하는 Pod)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc # PVC 이름
spec:
accessModes:
- ReadWriteOnce # 하나의 노드에서만 읽기/쓰기 가능
resources:
requests:
storage: 10Gi # 요청하는 스토리지 크기
storageClassName: standard # 기본 스토리지 클래스 사용
---
apiVersion: v1
kind: Pod
metadata:
name: app-with-pvc # Pod의 이름
spec:
volumes:
- name: persistent-storage
persistentVolumeClaim:
claimName: my-pvc # 위에서 생성한 PVC 사용
containers:
- name: my-app
image: my-app:latest # 애플리케이션 컨테이너
volumeMounts:
- name: persistent-storage
mountPath: /data # 스토리지 마운트 경로
📌 적용 후 예상 결과 값
1) PVC 생성 확인
kubectl get pvc
💡 예상 출력 값
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
my-pvc Bound pv-xyz 10Gi RWO standard 5s
2) Pod 생성 확인
kubectl get pods
💡 예상 출력 값
NAME READY STATUS RESTARTS AGE
app-with-pvc 1/1 Running 0 5s
3) Pod 내부에서 스토리지 연결 확인
kubectl exec -it app-with-pvc -- df -h | grep /data
💡 예상 출력 값
/dev/sdb 10G 0G 10G 0% /data
2️⃣ HostPath를 이용한 특정 노드 파일 공유
📍 상황 설명
로그 수집기가 실행되는 특정 노드에서 애플리케이션이 직접 노드의 파일을 읽어야 하는 상황이 발생했습니다.
이를 위해 HostPath 볼륨을 사용하여 노드의 특정 경로를 Pod에서 마운트해야 합니다.
• Pod의 이름은 app-with-hostpath이어야 합니다.
• 애플리케이션이 노드의 /var/log/app 디렉터리에 접근해야 합니다.
• HostPath를 사용하여 노드의 파일을 직접 읽을 수 있도록 설정해야 합니다.
🛠️ 해결 방법
1. HostPath 볼륨을 사용하여 노드의 특정 디렉터리를 Pod에서 접근할 수 있도록 설정해야 합니다.
• hostPath.path를 지정하여 노드의 경로를 마운트
• type을 설정하여 해당 디렉터리가 존재하는지 확인 (DirectoryOrCreate)
✅ 정답 Manifest (HostPath를 사용하는 Pod)
apiVersion: v1
kind: Pod
metadata:
name: app-with-hostpath # Pod의 이름
spec:
volumes:
- name: host-logs
hostPath:
path: /var/log/app # 노드의 로그 디렉터리
type: DirectoryOrCreate # 디렉터리가 없으면 생성
containers:
- name: my-app
image: my-app:latest # 애플리케이션 컨테이너
volumeMounts:
- name: host-logs
mountPath: /logs # 컨테이너 내부에서 접근할 경로
📌 적용 후 예상 결과 값
1) Pod 생성 확인
kubectl get pods
💡 예상 출력 값
NAME READY STATUS RESTARTS AGE
app-with-hostpath 1/1 Running 0 5s
2) Pod 내부에서 로그 파일 확인
kubectl exec -it app-with-hostpath -- ls /logs
💡 예상 출력 값
app.log
error.log
'Kubernetes > Kubernetes Best Practices' 카테고리의 다른 글
[Scenario Playbook Ep.6] 🚀 Deployment 편 #1 | 배포 전략 및 롤링 업데이트 (0) | 2025.03.15 |
---|---|
[Scenario Playbook Ep.5] 🚀 POD 편 #5 | Pod 스케줄링 & 실행 전략 (0) | 2025.03.15 |
[Scenario Playbook Ep.3] 🚀 POD 편 #3 | 다중 컨테이너 & 초기화 설정 (0) | 2025.03.15 |
[Scenario Playbook Ep.2] 🚀 POD 편 #2 | 리소스 제한 & 특정 노드 실행 (0) | 2025.03.15 |
[Scenario Playbook Ep.1] 🚀 POD 편 #1 | 기본 실행 & 환경 변수 설정 (0) | 2025.03.15 |