Kubernetes

Kubernetes - PV (with Azure)

rygus 2025. 10. 7. 23:51
728x90

안녕하세요. 

오늘은 쿠버네티스에서 스토리지로 사용되는 Persistent Volume에 대해 알아보겠습니다. 

# Persistent Volume 이란? 

파드는 기본적으로 생성되었다 삭제되었다를 반복합니다. 

삭제될 때마다 파드에 저장된 데이터도 삭제된다면 서비스를 운영하는 입장에서는 굉장히 불편하고 비효율적일 것입니다.

 

이럴 때 사용가능한 것이 Persistent Volume(PV) 입니다. 

영어 뜻은 영구적인 볼륨이라는 의미로 

PV는 외부의 다양한 스토리지 서비스를 통해 파드가 삭제돼도 데이터를 보존할 수 있게 합니다. 

위 그림과 같이 클러스터 외부의 서버에 데이터를 저장하는 것이 가능합니다. 

파드에서 PV에 접근하기 위해서 PVC라는 것이 필요합니다. 

Persistent Volume Claim의 준말로 PV와 파드를 연결하는 역할을 합니다. 

그리고 PV의 용량이 100GB 라고 하였을 때 파드에서 이걸 모두 사용하지 않고 PVC를 이용하여 일부만 덜어서 10GB 정도만 사용하는 것도 가능합니다. 

 

# 테스트

Azure Kubernetes Service에서 PV를 생성해 보겠습니다.

방법은 크게 Azure File Share를 이용하는 방법과 Azure DISK를 이용하는 방법 두 가지가 있습니다.

Azure DISK를 이용하는 방법은 또 두 가지로 나뉘어 정적인 방법과 동적인 방법으로 나뉩니다. 

 

정적인 방법

정적인 방법은 Azure DISK를 생성 후 쿠버네티스 내부에서 직접 PV,PVC를 생성하는 방법입니다. 

 

애저 포탈에서 "디스크"를 생성하겠습니다.

"만들기"를 클릭합니다.

 

사실 아무렇게나 만들어도 되는데 그냥 가장 저렴한 HDD LRS로 생성하겠습니다. 

 

정상적으로 생성이 완료되었으면 본격적으로 PV를 생성해 보겠습니다. 

 

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-azuredisk
spec:
  capacity:
    storage: 32Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  csi:
    driver: disk.csi.azure.com
    volumeHandle: "<disk resource id>"
    volumeAttributes:
      fsType: ext4

 

`kubectl apply -f pv.yml` 명령어로 생성하겠습니다.

 

persistentVolumeReclaimPolicy 

  • Retain : PVC가 삭제되어도 PV는 보존
  • Delete : PVC가 삭제되면 PV도 같이 삭제
  • Recycle : PVC가 삭제되면 PV의 데이터만 삭제하고 PV는 보존

accessModes

  • ReadWriteOnce : 하나의 노드에서 해당 볼륨이 읽기-쓰기로 마운트 될 수 있다.
  • ReadWriteOnce  : 접근 모드에서도 파드가 동일 노드에서 구동되는 경우에는 복수의 파드에서 볼륨에 접근할 수 있다.
  • ReadOnlyMany : 볼륨이 다수의 노드에서 읽기 전용으로 마운트 될 수 있다.ReadWriteMany볼륨이 다수의 노드에서 읽기-쓰기로 마운트 될 수 있다.
  • ReadWriteOncePod : 볼륨이 단일 파드에서 읽기-쓰기로 마운트 될 수 있다. 전체 클러스터에서 단 하나의 파드만 해당 PVC를 읽거나 쓸 수 있어야 하는 경우 ReadWriteOncePod 접근 모드를 사용한다.
    이 기능은 CSI 볼륨과 쿠버네티스 버전 1.22+ 에서만 지원된다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-azuredisk
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
  volumeName: pv-azuredisk
  storageClassName: managed-csi
  storageClassName: ""

`kubectl apply -f pvc.yml` 명령어로 생성하겠습니다. 

 

storageClassName : PV와 연결되기 위해서는 같은 스토리지 클래스를 지정해야 합니다. 그러나 PV에서 따로 storageclass를 지정하지 않았으므로 pvc도 지정하지 않겠습니다.

apiVersion: v1
kind: Pod
metadata:
  name: azpod
spec:
  containers:
  - name: mypod
    image: nginx:1.17
    volumeMounts:
    - name: azure
      mountPath: /mnt/azure
  volumes:
  - name: azure
    persistentVolumeClaim:
      claimName: pvc-azuredisk

`kubectl apply -f pod.yml` 로 배포하겠습니다. 

 

이제 파드 내부에 접근해보겠습니다. 

`kubectl exec -it azpod -- bash` 명령어로 접근합니다. 

정상적으로 배포가 되어 있는 것을 확인 가능합니다.

동적인 방법

다음으로는 동적인 방법이 있습니다. 

이 방법이 훨씬 쉽습니다. 

테스트하기 전 먼저 `StorageClass`를 알아야 합니다.

StorageClass는 일종의 템플릿입니다. 

저희가 앞서 진행한 방식은 disk를 생성하고 따로 pv도 만들었습니다. 

하지만 이 StorageClass라는 친구를 사용하면 따로 disk를 생성하고 pv를 생성할 필요 없이 PVC만 만들어도 알아서 PV까지 생성되게 됩니다. 

AKS에서는 이러한 StorageClass를 이미 갖고 있기 때문에 저희는 그냥 갔다 쓰기만 하면 됩니다. 

 

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: azure-managed-disk
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: managed-csi
  resources:
    requests:
      storage: 5Gi

`kubectl apply -f pvc.yml` 로 배포하겠습니다.

apiVersion: v1
kind: Pod
metadata:
  name: azpod2
spec:
  containers:
  - name: azpod
    image: nginx:1.17
    volumeMounts:
    - name: azure
      mountPath: /mnt/azure
  volumes:
  - name: azure
    persistentVolumeClaim:
      claimName: azure-managed-disk

`kubectl apply -f pod.yml`로 배포하겠습니다.

 

 

저희는 분명히 PVC만 생성했음에도 PV까지 생성되어 있는 것을 확인 가능합니다.

그리고 저희가 생성하지도 않은 DISK도 생성되어 있습니다. 

`kubectl exec -it azpod -- bash` 명령어로 파드 내부로 접근하겠습니다.

정상적으로 /mnt/azure 폴더에 마운트 되어 있는 것을 확인 가능합니다. 

 

감사합니다. 

 

참조 :

https://learn.microsoft.com/ko-kr/azure/aks/azure-csi-disk-storage-provision

 

AKS(Azure Kubernetes Service)에서 Azure Disks를 사용하여 영구 볼륨 만들기 - Azure Kubernetes Service

Azure Disks를 사용하여 AKS(Azure Kubernetes Service)에서 여러 Pod에서 동시에 사용할 정적 또는 동적 영구 볼륨을 만드는 방법을 알아봅니다.

learn.microsoft.com