728x90
반응형
SMALL
학습내용
- k8s 볼륨
- Persistent Volumes (PV) 및 Persistent Volume Claims (PVC)
- 실습
학습정리
1. k8s 볼륨
Pod내의 하나 이상의 컨테이너가 사용할 수 있는 데이터 저장공간
Pod의 일부로서 컨테이너가 종료되거나 재시작 될 때 데이터를 유지 할 수 있게 해준다.
유형
- emptyDir
- 임시 데이터를 저장하기 위한 볼륨으로, Pod가 할당될 때 생성되고 Pod가 삭제될 때 사라집니다.
- Pod 재시작 시 데이터는 유지되지만, Pod 삭제 시 데이터는 손실됩니다.
- 주로 메모리와 디스크를 함께 이용하는 빠른 데이터 처리가 필요할 때 사용됩니다 (예: 작업 파일, 캐시)
apiVersion: v1 kind: Pod metadata: name: kubernetes-simple-pod spec: containers: - name: kubernetes-simple-pod image: arisu1000/simple-container-app:latest volumeMounts: - mountPath: /emptydir name: emptydir-vol volumes: - name: emptydir-vol emptyDir: {}
- hostPath
- 노드의 파일 시스템에 있는 파일이나 디렉토리를 Pod에 마운트합니다.
- emptyDir이 단순히 컨테이너를 재시작했을 때 데이터를 보존하는 역할이라면 hostPath는 pod를 재시작했을 때도 호스트에 데이터가 남습니다.
- 로그 파일, Docker 이미지 등 노드 레벨에서 유지해야 하는 데이터에 사용됩니다.
apiVersion: v1 kind: Pod metadata: name: kubernetes-hostpath-pod spec: containers: - name: kubernetes-hostpath-pod image: arisu1000/simple-container-app:latest volumeMounts: - mountPath: /test-volume name: hostpath-vol ports: - containerPort: 8080 volumes: - name: hostpath-vol hostPath: path: /tmp # macOS Big Sur는 /private/tmp로 설정 type: Directory
- NFS (Network File System)
- 네트워크를 통해 접근 가능한 외부 파일 시스템에 데이터를 저장합니다.
- 여러 Pod가 같은 NFS 볼륨에 접근하여 데이터를 공유할 수 있습니다.
- 데이터 중심 애플리케이션에 적합하며, 영구적 데이터 저장이 가능합니다.
apiVersion: apps/v1 kind: Deployment metadata: name: nfs-server labels: app: nfs-server spec: replicas: 1 selector: matchLabels: app: nfs-server template: metadata: labels: app: nfs-server spec: containers: - name: nfs-server image: arisu1000/nfs-server:latest ports: - name: nfs containerPort: 2049 - name: mountd containerPort: 20048 - name: rpcbind containerPort: 111 securityContext: privileged: true volumeMounts: - mountPath: /exports name: hostpath-vol volumes: - name: hostpath-vol hostPath: path: /tmp # macOS Big Sur는 /private/tmp로 설정 type: Directory
- emptyDir
볼륨과 Pod 생명주기
- 볼륨의 생명주기는 사용하는 Pod에 의해 관리
- emptyDir은 Pod의 생명주기에 종속되며, Pod 삭제시 함께 삭제
- hostPath, NFS는 같은 외부 볼륨 Pod 의 생명주기와 독립적으로 존재 할 수 있음.
볼륨과 Pod 연결
- 볼륨은 Pod 사양 내에서 정의되며, 하나 이상의 컨테이너에서 마운트하여 사용할 수 있습니다.
- 볼륨은 Pod가 존재하는 동안 유지되며, 컨테이너 재시작 후에도 데이터가 유지됩
2. Persistent Volumes (PV) 및 Persistent Volume Claims (PVC)
- Persistent Volumes (PV)
- 클러스터 내에서 사용자나 파드가 아닌 관리자에 의해 생성되는 스토리지의 일부
- 네트워크 디스크,iSCSI 또는 클라우드 제공자의 스토리지 시스템과 같은 외부 스토리지를 포함 할수 있으며, 데이터의 영구성을 보장
- PV와 일반 볼륨의 차이
- 일반 볼륨은 파드에 직접 정의하고, 파드와 함께 생성 및 삭제
- PV는 파드와 독립적으로 존재하며 파드가 삭제 되어도 데이터 유지
- PV는 클러스터 전체에서 사용할 수 있으며, 다양한 파드와 재사용 가능
- Persistent Volume Claims (PVC)
- 사용자가 스토리지를 요청하는 방법
- 사용자는 필요한 스토리지의 크기와 접근 모드를 PVC를 통해 정의
- Kubernetes는 해당 요구사항을 만족하는 PV를 찾아 바인딩
- PVC는 PV에 대한 요청을 나타내며, 한번 바인딩 되면 해당 PV는 다른 PVC에 의해 요청 될 수 없음
- PV와 PVC 관계
- PV와 PVC는 분리된 생명주기를 가지며, PVC를 통해 동적으로 또는 사전 프로비저닝된 PV에 접근 할 수 있다.
- PVC가 삭제되면 반환된 PV는 다시 사용하거나 정책에 따라 처리
- PV 와 PVC 라이프 사이클
- 프로비저닝
- PV를 만드는 단계
- 프로비저닝 종류
구분 정적 프로비저닝 동적 프로비저닝 PV 생성 관리자가 미리 생성 필요할 때 자동 생성 PVC 요청 시 미리 만들어진 PV와 매칭 StorageClass를 통해 PV 자동 생성 유연성 낮음 (미리 준비해야 함) 높음 (자동 생성 가능)
- 프로비저닝
바인딩
- PV와 PVC 연결하는 단계
- PVC에서 원하는 PV가 없으면 요청은 실패 -> 요청에 맞는 PV가 생기면 대기하다가 바인딩
사용
- PVC는 파드에 설정되고 파드는 PVC를 볼륨으로 인식해 사용
반환
사용이 끝난 PVC는 삭제되고 PV를 초기화 과정을 거침
초기화 정책
Retain (보존)
- PVC가 삭제되더라도 PV는 유지
- PV는 ‘Released’ 상태로 변경되며, 기존 데이터 보존한채 새로운 PVC와 자동로 바인딩 되지 않음.
- 관리자가 수동으로 기존 데이터 정리하거나 삭제 해야함.
apiVersion: v1 kind: PersistentVolume metadata: name: my-retain-pv spec: capacity: storage: 5Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain # 보존 정책 storageClassName: manual hostPath: path: "/mnt/data"
Delete (삭제)
PVC가 삭제될 때 PV도 함꼐 삭제
스토리지 프로비저너가 있는 경우 자동으로 동작하며, 클라우드 기반 스토리지에서 자주 사용됨.
# AWS EBS 사용 예시 apiVersion: v1 kind: PersistentVolume metadata: name: my-delete-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Delete # 삭제 정책 storageClassName: gp2 awsElasticBlockStore: volumeID: vol-0abcd1234 fsType: ext4
Recycle (재사용)
- Kubernetes 1.11 이후 Deprecated 됨.
- PVC가 삭제 될 때, PV의 데이터를 삭제하고 초기화 한 후 다른 PVC에 다시 사용할 수 있도록 처리
정책 비교
반환 정책 동작 방식 데이터 보존 여부 사용 사례 Retain PVC 삭제 후에도 PV 유지됨. 관리자가 수동으로 정리해야 함. ✅ 보존됨 데이터베이스, 로그 파일 등 중요한 데이터 유지 필요 Delete PVC 삭제 시 PV도 자동 삭제됨. ❌ 삭제됨 클라우드 환경에서 일회성 데이터 사용 (AWS EBS, GCP PD) Recycle (Deprecated) PVC 삭제 시 PV 초기화 후 다시 사용 가능 ❌ 삭제됨 Kubernetes 1.11 이전에서 사용 가능, 현재는 Retain 방식 권장
3. PV 및 PVC 실습
PV yaml 파일 작성
apiVersion: v1 kind: PersistentVolume metadata: name: my-pv spec: capacity: storage: 1Gi # 1Gi 스토리지 할당 accessModes: - ReadWriteOnce # 한개의 노드에서만 읽기/쓰기 가능 persistentVolumeReclaimPolicy: Retain # 정책 보존 storageClassName: manual hostPath: path: "/mnt/data" # minikube 노드 내부의 해당 경로에 데이터 저장
PV 생성
kubectl apply -f pv.yaml
해당 PV 사용하는 PVC yaml 파일 작성
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: accessModes: - ReadWriteOnce # 단일 노드에서 읽기/쓰기 가능 resources: requests: storage: 500Mi # 500Mi 스토리지 요청 storageClassName: manual # PV와 일치하도록 설정
PVC 생성
kubectl apply -f pvc.yaml
해당 PVC 사용하는 Pod 작성
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: busybox command: ["/bin/sh", "-c", "echo 'Hello Minikube!' > /mnt/data/test.txt && sleep 3600"] volumeMounts: - name: my-storage mountPath: /mnt/data volumes: - name: my-storage persistentVolumeClaim: claimName: my-pvc
파드 실행 및 마운트 확인
kubectl apply -f pod.yaml # Pod 내부에서 볼륨이 정상적으로 마운트 되었는지 확인 kubectl exec -it my-pod -- cat /mnt/data/test.txt
728x90
반응형
LIST
'TIL' 카테고리의 다른 글
11_1.ElasticSearch 아키텍처 이해 (0) | 2025.03.06 |
---|---|
10_5.k8s ide 도구인 lens를 통해이벤트 로깅 실습 (0) | 2025.03.06 |
10_3.k8s Service 및 Ingress 컨트롤러 실습 (0) | 2025.03.03 |
10_2.k8s Pod와 Deployment 관리 실습 (1) | 2025.02.27 |
10_1.Kubernetes 개념 및 Minikbue 설치 및 구성 (0) | 2025.02.24 |