Kubernetes/Kubernetes Best Practices

[Scenario Playbook Ep.4] 🚀 POD 편 #4 | 스토리지 & 데이터 유지

ygtoken 2025. 3. 15. 13:26
728x90

 

쿠버네티스에서 애플리케이션이 데이터를 저장하고 유지하는 방법은 매우 중요합니다.

이번 글에서는 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
728x90