TIL

10_4.k8s 볼륨, Persistent Volumes, StatefulSets의 이해 및 실습

꿀승 2025. 3. 3. 17:59
728x90
반응형
SMALL

학습내용

  1. k8s 볼륨
  2. Persistent Volumes (PV) 및 Persistent Volume Claims (PVC)
  3. 실습

학습정리

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
  • 볼륨과 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 라이프 사이클
    1. 프로비저닝
      • PV를 만드는 단계
      • 프로비저닝 종류
        구분 정적 프로비저닝 동적 프로비저닝
        PV 생성 관리자가 미리 생성 필요할 때 자동 생성
        PVC 요청 시 미리 만들어진 PV와 매칭 StorageClass를 통해 PV 자동 생성
        유연성 낮음 (미리 준비해야 함) 높음 (자동 생성 가능)
  1. 바인딩

    • PV와 PVC 연결하는 단계
    • PVC에서 원하는 PV가 없으면 요청은 실패 -> 요청에 맞는 PV가 생기면 대기하다가 바인딩
  2. 사용

    • PVC는 파드에 설정되고 파드는 PVC를 볼륨으로 인식해 사용
  3. 반환

    • 사용이 끝난 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