참고
- kubernetes 볼륨 - k8s docs
- K8S PersistentVolume - k8s docs
- 쿠버네티스 - PV(Persistent Volume)와 PVC(Persistent Volume Claim)에 대해 알아보자 - ST-Soul
- [Kubernetes] 쿠버네티스 볼륨 개념 1편 (emptyDir, hostPath) - Nirsa
- [Kubernetes] 쿠버네티스 볼륨 개념 2편 (PersistentVolume, PersistentVolumeClaim) - Nirsa
- 쿠버네티스 #5 - 디스크 (볼륨/Volume) - 조대협
- [K8S] PV & PVC - 폴피드
- 애플리케이션에 대한 AKS의 스토리지 옵션 - Azure Docs
PV 테스트
PV, PVC 구조
먼저 컨테이너 환경에서는 볼륨을 사용해야 stateful 앱을 구동할 수 있다는 건 알고 있습니다.
k8s에 많은 볼륨 유형들 중에서 AzureDisk, AzureFile 를 볼륨으로 사용할 수 있고,
이를 inline 볼륨으로 사용하거나 퍼시스턴트 볼륨으로 사용할 수 있습니다.
inline 볼륨과 퍼시스턴트 볼륨 차이
위 그림에서 윗쪽은 volumes의 타입이 azureDisk 이고, 아랫쪽은 volumes의 타입이 persistentVolumeCalim 입니다.
두 가지 모두 이미 만들어져 있는 AzureDisk의 ID를 연결하는 static 방식이지만 퍼시스턴트 볼륨을 사용하는 쪽이 훨씬 복잡해 보입니다.
어짜피 사용하는 방식은 똑같은데 굳이 복잡하게 퍼시스턴트 볼륨을 사용해야 할 필요가 있을까 싶지만
pod가 scale-out이 되어야 한다면 위 그림의 두 가지 방법(static 방식) 모두 불가능해 보입니다.
scale-out 하기 이전에 이미 스토리지가 생성되어 있어야 하고 해당 스토리지의 ID를 정의하는 PV가 있어야 하기 때문이죠.
이 때 필요한게 볼륨의 동적(dynamic) 프로비전 입니다.
팁 - 볼륨 유형
유형 volume 이름 특징
임시 볼륨 | emptyDir | 개별적인 pod에 적용할 수 있는 volumepod 삭제 시 volume 삭제pod에 여러개의 컨테이너가 정의된 경우 하나의 emptyDir 공유 |
로컬 볼륨 | hostpath | |
local | node의 디스크 사용하기에 pod가 재 실행 되어도 데이터 재 사용 가능nodeSelector를 지정하지 않으면 다른 node에 volume이 할당될 수 있음node의 메트릭을 수집하는 경우에 사용될 수 있음 | |
네트워크 볼륨 | iSCSI | |
NFS | ||
cephFSglusterFS | ||
... | 스토리지 마다 특장점은 있겠지만 기본적으로 stateful 로 사용 가능 | |
네트워크 볼륨(클라우드 종속) | gcePersistentDisk | |
awsEBS | ||
azureDisk | ||
azureFile | ||
... | 스토리지 마다 특장점은 있겠지만 기본적으로 stateful 로 사용 가능 |
PV, PVC 추상화
동적 프로비전을 이야기 하기 전에 PV, PVC의 추상화에 대한 이해가 좀 필요한데요
퍼시스턴트 볼륨은 PV, PVC 인터페이스로 추상화 되어 있습니다.
- 특정 용량의 디스크가 필요하다는 요청서인 PVC (PersistentVolumeClaim)
- 특정 용량을 가진 디스크의 연결 정보인 PV (PersistentVolume)
Pod는 특정 용량의 스토리지가 필요할 뿐 어떠한 종류의 스토리지 인지, 어떻게 연결하는지는 알 수 없어도 PVC에게 스토리지를 달라고 요청만 하면 됩니다.
PV는 특정 스토리지의 연결정보와 용량만 정의 되어 있을 뿐 어떤 Pod에서 스토리지가 필요한지 알 수 없고, PVC의 요청에 의해 스토리지를 제공합니다.
또한 PV와 PVC는 1:1 구조로 바인딩 되며, PVC에 일치하는 PV가 없는 경우 PVC는 무한정 대기하게 됩니다.
말이 길어서 복잡해 보이지만 딱 세 가지에 대한 내용입니다.
- Pod는 PVC에 요청만, 스토리지는 PV에 정의만
- PV와 PVC는 1:1 구조로 바인딩
- PVC의 조건에 맞는 PV가 나타날 때까지 PVC는 대기
Storage Class
다시 동적 프로비전 이야기로 되돌아와서
동적 프로비저닝을 사용하는경우 PVC만 작성해 놓으면 원하는 시점에 PV가 자동으로 생성이 되면서 PVC와 바인딩 됩니다.
여기서 중요한 것은 pvc 정의에서 StorageClassName 필드 입니다.
잠깐! StorageClass가 무엇인지 카페에서의 예시
메뉴
- 아메리카노
- 아이스 아메리카노
- 딸기 라떼
- 바닐라 라떼
위 4개를 판매하는 카페에서
아메리카노 2잔이요, 딸기 라떼 1잔이랑 바닐라 라떼 1잔이요 이런 주문은 가능하지만
메뉴에 없는 수박쥬스 하나 주세요 는 안되는 것처럼
사용하고자 하는 볼륨의 형태를 StorageClass로 미리 준비해 놓아야 합니다.
동적 프로비전을 사용하려면 PVC에 StorageClassName이 정의되어 있어야 합니다,
StorageClassName의 정의가 없으면 기본값인 default class에 정의된 스토리지를 사용하게 됩니다.
주의 : 볼륨을 정적 프로비전으로 하려면 명시적으로StorageClassName을 빈 문자열로 지정해 주어야 합니다.
- 예) StorageClassName: ""
Static, Dynamic 프로비전의 StorageClassName 차이
azureDisk - static
azureDisk - dynamic
Storage Class는 또 다른 스토리지의 명세서로 볼 수 있으며 AKS에서는 기본으로 네 가지의 StorageClass를 제공하고 있습니다.
kubectl get storageclass
Storage Class는 스토리지 종류, volume의 회수 정책 등의 정보를 갖고 있습니다.
kubectl describe storageclass default
Azure Docs의 Storage Class 내용에서는 기본 4가지 클래스를 다음과 같이 설명하고 있습니다.
default | Azure StandardSSD 스토리지를 사용합니다. 볼륨이 삭제되면 Azure Disk도 삭제 됩니다. |
managed-premium | Azure Premium Storage를 사용하여 Managed Disk를 만듭니다. 볼륨이 삭제되면 Azure Disk도 삭제 됩니다. |
azurefile | Azure Standard Storage를 사용하여 Azure Files를 만듭니다. 볼륨이 삭제되면 Azure Files도 삭제 됩니다. |
azurefile-premium | Azure Premium Storage를 사용하여 Azure Files를 만듭니다. 볼륨이 삭제되면 Azure Files도 삭제 됩니다. |
기본으로 제공되는 네 가지 클래스 외 다른 종류의 스토리지가 필요하거나, 볼륨을 사용하는 pod 가 삭제 되더라도 스토리지를 삭제하지 않는 정책이 필요한 경우
StorageClass를 추가로 생성하여 사용할 수 있습니다.
premium SSD를 사용하고, pod가 삭제되어도 volume(AzureDisk)을 유지하는 storage class 생성 예시 입니다.
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: managed-premium-retain
provisioner: kubernetes.io/azure-disk
reclaimPolicy: Retain
parameters:
storageaccounttype: Premium_LRS
kind: Managed
퍼시스턴트볼륨의 반환 정책 - Reclaiming
Storage class를 살펴 보면서 볼륨 회수(Reclaiming) 정책에 대한 이야기가 언급되었습니다.
Reclaiming은 사용자가 볼륨을 더 이상 사용하지 않게 되었을 때(volume에서 claim이 해제, pod 삭제)
볼륨을 어떻게 처리할 것 인지에 대한 정의이고 세 가지 정책이 존재하지만 사실상 두 가지만 사용할 수 있습니다.
- Retain (보존)
- Retain 반환 정책은 리소스를 수동으로 반환할 수 있게 한다.
- PVC가 삭제되면 PV는 여전히 존재하며 볼륨은 "Release" 된 것으로 간주된다.
- 그러나 이전 요청자의 데이터가 여전히 볼륨에 남아 있기 때문에 다른 요청에 대해서는 아직 사용할 수 없다.
- 관리자는 다음 단계에 따라 볼륨을 수동으로 반환할 수 있다.
- PV를 삭제한다.
- PV가 삭제된 후에도 외부 인프라(AWS EBS, GCE PD, Azure Disk, Cinder 볼륨)의 관련 스토리지 자산이 존재한다.
- 관련 스토리지 자산의 데이터를 수동으로 삭제한다.
- 연결된 스토리지 자산을 수동으로 삭제하거나 동일한 스토리지 자산을 재 사용하려는 경우 스토리지 자산 정의로 새 PV를 생성한다.
- Delete (삭제)
- 삭제는 k8s에서 PV오브젝트와 외부 인프라(AWS EBS, GCE PD, Azure Disk, Cinder 볼륨)의 관련 스토리지 자산을 모두 삭제한다.
- 동적으로 프로비저닝된 볼륨은 스토리지클래스의 반환 정책을 상속하며 기본값은 Delete 이다.
- 관리자는 사용자의 기대에 따라 스토리지클래스를 구성해야 한다.
- 그렇지 않으면 PV를 생성한 후 PV를 수정하거나 패치해야 한다.
- Recycle (재활용)
- 경고: Recycle 반환 정책은 더 이상 사용하지 않는다. 대신 권장되는 방식은 동적 프로비저닝을 사용하는 것이다.
현재 NFS 및 HostPath만 재활용을 지원하고, AWS EBS, GCE PD, Azure Disk 및 Cinder볼륨은 삭제를 지원합니다.
스토리지 클래스의 회수 정책 중 recycle로 지정하면 배포시 사용할 수 없다는 오류를 출력합니다.
사용중인 pv, pvc의 보호
pod에서 사용중인 PV, PVC가 실수로 삭제된다면 끔찍한 일이겠죠 여기에 reclaiming 이 Delete 였다면......이런 사고를 방지하는 차원에서 k8s 클러스터에 pv나 pvc를 삭제하는 api가 호출이 되어도 이를 사용중인 pod가 존재하고 있다면 즉시 삭제되지 않고 더 이상 사용되지 않을 때 까지 연기 됩니다.
클러스터에 배포되어 있는 pv, pvc의 설명(describe)을 보면 Finalizers 필드에 protection 이란 값이 포함되어 있습니다.
그리고 Status값이 Terminating 이란 것은 PV, PVC 삭제 요청이 있었으나 Protection에 의해 연기되어 있는 상태를 뜻합니다.
퍼시스턴트 볼륨 클레임 확장
예로 5Gi 볼륨 사용 중에 용량이 추가로 필요한 경우 5Gi 이상으로 상향 조정이 가능합니다. (하향 조정은 안됩니다.)
상향 조정을 가능하게 하려면 스토리지 클래스에 allowVolumeExpansion 필드값이 true 로 지정되어 있어야 합니다.
AzureDisk, AzureFiles는 볼륨 확장이 가능하며 다른 클라우드를 포함한 정보는 Kubernetes Docs에서 확인할 수 있습니다.
볼륨의 접근 모드
AzureDisk는 하나의 pod에만 연결이 가능하고 AzureFile은 여러 pod에서 연결이 가능합니다.
ReadWriteOnce RWO 하나의 노드에서 볼륨을 읽기-쓰기로 마운트할 수 있다.
ReadOnlyMany | ROX | 여러 노드에서 볼륨을 읽기 전용으로 마운트할 수 있다. |
ReadWriteMany | RWX | 여러 노드에서 볼륨을 읽기-쓰기로 마운트할 수 있다. |
Azure에서 사용할 수 있는 스토리지
Volume Plugin ReadWriteOnce ReadOnlyMany ReadWriteMany
AzureDisk | O | X | X |
AzureFile | O | O | O |
개인적으로 퍼시스턴트 볼륨은 여기까지 알면 어느정도 이해하고 테스트 하기에 충분하다고 생각합니다.
k8s 대해 알아가면서 기록이 필요한 것들 발견되면 추가로 작성하도록 하겠습니다.
'IT > Kubernetes' 카테고리의 다른 글
K8S 퍼시스턴트볼륨 테스트 - Azure File (0) | 2023.04.11 |
---|---|
K8S 퍼시스턴트볼륨 테스트 - Azure Disk (0) | 2023.04.11 |
Jenkins로 AKS CI/CD 구축 1/2 - Jenkins 구성 (0) | 2023.04.10 |
K8S 인증서 적용방법 (0) | 2023.04.10 |
K8S 인증서 적용방법 (with selfsigned) (0) | 2023.04.10 |