✔️ Storage Classes (스토리지 클래스)
PVC를 정의하면, PVC의 내용에 따라서 쿠버네티스 클러스터가 물리 Disk를 생성하고, 이에 연결된 PV를 생성한다.
실제 환경에서는 성능에 따라 다양한 디스크(nVME, SSD, HDD, NFS 등)를 사용할 수 있다.
디스크를 생성할때 필요한 디스크의 타입을 정의할 수 있는데 동적 프로비저닝 방식을 이용하는 것을 storageClass
라고 하고, PVC에서 스토리지 클래스를 지정하면 이에 맞는 디스크를 생성하도록 한다.
개발자는 PVC를 이용해 볼륨을 손쉽게 요청할 수 있지만 운영자는 PV로 사용할 볼륨을 수동으로 프로비저닝 해야 한다.
이러한 불편함을 해결하기 위해 자동으로 볼륨을 생성, 할당하는 StorageClass를 사용한다.
스토리지 클래스를 지정하지 않으면, 기본 스토리지 클래스를 사용하게 된다.
동적 프로비저닝을 위해서는 스토리지 클래스가 필요하다.
PVC에 필요한 디스크 용량을 지정해놓으면, 자동으로 이에 해당하는 물리 디스크 및 PV가 생성된다.
vagrant@k8s-node1 ~ kubectl api-resources | grep storageclass
storageclasses sc storage.k8s.io/v1 false StorageClass
shortname은 sc
이며 storage.k8s.io
그룹에 속하고 NS를 사용하지 않는다.
✔️ 스토리지클래스 리소스
vagrant@k8s-node1 ~ kubectl explain storageclass.
FIELDS:
allowVolumeExpansion <boolean>
allowedTopologies <[]Object>
apiVersion <string>
kind <string>
metadata <Object>
mountOptions <[]string>
parameters <map[string]string>
provisioner <string> -required-
reclaimPolicy <string>
volumeBindingMode <string>
예시 코드
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Retain
allowVolumeExpansion: true
mountOptions:
- debug
volumeBindingMode: Immediate
각 스토리지 클래스에는 해당 스토리지 클래스에 속하는 PV를 동적으로 프로비저닝 할 때 사용되는 provisioner
, parameters
와 reclaimPolicy
필드가 포함된다.
스토리지 클래스 오브젝트의 이름은 중요하며, 사용자가 특정 클래스를 요청할 수 있는 방법이다.
관리자는 스토리지 클래스 오브젝트를 처음 생성할 때 클래스의 이름과 기타 파라미터를 설정하며, 일단 생성된 오브젝트는 업데이트할 수 없다.
관리자는 특정 클래스에 바인딩을 요청하지 않는 PVC에 대해서만 기본 스토리지 클래스를 지정할 수 있다.
가장 중요한 부분은 provisioner
로 다양한 프로비저너가 들어간다.
이를 CSI(Container Storage Interface) Driver
라고 한다.
예시 코드의 kubernetes.io/aws-ebs
는 AWS EBS를 스토리지로 사용하는 동적 프로비저닝 스토리지 클래스이다.
스토리지 클래스에는 스토리지 클래스에 속하는 볼륨을 설명하는 parameters
가 있다.
provisioner
에 따라 다른 parameters
를 사용할 수 있다.
예를 들어, type
에 대한 값 io1
과 iopsPerGB
는 EBS에만 사용할 수 있다. parameters
생략 시 일부 기본값이 사용된다.
스토리지클래스에 대해 최대 512개의 parameters
를 정의할 수 있다.
키와 값을 포함하여 parameters
오브젝터의 총 길이는 256 KiB를 초과할 수 없다.
✔️ 프로비저너
각 스토리지클래스에는 PV 프로비저닝에 사용되는 볼륨 플러그인을 결정하는 프로비저너가 있다.
이 필드는 반드시 지정해야 한다.
원래 동적 프로비저닝은 클라우드를 위해 만들어졌던 것이다.
다양한 프로비저너
볼륨 플러그인 | 내부 프로비저너 | 설정 예시 |
AWSElasticBlockStore | ✓ | AWS EBS |
AzureFile | ✓ | Azure 파일 |
AzureDisk | ✓ | Azure 디스크 |
CephFS | - | - |
Cinder | ✓ | OpenStack Cinder |
FC | - | - |
FlexVolume | - | - |
Flocker | ✓ | - |
GCEPersistentDisk | ✓ | GCE PD |
Glusterfs | ✓ | Glusterfs |
iSCSI | - | - |
Quobyte | ✓ | Quobyte |
NFS | - | NFS |
RBD | ✓ | Ceph RBD |
VsphereVolume | ✓ | vSphere |
PortworxVolume | ✓ | Portworx 볼륨 |
ScaleIO | ✓ | ScaleIO |
StorageOS | ✓ | StorageOS |
Local | - | Local |
✔️ 볼륨 확장 허용
퍼시스턴트볼륨은 확장이 가능하도록 구성할 수 있다. 이 기능을 true 로 설정하면 해당 PVC 오브젝트를 편집하여 볼륨 크기를 조정할 수 있다.
다음 볼륨 유형은 기본 스토리지클래스에서 allowVolumeExpansion 필드가 true로 설정된 경우 볼륨 확장을 지원한다.
대부분의 클라우드 스토리지들은 지원한다.
볼륨 유형 | 요구되는 쿠버네티스 버전 |
gcePersistentDisk | 1.11 |
awsElasticBlockStore | 1.11 |
Cinder | 1.11 |
glusterfs | 1.11 |
rbd | 1.11 |
Azure File | 1.11 |
Azure Disk | 1.11 |
Portworx | 1.11 |
FlexVolume | 1.13 |
CSI | 1.14 (alpha), 1.16 (beta) |
참고: 볼륨 확장 기능을 사용해서 볼륨을 확장할 수 있지만, 볼륨을 축소할 수는 없다.
✔️ 볼륨 바인딩 모드
volumeBindingMode
필드는 볼륨 바인딩과 동적 프로비저닝의 시작 시기를 제어한다.
pvc
를 만들고 pv
와 연결할 때 바인딩 모드라는 것이 있다. Immediate
, WaitForFirstConsumer
두가지 중에 선택할 수 있다. Immediate
모드가 기본으로 사용된다.
Immediate
는 파드를 만들기 전에 pv
와 pvc
가 미리 연결되어 있는 것이다.WaitForFirstConsumer
는 pvc
를 만들고 pv
를 만들지 않고 있다가 파드가 생성되어 연결되면 그제서야 pv
를 만들어서 연결한다.
📌 바인딩 모드가 필요한 이유 ?
클라우드 환경에서는 Immediate
같은 경우 pvc
를 만들어 놓고 즉시 pv
를 만들어 EBS를 만든다.
아직 파드를 사용하지 않는데 이미 만들어져 비용이 발생한다.WaitForFirstConsumer
는 실제 파드가 만들어진 후 pv
가 만들어지므로 비용을 절약할 수 있다.
✔️ 기본 스토리지 클래스
여러 스토리지 클래스 중에서도 클러스터에서 기본적으로 사용되는 스토리지 클래스가 있다.
기본 스토리지 클래스는 옵션으로 명시적으로 지정해주지 않아도 기본적으로 선택되는 스토리지 클래스이다.
nfs-client
를 기본 스토리지 클래스로 지정해본다.
class.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-client
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:
archiveOnDelete: "false"
annotation
을 붙이면 기본 스토리지 클래스로 사용할 수 있다.
vagrant@k8s-node1 ~/nfs-subdir-external-provisioner/deploy master ± kubectl create -f class.yaml
storageclass.storage.k8s.io/nfs-client created
vagrant@k8s-node1 ~/nfs-subdir-external-provisioner/deploy master ± kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-client (default) k8s-sigs.io/nfs-subdir-external-provisioner Delete Immediate false 26s
nfs-client
에서 nfs-client (default)
으로 변경되었다.
vagrant@k8s-node1 ~/nfs-subdir-external-provisioner/deploy master ± kubectl annotate sc nfs-client storageClass.kubernetes.io/is-default-class-
storageclass.storage.k8s.io/nfs-client annotated
다시 annotation
을 삭제한다.
vagrant@k8s-node1 ~/nfs-subdir-external-provisioner/deploy master ± kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-client (default) k8s-sigs.io/nfs-subdir-external-provisioner Delete Immediate false 67s
다시 설정하면 default
라고 표시된다. 이것을 default class storage
라고 한다.
vagrant@k8s-node1 ~/nfs-subdir-external-provisioner/deploy master ± kubectl annotate sc nfs-client storageClass.kubernetes.io/is-default-class="true"
storageclass.storage.k8s.io/nfs-client annotated
vagrant@k8s-node1 ~/nfs-subdir-external-provisioner/deploy master ± kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-client (default) k8s-sigs.io/nfs-subdir-external-provisioner Delete Immediate false 78s
myweb.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc-dynamic
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1G
pvc
를 선택할 때는 다음과 같이 작성한다.
이제 storageClassName
를 명시적으로 선언하지 않아도 nfs-client
가 적용된다.
클라우드 환경에서는 클라우드의 기본 스토리지 클래스를 제공한다.
'DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] ConfigMap & Secret ( + 환경변수) (0) | 2022.05.29 |
---|---|
[Kubernetes] 동적 프로비저닝 (Dynamic Provisioning) ( + NFS 동적 프로비저닝) (0) | 2022.05.29 |
[Kubernetes] 정적 프로비저닝 (Static Provisioning) ( + NFS 정적 프로비저닝) (0) | 2022.05.29 |
[Kubernetes] PV(PersistentVolume), PVC(PersistentVolumeClaim) (0) | 2022.05.29 |
[Kubernetes] Volume (emptyDir, gitRepo, initContainer, hostPath) (0) | 2022.05.29 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!