Kubernetes::스토리지 (Storage)

category DevOps/Kubernetes 2023. 12. 19. 23:05
728x90
반응형

Persistent Volumes

POD에서 Volume의 한계는 무엇인가?

  • 대규모 환경에서는 많은 사용자가 많은 POD를 배포하므로 사용자는 각 포드에 대해 매번 스토리지를 구성해야 한다.
  • 어떤 스토리지 솔루션을 사용하든 POD를 배포하는 사용자는 자신의 환경에 있는 모든 포드 정의 파일에서 이를 구성해야 한다.
    변경할 때마다 사용자는 자신의 모든 POD에서 변경해야 한다.

Persistent Volumes은 무엇인가?

  • Persistent Volumes은 클러스터에 애플리케이션을 배포하는 사용자가 사용하도록 관리자가 구성한 클러스터 전체 스토리지 볼륨 Pool이다.
    사용자는 Persistent Volumes Claim을 사용하여 이 Pool에서 스토리지를 선택할 수 있다.

시나리오

Persistent Volume 생성

$ cat > pv-vol.yaml

kind: PersistentVolume
apiVersion: v1
metadata:
  name: pv-vol
spec:
  accessModes: [ "ReadWriteOnce" ]
  capacity:
   storage: 1Gi
  hostPath:
   path: /tmp/data
$ kubectl create -f pv-vol.yaml

persistentvolume/pv-vol creat
  • ReadWriteOnce
    볼륨은 단일 노드에서 읽기-쓰기로 마운트할 수 있다. ReadWriteOnce 액세스 모드는 포드가 동일한 노드에서 실행 중일 때 여러 포드가 볼륨에 액세스하도록 허용할 수 있다.
  • ReadOnlyMany
    볼륨은 많은 노드에서 읽기 전용으로 마운트할 수 있다.
  • ReadWriteMany
    볼륨은 많은 노드에서 읽기-쓰기로 마운트할 수 있다.
  • ReadWriteOncePod
    볼륨은 단일 Pod에서 읽기-쓰기로 마운트할 수 있다. 전체 클러스터에서 하나의 팟(Pod)만 해당 PVC를 읽거나 쓸 수 있도록 하려면 ReadWriteOncePod 액세스 모드를 사용한다. 이는 CSI 볼륨 및 Kubernetes 버전 1.22 이상에서만 지원된다.

Persistent Volume 조회

$ kubectl get pv

NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv-vol   1Gi        RWO            Retain           Available   

Persistent Volume 삭제

$ kubectl delete pv pv-vol

persistentvolume "pv-vol" deleted

Persistent Volume Claims

정의

  • Persistent Volume 및 Persistent Volume Claim은 Kubernetes 네임스페이스에서 두 개의 개별 개체이다.
  • Persistent Volume Claim이 생성되면 Kubernetes는 요청 및 볼륨에 설정된 속성을 기반으로 Persistent Volume Claim에 바인딩한다.

시나리오

PV 생성

$ cat > pv-definition.yaml

kind: PersistentVolume
apiVersion: v1
metadata:
    name: pv-vol1
spec:
    accessModes: [ "ReadWriteOnce" ]
    capacity:
     storage: 1Gi
    hostPath:
     path: /tmp/data
$ kubectl create -f pv-definition.yaml

persistentvolume/pv-vol1 created
$ kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv-vol1   1Gi        RWO            Retain           Available 

PVC 생성

$ cat > pvc-definition.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: myclaim
spec:
  accessModes: [ "ReadWriteOnce" ]
  resources:
   requests:
     storage: 500Mi
$ kubectl create -f pvc-definition.yaml

persistentvolumeclaim/myclaim created
$ kubectl get pvc

NAME      STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
myclaim   Pending                                                     10s

NAME      STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
myclaim   Bound    pv-vol1   1Gi        RWO                           16s

Using PVC in PODs

전제 조건

  • POD는 PVC을 볼륨으로 사용하여 스토리지에 액세스한다. PVC은 클레임을 사용하는 POD와 동일한 네임스페이스에 있어야 한다.
  • 클러스터는 POD의 네임스페이스에서 클레임을 찾고 이를 사용하여 PVC을 지원하는 PV을 가져옵니다. 그러면 볼륨이 호스트와 POD에 마운트된다.
  • PV은 PVC 범위이고 PVC은 네임스페이스 범위이다.

시나리오

PV 생성

$ cat > pv-definition.yaml

kind: PersistentVolume
apiVersion: v1
metadata:
    name: pv-vol1
spec:
    accessModes: [ "ReadWriteOnce" ]
    capacity:
     storage: 1Gi
    hostPath:
     path: /tmp/data
$ kubectl create -f pv-definition.yaml

PVC 생성

$ cat > pvc-definition.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: myclaim
spec:
  accessModes: [ "ReadWriteOnce" ]
  resources:
   requests:
     storage: 1Gi
$ kubectl create -f pvc-definition.yaml

POD 생성

$ cat > pod-definition.yaml

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: myfrontend
      image: nginx
      volumeMounts:
      - mountPath: "/var/www/html"
        name: web
  volumes:
    - name: web
      persistentVolumeClaim:
        claimName: myclaim
$ kubectl create -f pod-definition.yaml

PV, PVC, POD 조회

$ kubectl get pod,pvc,pv

Storage Class

Why Storage Class ?

PVC를 사용해 볼륨을 요청할 수 있으나 PV로 사용할 볼륨을 수동으로 프로비저닝해 하는 어려움
이런 이슈 사항을 해결하기 위하여 자동으로 볼륨을 생성하고 할당하는 StorageClass를 사용하게 됨.
즉, 정적인 방식 (Static Provisioning)에서 동적인 방식 (Dynamic Provisioning)으로 전환을 하기 위함

Storage Class 특징

  • 여러가지 스토리지 유형을 표현하는 것을 말한다.
  • 클러스터 관리자가 정의한 QoS 수준, 백업정책, 기타 정책에 매핑된다.

시나리오

Storage Class 생성

$ cat > sc-definition.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: google-storage
provisioner: kubernetes.io/gce-pd
$ kubectl create -f sc-definition.yaml
storageclass.storage.k8s.io/google-storage created
$ kubectl get sc
NAME             PROVISIONER            RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
google-storage   kubernetes.io/gce-pd   Delete          Immediate           false                  20s

Persistent Volume Claim 생성

$ cat > pvc-definition.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: myclaim
spec:
  accessModes: [ "ReadWriteOnce" ]
  storageClassName: google-storage       
  resources:
   requests:
     storage: 500Mi
$ kubectl create -f pvc-definition.yaml

POD 생성

$ cat > pod-definition.yaml

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: frontend
      image: nginx
      volumeMounts:
      - mountPath: "/var/www/html"
        name: web
  volumes:
    - name: web
      persistentVolumeClaim:
        claimName: myclaim
$ kubectl create -f pod-definition.yaml
728x90
반응형