ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kubernetes PersistentVolumeClaims (PVC) 알아보기
    Kubernetes 2024. 1. 8. 06:49
    728x90
    반응형

    - 목차

     

    함께 보면 좋은 글.

    https://westlife0615.tistory.com/221

     

    Kubernetes Ephemeral Volume

    소개 어플리케이션이 다루는 데이터나 파일의 성격에 따라서 저장소의 종류가 두가지로 나뉩니다. 영구적이어야하는가? 일회성이어도되는가? 영구적인 저장소를 필요로하는 어플리케이션의

    westlife0615.tistory.com

     

    들어가며.

    쿠버네티스는 Pod 가 데이터를 저장하는 방식을 크게 두 부류로 나누었습니다.

    하나는 Ephemeral Volume 이고, 나머지 하나는 Persistent Volume 입니다.

    Ephemeral Volume 은 Pod 와 라이프사이크을 함께하는 볼륨인데요.

    Pod 가 Node 의 파일시스템 일부를 임시적으로 사용하는 형태입니다.

    Pod 가 종료되면 Ephemeral Volume 또한 제거됩니다.

     

    하지만 수많은 어플리케이션들은 프로그램만을 위한 영구적인 볼륨이 필요한 경우가 많습니다.

    이번 글에서는 영구적으로 데이터를 저장할 수 있는 방식인 Persistent Volume Claims 에 대해서 알아보려고 합니다.

     

    Provisioning (프로비저닝).

    프로비저닝은 Persistent Volume 을 생성하는 단계입니다.

    프로비저닝 또한 동적 프로비저닝과 정적 프로비저닝으로 나뉘는데요.

    정적 프로비저닝의 관점에서 먼저 설명하도록 하겠습니다.

    Persistent Volume 은 실질적인 Storege Volume 을 관리하는 쿠버네티스의 리소스입니다.

    Persistent Volume 은 Node 의 파일시스템이나 EBS 와 같은 스토리지와 연결됩니다.

     

    정적 프로비저닝은 아래와 같은 형식으로 구현되는데요.

    관리자에 의해서 Persistent Volume 이 미리 생성됩니다.

    요구사항에 맞게 스토리지의 크기별로 PV1, PV2, PV3 이 미리 생성되어 있습니다.

    이러한 케이스에서 2GB 스토리지가 필요한 Pod 와 PVC 가 생성되면 PVC 는 적절한 PV 와 바인딩됩니다.

     

     

    동적 프로비저닝은 미리 생성되어있는 PV 를 활용하는 방식이 아닙니다.

    PVC 의 요청에 의해서 동적으로 PV 와 Storage 가 프로비저닝됩니다.

     

    바인딩.

    쿠버네티스는 Controller Pattern 을 사용합니다.

    Controller Pattern 은 리소스의 Desired State 와 Current State 를 비교하여 Current State 를 Desired State 로 변경합니다.

    Controller 의 예시로 ReplicaSet Controller 가 대표적입니다.

    ReplicaSet Controller 는 ReplicaSet 의 Pod 의 복제본의 수를 유지시키는 역할을 수행합니다.

    Pod 복제본의 수가 줄어든다면 복제본을 추가하여 Desired State 를 유지하죠.

     

    PVC 또한 PVC Controller 에 의해서 PVC 의 라이프사이클이 관리됩니다.

    바인딩 또한 PVC 의 라이프사이클 중의 하나입니다.

    PVC 가 적절한 PV 에 연결되는 것이 Bound 상태입니다.

    PVC Controller 는 주기적으로 PVC 의 상태를 체크하게 됩니다.

     

    정적 바인딩 예시.

    먼저 1Gi, 2Gi, 3Gi 크기를 가지는 Persistent Volume 3개를 생성합니다.

    cat <<EOF> /tmp/nginx-pv.yaml
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      generateName: nginx-pv-
    spec:
      capacity:
        storage : 1Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteOnce
      storageClassName: standard
      persistentVolumeReclaimPolicy: Delete
      hostPath:
        path: /tmp/nginx
    
    ---
    
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      generateName: nginx-pv-
    spec:
      capacity:
        storage : 2Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteOnce
      storageClassName: standard
      persistentVolumeReclaimPolicy: Delete
      hostPath:
        path: /tmp/nginx
        
    ---
    
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      generateName: nginx-pv-
    spec:
      capacity:
        storage : 3Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteOnce
      storageClassName: standard
      persistentVolumeReclaimPolicy: Delete
      hostPath:
        path: /tmp/nginx
    EOF
    kubectl create -f /tmp/nginx-pv.yaml

     

    kubectl get persistentvolume
    NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
    nginx-pv-jhpms   1Gi        RWO            Delete           Available           standard                11s
    nginx-pv-jmmb8   2Gi        RWO            Delete           Available           standard                11s
    nginx-pv-ttxds   3Gi        RWO            Delete           Available           standard                11s

    PV 가 생성된 이후에 Pod 와 PVC 를 생성해보도록 하겠습니다.

    cat <<EOF> /tmp/nginx-pod.yaml
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: nginx-pvc-3g
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 3Gi
    
    ---
    
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: nginx-pvc-1g
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
    
    ---
    
    apiVersion: v1
    kind: Pod
    metadata:
      generateName: nginx-pod-
    spec:
      containers:
      - name: nginx-container
        image: nginx:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: nginx-storage
      volumes:
      - name: nginx-storage
        persistentVolumeClaim:
          claimName: nginx-pvc-3g
          
    ---
    
    apiVersion: v1
    kind: Pod
    metadata:
      generateName: nginx-pod-
    spec:
      containers:
      - name: nginx-container
        image: nginx:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: nginx-storage
      volumes:
      - name: nginx-storage
        persistentVolumeClaim:
          claimName: nginx-pvc-1g
    EOF
    
    kubectl create -f /tmp/nginx-pod.yaml

     

    < 생성된 Pod >

     

    < 생성된 PVC >

     

    < 정적 바인딩된 PV >

     

    위 이미지처럼 PVC 가 요청하는 Storage Volume 인 1Gi, 3Gi 에 해당하는 PV 가 바인딩됨을 확인할 수 있습니다.

    동적 바인딩 예시.

    Pod 와 PVC 를 생성하여 PVC 의 라이프사이클을 관찰해보도록 하겠습니다.

    cat <<EOF> /tmp/nginx-pod.yaml
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: nginx-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
    
    ---
    
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-pod
    spec:
      containers:
      - name: nginx-container
        image: nginx:latest
        ports:
        - containerPort: 80
      volumes:
      - name: nginx-storage
        persistentVolumeClaim:
          claimName: nginx-pvc
    EOF
    kubectl create -f /tmp/nginx-pod.yaml

     

    위 명령어를 실행하게 되면 Pod, PVC, PV 가 생성됩니다.

    PV 는 동적 프로비저닝에 의해서 자동으로 생성됩니다.

    kubectl get pod 
    NAME                                  READY   STATUS    RESTARTS   AGE
    nginx-pod                             1/1     Running   0          6m31s
    kubectl get persistentvolumeclaims
    NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    nginx-pvc   Bound    pvc-68f70e1b-f3f7-48a1-b8de-01396567a8b9   1Gi        RWO            standard       7m2s
    kubectl get persistentvolume      
    NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   REASON   AGE
    pvc-68f70e1b-f3f7-48a1-b8de-01396567a8b9   1Gi        RWO            Delete           Bound    default/nginx-pvc   standard                7m11s

     

    < Persistent Volume Claims 이미지 >

     

     

     

    반응형
Designed by Tistory.