8.3. 스토리지 클래스 정의
StorageClass
객체는 현재 전역 범위 객체이며 cluster-admin
또는 storage-admin
사용자가 만들어야 합니다.
클러스터 스토리지 작업자는 사용 중인 플랫폼에 따라 기본 스토리지 클래스를 설치할 수 있습니다. 이 스토리지 클래스는 Operator가 소유하고 제어합니다. 주석 및 레이블 정의 외에는 삭제하거나 변경할 수 없습니다. 다른 동작이 필요한 경우 사용자 정의 스토리지 클래스를 정의해야 합니다.
다음 섹션에서는 StorageClass
오브젝트의 기본 정의 및 지원되는 각 플러그인 유형에 대한 구체적인 예를 설명합니다.
8.3.1. 기본 StorageClass 개체 정의
다음 리소스는 스토리지 클래스를 구성하는 데 사용되는 매개변수 및 기본값을 보여줍니다. 이 예에서는 AWS ElasticBlockStore (EBS) 객체 정의를 사용합니다.
StorageClass
정의 예
kind: StorageClass 1 apiVersion: storage.k8s.io/v1 2 metadata: name: <storage-class-name> 3 annotations: 4 storageclass.kubernetes.io/is-default-class: 'true' ... provisioner: kubernetes.io/aws-ebs 5 parameters: 6 type: gp3 ...
8.3.2. 스토리지 클래스 주석
스토리지 클래스를 클러스터 전체 기본값으로 설정하려면 스토리지 클래스의 메타데이터에 다음 주석을 추가합니다.
storageclass.kubernetes.io/is-default-class: "true"
예를 들면 다음과 같습니다.
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: annotations: storageclass.kubernetes.io/is-default-class: "true" ...
이렇게 하면 특정 스토리지 클래스를 지정하지 않은 모든 PVC(영구 볼륨 클레임)가 기본 스토리지 클래스를 통해 자동으로 프로비저닝됩니다. 그러나 클러스터에는 두 개 이상의 스토리지 클래스가 있을 수 있지만, 이 중 하나만 기본 스토리지 클래스일 수 있습니다.
베타 주석 storageclass.beta.kubernetes.io/is-default-class
는 여전히 작동하지만 향후 릴리스에서는 제거될 예정입니다.
스토리지 클래스 설명을 설정하려면 스토리지 클래스의 메타데이터에 다음 주석을 추가합니다.
kubernetes.io/description: My Storage Class Description
예를 들면 다음과 같습니다.
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: annotations: kubernetes.io/description: My Storage Class Description ...
8.3.3. RHOSP Cinder 오브젝트 정의
cinder-storageclass.yaml
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: <storage-class-name> 1 provisioner: kubernetes.io/cinder parameters: type: fast 2 availability: nova 3 fsType: ext4 4
- 1
- StorageClass의 이름입니다. 영구 볼륨 클래임은 이 스토리지 클래스를 사용하여 관련 영구 볼륨을 프로비저닝합니다.
- 2
- Cinder에서 생성 된 볼륨 유형입니다. 기본값은 비어 있습니다.
- 3
- 가용성 영역입니다. 지정하지 않으면 일반적으로 OpenShift Container Platform 클러스터에 노드가 있는 모든 활성 영역에서 볼륨이 라운드 로빈됩니다.
- 4
- 동적으로 프로비저닝된 볼륨에서 생성된 파일 시스템입니다. 이 값은 동적으로 프로비저닝된 영구 볼륨의
fsType
필드에 복사되며 볼륨이 처음 마운트될 때 파일 시스템이 작성됩니다. 기본값은ext4
입니다.
8.3.4. RHOSP Manila CSI(Container Storage Interface) 오브젝트 정의
설치 완료되면 OpenStack Manila CSI Driver Operator 및 ManilaDriver가 동적 프로비저닝에 필요한 모든 사용 가능한 Manila 공유 유형에 필요한 스토리지 클래스를 자동으로 생성합니다.
8.3.5. AWS Elastic Block Store (EBS) 객체 정의
aws-ebs-storageclass.yaml
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: <storage-class-name> 1 provisioner: kubernetes.io/aws-ebs parameters: type: io1 2 iopsPerGB: "10" 3 encrypted: "true" 4 kmsKeyId: keyvalue 5 fsType: ext4 6
- 1
- (필수) 스토리지 클래스의 이름입니다. 영구 볼륨 클래임은 이 스토리지 클래스를 사용하여 관련 영구 볼륨을 프로비저닝합니다.
- 2
- 3
- 선택 사항: io1 볼륨만 해당합니다. GiB마다 초당 I/O 작업 수입니다. AWS 볼륨 플러그인은 요청된 볼륨 크기와 멀티플로우하여 볼륨의 IOPS를 계산합니다. 값의 상한은 AWS가 지원하는 최대치인 20,000 IOPS입니다. 자세한 내용은 AWS 설명서를 참조하십시오.
- 4
- 선택 사항: EBS 볼륨을 암호화할지 여부를 나타냅니다. 유효한 값은
true
또는false
입니다. - 5
- 선택 사항: 볼륨을 암호화할 때 사용할 키의 전체 ARN입니다. 값을 지정하지 않는 경우에도
encypted
가true
로 설정되어 있는 경우 AWS가 키를 생성합니다. 유효한 ARN 값은 AWS 설명서를 참조하십시오. - 6
- 선택 사항: 동적으로 프로비저닝된 볼륨에서 생성된 파일 시스템입니다. 이 값은 동적으로 프로비저닝된 영구 볼륨의
fsType
필드에 복사되며 볼륨이 처음 마운트될 때 파일 시스템이 작성됩니다. 기본값은ext4
입니다.
8.3.6. Azure Disk 오브젝트 정의
azure-advanced-disk-storageclass.yaml
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: <storage-class-name> 1 provisioner: kubernetes.io/azure-disk volumeBindingMode: WaitForFirstConsumer 2 allowVolumeExpansion: true parameters: kind: Managed 3 storageaccounttype: Premium_LRS 4 reclaimPolicy: Delete
- 1
- StorageClass의 이름입니다. 영구 볼륨 클래임은 이 스토리지 클래스를 사용하여 관련 영구 볼륨을 프로비저닝합니다.
- 2
WaitForFirstConsumer
를 사용하는 것이 좋습니다. 이렇게 하면 볼륨을 프로비저닝하고 사용 가능한 영역에서 사용 가능한 작업자 노드의 Pod를 예약할 수 있는 충분한 스토리지를 허용합니다.- 3
- 가능한 값은
Shared
(기본값),Managed
,Dedicated
입니다.중요Red Hat은 스토리지 클래스에서
kind: Managed
의 사용만 지원합니다.Shared
및Dedicated
를 사용하여 Azure는 관리되지 않은 디스크를 생성합니다. 반면 OpenShift Container Platform은 머신 OS(root) 디스크의 관리 디스크를 생성합니다. Azure Disk는 노드에서 관리 및 관리되지 않은 디스크를 모두 사용하도록 허용하지 않으므로Shared
또는Dedicated
로 생성된 관리되지 않은 디스크를 OpenShift Container Platform 노드에 연결할 수 없습니다. - 4
- Azure 스토리지 계정 SKU층입니다. 기본값은 비어 있습니다. 프리미엄 VM은
Standard_LRS
및Premium_LRS
디스크를 모두 연결할 수 있으며 표준 VM은Standard_LRS
디스크만 연결할 수 있습니다. 관리형 VM은 관리 디스크만 연결할 수 있으며 관리되지 않는 VM은 관리되지 않는 디스크만 연결할 수 있습니다.-
kind
가Shared
로 설정된 경우 Azure는 클러스터와 동일한 리소스 그룹에 있는 일부 공유 스토리지 계정에서 관리되지 않는 디스크를 만듭니다. -
kind
가Managed
로 설정된 경우 Azure는 새 관리 디스크를 만듭니다. kind
가Dedicated
로 설정되고storageAccount
가 지정된 경우 Azure는 클러스터와 동일한 리소스 그룹에서 새로운 관리되지 않는 디스크에 대해 지정된 스토리지 계정을 사용합니다. 이 기능이 작동하려면 다음 사항이 전제가 되어야 합니다.- 지정된 스토리지 계정이 같은 지역에 있어야 합니다.
- Azure Cloud Provider는 스토리지 계정에 대한 쓰기 권한이 있어야 합니다.
-
kind
가Dedicated
로 설정되어 있고storageAccount
가 지정되지 않은 경우 Azure는 클러스터와 동일한 리소스 그룹에 새로운 관리되지 않는 디스크에 대한 새로운 전용 스토리지 계정을 만듭니다.
-
8.3.7. Azure File 객체 정의
Azure File 스토리지 클래스는 시크릿을 사용하여 Azure 파일 공유를 만드는 데 필요한 Azure 스토리지 계정 이름과 스토리지 계정 키를 저장합니다. 이러한 권한은 다음 절차의 일부로 생성됩니다.
절차
시크릿을 작성하고 볼 수 있는 액세스를 허용하는
ClusterRole
오브젝트를 정의합니다.apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: # name: system:azure-cloud-provider name: <persistent-volume-binder-role> 1 rules: - apiGroups: [''] resources: ['secrets'] verbs: ['get','create']
- 1
- 시크릿을 표시하고 작성하는 클러스터 역할의 이름입니다.
서비스 계정에 클러스터 역할을 추가합니다.
$ oc adm policy add-cluster-role-to-user <persistent-volume-binder-role> system:serviceaccount:kube-system:persistent-volume-binder
Azure File
StorageClass
오브젝트를 만듭니다.kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: <azure-file> 1 provisioner: kubernetes.io/azure-file parameters: location: eastus 2 skuName: Standard_LRS 3 storageAccount: <storage-account> 4 reclaimPolicy: Delete volumeBindingMode: Immediate
- 1
- StorageClass의 이름입니다. 영구 볼륨 클래임은 이 스토리지 클래스를 사용하여 관련 영구 볼륨을 프로비저닝합니다.
- 2
eastus
와 같은 Azure 스토리지 계정의 위치입니다. 기본값은 비어 있습니다. 즉, OpenShift Container Platform 클러스터 위치에 새 Azure 스토리지 계정이 만들어집니다.- 3
- Azure 스토리지 계정의 SKU 계층입니다 (예:
Standard_LRS)
. 기본값은 비어 있습니다. 즉,Standard_LRS
SKU를 사용하여 새 Azure 스토리지 계정이 만들어집니다. - 4
- Azure 스토리지 계정 이름입니다. 스토리지 계정이 제공되면
skuName
및location
이 무시됩니다. 스토리지 계정이 제공되지 않으면 스토리지 클래스는 정의된skuName
및location
과 일치하는 계정의 리소스 그룹과 연관된 스토리지 계정을 검색합니다.
8.3.7.1. Azure File 사용시 고려 사항
기본 Azure File 스토리지 클래스는 다음 파일 시스템 기능을 지원하지 않습니다.
- 심볼릭 링크
- 하드 링크
- 확장 속성
- 스파스 파일
- 명명된 파이프
또한 Azure File이 마운트되는 디렉터리의 소유자 ID (UID)는 컨테이너의 프로세스 UID와 다릅니다. 마운트된 디렉터리에 사용할 특정 사용자 ID를 정의하기 위해 StorageClass
오브젝트에서 uid
마운트 옵션을 지정할 수 있습니다.
다음 StorageClass
오브젝트는 마운트된 디렉터리의 심볼릭 링크를 활성화한 상태에서 사용자 및 그룹 ID를 변경하는 방법을 보여줍니다.
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: azure-file mountOptions: - uid=1500 1 - gid=1500 2 - mfsymlinks 3 provisioner: kubernetes.io/azure-file parameters: location: eastus skuName: Standard_LRS reclaimPolicy: Delete volumeBindingMode: Immediate
8.3.8. GCE PersistentDisk (gcePD) 오브젝트 정의
gce-pd-storageclass.yaml
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: <storage-class-name> 1 provisioner: kubernetes.io/gce-pd parameters: type: pd-standard 2 replication-type: none volumeBindingMode: WaitForFirstConsumer allowVolumeExpansion: true reclaimPolicy: Delete
8.3.9. VMware vSphere 오브젝트 정의
vsphere-storageclass.yaml
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: <storage-class-name> 1 provisioner: csi.vsphere.vmware.com 2
- 1
- StorageClass의 이름입니다. 영구 볼륨 클래임은 이 스토리지 클래스를 사용하여 관련 영구 볼륨을 프로비저닝합니다.
- 2
- OpenShift Container Platform에서 VMware vSphere CSI를 사용하는 방법에 대한 자세한 내용은 Kubernetes 설명서 를 참조하십시오.