쿠버네티스 pv, pvc

greenTea·2023년 9월 6일
0

쿠버네티스의 PersistentVolume (PV) 및 PersistentVolumeClaim (PVC)

🤔쿠버네티스에서 애플리케이션 데이터를 지속적으로 저장하기 위해 사용하는 주요 리소스는 PersistentVolume (PV)PersistentVolumeClaim (PVC)입니다.

예를 들어서 nginx의 index.html의 경우 모두 A라는 이미지를 사용하고 싶다면 각 파드에 들어가서 해당 이미지를 A로 변경하면 됩니다. 그런데 만약에 파드가 문제가 생기거나 업데이틀 하게 되서 종료 하고나서 다시 파드가 새로 생성된 경우 index.html이 그대로 보존되지 않고 기본 nginx index.html로 변경되게 됩니다.

이를 해결하기 위해서는 모두 같은 이미지를 바라 볼 수 있게 하면 되는데 이 때 사용되는 것이 pv, pvc입니다.

pv,pvc를 쉽게 말하자면 pv를 통해 저장소 용량을 설정하고 pvc를 통해 해당 pv에서 일정 부분만큼 가져오는 것입니다.

pv, pvc 생성 및 활용

😑pv를 통해 볼륨을 먼저 생성해야하는데 이 때 만들 수 있는 volume 타입은 여러개가 있습니다.
먼저 pv를 생성해보겠습니다. (아래는 nfs를 기준으로 만든 경우를 표현한 yaml값입니다.)

pv 생성

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs-storage
  nfs:
    path: /path/to/nfs/share
    server: nfs-server.example.com
  • name: PV의 이름은 nfs-pv로 설정되어 있습니다.
  • capacity: 이 PV는 10Gi의 용량을 제공합니다.
  • accessModes: PV는 한 번에 한 파드만 쓰기 액세스를 할 수 있습니다.
  • persistentVolumeReclaimPolicy: PV가 더 이상 사용되지 않을 때 해당 리소스를 유지합니다.
  • storageClassName: 이 PV는 nfs-storage라는 스토리지 클래스를 사용합니다.
  • nfs: NFS 서버의 주소와 공유 경로를 지정합니다.

pvc 생성

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

🤓kubectl get pvc my-pvc,kubectl get pv nfs-pv를 통해 pv와 pvc를 확인해줍니다.

pvc 사용 예시

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nginx-volume
          mountPath: /usr/share/nginx/html
      volumes:
      - name: nginx-volume
        persistentVolumeClaim:
          claimName: my-pvc

🧐nginx를 만드는 deployment입니다. 이 때 volumes를 보시면 위에서 만든 pvc인 my-pvc를 사용하는 것을 확인 할 수 있습니다. /usr/share/nginx/html로 마운트 하였기에 이제 /usr/share/nginx/html에 저장된 값은 pvc에 저장이 된다고 이해하시면 됩니다. 이를 통해 해당 pvc를 사용한다면 모두 같은 값을 사용할 수 있게 됩니다.

한 번 위 내용을 바탕으로 진행 해보세요

  1. 먼저 nginx pod에 들어가서 /usr/share/nginx/html에 있는 index.html의 값을 원하는 값으로 변경합니다.
  2. 이후에 deploy를 모두 변경합니다.(delete를 통해 모든 pod를 삭제하면 자동으로 새로운 pod가 생성이 되니 이를 이용해봅니다.)
  3. kubectl get pods -o wide를 통해 해당 ip를 알아낸 후 curl로 요청을 해봅니다. 이 때 저희가 변경한 값이 나오면 성공입니다.

추가

🫠GKE, EKS등 cloud환경에서는 다른 방식으로 pv,pvc를 생성할 수 있습니다.
기존에는 pv를 먼저 생성 한 후에 pvc를 요청했다면 클라우드 환경에서는 on-demand 방식으로 진행합니다. 이와 같은 방법을 동적 볼륨 프로비저닝이라고 합니다.

1. storageClass 생성

🤗storageClass는 어떤 종류의 스토리지를 사용할 것인지, 그리고 그 스토리지를 어떻게 프로비저닝할 것인지를 정의하는 것으로 이미 name: standard로 만들어져 있습니다. 다른 종류의 스토리지가 필요할 경우 만드시면 됩니다.

스토리지 생성은 아래와 같이 작성하시면 됩니다.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard

(gce에는 이미 standard로 된 스토리지가 존재하기에 에러 문구가 나올 수 있습니다. 꼭 생성 안하셔도 됩니다.)

kubectl get storageclass를 통해 storage를 확인 할 수 있습니다.

저의 경우 아래와 같은 stroageClass가 있습니다.(gke기준)

NAME                     PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
premium-rwo              pd.csi.storage.gke.io   Delete          WaitForFirstConsumer   true                   11d
standard                 kubernetes.io/gce-pd    Delete          Immediate              true                   11d
standard-rwo (default)   pd.csi.storage.gke.io   Delete          WaitForFirstConsumer   true                   11d

2. pvc 생성

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: standard
  resources:
    requests:
      storage: 10Gi

🫠위의 파일을 실행하면 pvc가 생기게 되는데 pv를 생성하지 않고 pvc를 생성하면 알아서 pv를 만들어주는 것을 동적 프로비저닝이라고 합니다. 이 때 원하는 storageClass이름을 적용해서 이용해주시면 됩니다.

🥳동적 프로비저닝 작동원리를 순서대로 작성해보면 다음과 같습니다.

1. 동적 프로비저닝의 작동 방식: StorageClass 동적 프로비저닝을 위해 StorageClass가 필요합니다. StorageClass는 특정 프로비저너와 그 프로비저너의 설정을 명시합니다. 이 프로비저너는 쿠버네티스 클러스터 외부의 스토리지 시스템에 PV를 생성하는 역할을 합니다.

2. PVC 생성: 사용자는 PersistentVolumeClaim (PVC)을 생성하며, 이때 storageClassName을 지정합니다. 이 storageClassName은 동적 프로비저닝을 위한 StorageClass를 가리킵니다.

3. PV 생성: PVC가 생성되면, 지정된 StorageClass의 프로비저너가 호출되어 필요한 스토리지를 프로비저닝하고, 이 스토리지에 연결된 PV를 자동으로 생성합니다.

4. PVC와 PV 바인딩: 생성된 PV는 PVC와 자동으로 바인딩됩니다.

profile
greenTea입니다.

0개의 댓글