5.11. Azure Disk CSI Driver Operator
5.11.1. 개요
OpenShift Container Platform은 Microsoft Azure Disk Storage용 CSI(Container Storage Interface) 드라이버를 사용하여 PV(영구 볼륨)를 프로비저닝할 수 있습니다.
CSI Operator 및 드라이버를 사용할 때는 영구 스토리지 및 CSI 볼륨 구성에 대해 숙지하는 것이 좋습니다.
Azure Disk 스토리지 자산에 마운트되는 CSI 프로비저닝 PV를 생성하기 위해 OpenShift Container Platform은 openshift-cluster-csi-drivers
네임스페이스에 기본적으로 Azure Disk CSI Driver Operator 및 Azure Disk CSI 드라이버를 설치합니다.
-
Azure Disk CSI Driver Operator 는 PVC(영구 볼륨 클레임)를 생성하는 데 사용할 수 있는
managed-csi
라는 스토리지 클래스를 제공합니다. Azure Disk CSI Driver Operator는 필요에 따라 스토리지 볼륨을 생성할 수 있도록 하여 클러스터 관리자가 스토리지를 사전 프로비저닝할 필요가 없어 동적 볼륨 프로비저닝을 지원합니다. 필요한 경우 이 기본 스토리지 클래스를 비활성화할 수 있습니다( 기본 스토리지 클래스 관리참조). - Azure Disk CSI 드라이버를 사용하면 Azure Disk PV를 생성 및 마운트할 수 있습니다.
5.11.2. CSI 정보
스토리지 벤더는 일반적으로 Kubernetes의 일부로 스토리지 드라이버를 제공합니다. CSI(Container Storage Interface) 구현을 통해 타사 공급자는 코어 Kubernetes 코드를 변경하지 않고도 표준 인터페이스를 사용하여 스토리지 플러그인을 제공할 수 있습니다.
CSI Operator는 in-tree 볼륨 플러그인에서 사용할 수 없는 볼륨 스냅샷과 같은 OpenShift Container Platform 사용자 스토리지 옵션을 제공합니다.
OpenShift Container Platform은 동등한 CSI 드라이버로 Azure Disk in-tree 볼륨 플러그인에 대한 자동 마이그레이션을 제공합니다. 자세한 내용은 CSI 자동 마이그레이션 을 참조하십시오.
5.11.3. 스토리지 계정 유형을 사용하여 스토리지 클래스 생성
스토리지 클래스는 스토리지 수준 및 사용량을 구분하고 조정하는 데 사용됩니다. 스토리지 클래스를 정의하면 동적으로 프로비저닝된 영구 볼륨을 얻을 수 있습니다.
스토리지 클래스를 생성할 때 스토리지 계정 유형을 지정할 수 있습니다. 이는 Azure 스토리지 계정 SKU 계층에 해당합니다. 유효한 옵션은 Standard_LRS
,Premium_LRS
,StandardSSD_LRS
,UltraSSD_LRS
, UltraSSD_LRS ,Premium_ZRS
,StandardSSD_ZRS
, PremiumV2_LRS
입니다. Azure SKU 계층을 찾는 방법에 대한 자세한 내용은 SKU 유형을 참조하십시오.
ZRS 및 PremiumV2_LRS 모두 일부 지역 제한이 있습니다. 이러한 제한 사항에 대한 자세한 내용은 ZRS 제한 사항 및 Premium_LRS 제한을 참조하십시오.
사전 요구 사항
- 관리자 권한을 사용하여 OpenShift Container Platform 클러스터에 액세스
프로세스
다음 단계를 사용하여 스토리지 계정 유형의 스토리지 클래스를 생성합니다.
다음과 유사한 YAML 파일을 사용하여 스토리지 계정 유형을 지정하는 스토리지 클래스를 생성합니다.
$ oc create -f - << EOF apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: <storage-class> 1 provisioner: disk.csi.azure.com parameters: skuName: <storage-class-account-type> 2 reclaimPolicy: Delete volumeBindingMode: WaitForFirstConsumer allowVolumeExpansion: true EOF
참고PremiumV2_LRS의 경우
storageclass.parameters
에서cachingMode: None
을 지정합니다.스토리지 클래스를 나열하여 스토리지 클래스가 생성되었는지 확인합니다.
$ oc get storageclass
출력 예
$ oc get storageclass NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE azurefile-csi file.csi.azure.com Delete Immediate true 68m managed-csi (default) disk.csi.azure.com Delete WaitForFirstConsumer true 68m sc-prem-zrs disk.csi.azure.com Delete WaitForFirstConsumer true 4m25s 1
- 1
- 스토리지 계정 유형의 새 스토리지 클래스입니다.
5.11.4. 사용자 관리 암호화
사용자 관리 암호화 기능을 사용하면 OpenShift Container Platform 노드 루트 볼륨을 암호화하는 설치 중에 키를 제공하고 모든 관리 스토리지 클래스가 이러한 키를 사용하여 프로비저닝된 스토리지 볼륨을 암호화할 수 있습니다. install-config YAML 파일의 platform.<cloud_type>.defaultMachinePlatform
필드에 사용자 지정 키를 지정해야 합니다.
이 기능은 다음 스토리지 유형을 지원합니다.
- AWS(Amazon Web Services) EBS(Elastic Block Storage)
- Microsoft Azure Disk 스토리지
- GCP(Google Cloud Platform) PD(영구 디스크) 스토리지
- IBM Virtual Private Cloud (VPC) 블록 스토리지
OS(root) 디스크가 암호화되고 스토리지 클래스에 정의된 암호화된 키가 없는 경우 Azure Disk CSI 드라이버는 기본적으로 OS 디스크 암호화 키를 사용하여 프로비저닝된 스토리지 볼륨을 암호화합니다.
Azure의 사용자 관리 암호화를 사용하여 설치하는 방법에 대한 자세한 내용은 Azure에 대한 사용자 관리 암호화 활성화를 참조하십시오.
5.11.5. PVC를 사용하여 울트라 디스크가 있는 머신을 배포하는 머신 세트
Azure에서 실행되는 머신 세트를 생성하여 울트라 디스크가 있는 머신을 배포할 수 있습니다. Ultra 디스크는 가장 까다로운 데이터 워크로드에 사용하기 위한 고성능 스토리지입니다.
in-tree 플러그인과 CSI 드라이버는 모두 PVC를 사용하여 울트라 디스크를 활성화합니다. PVC를 생성하지 않고 울트라 디스크가 있는 머신을 데이터 디스크로 배포할 수도 있습니다.
추가 리소스
5.11.5.1. 머신 세트를 사용하여 울트라 디스크가 있는 머신 생성
머신 세트 YAML 파일을 편집하여 Azure에 울트라 디스크가 있는 머신을 배포할 수 있습니다.
사전 요구 사항
- 기존 Microsoft Azure 클러스터가 있어야 합니다.
프로세스
기존 Azure
MachineSet
CR(사용자 정의 리소스)을 복사하고 다음 명령을 실행하여 편집합니다.$ oc edit machineset <machine-set-name>
여기서
<machine-set-name
>은 울트라 디스크가 있는 머신을 프로비저닝하려는 머신 세트입니다.표시된 위치에 다음 행을 추가합니다.
apiVersion: machine.openshift.io/v1beta1 kind: MachineSet spec: template: spec: metadata: labels: disk: ultrassd 1 providerSpec: value: ultraSSDCapability: Enabled 2
다음 명령을 실행하여 업데이트된 구성을 사용하여 머신 세트를 생성합니다.
$ oc create -f <machine-set-name>.yaml
다음 YAML 정의가 포함된 스토리지 클래스를 생성합니다.
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: ultra-disk-sc 1 parameters: cachingMode: None diskIopsReadWrite: "2000" 2 diskMbpsReadWrite: "320" 3 kind: managed skuname: UltraSSD_LRS provisioner: disk.csi.azure.com 4 reclaimPolicy: Delete volumeBindingMode: WaitForFirstConsumer 5
다음 YAML 정의가 포함된
Ultra-disk-sc
스토리지 클래스를 참조하는 PVC(영구 볼륨 클레임)를 생성합니다.apiVersion: v1 kind: PersistentVolumeClaim metadata: name: ultra-disk 1 spec: accessModes: - ReadWriteOnce storageClassName: ultra-disk-sc 2 resources: requests: storage: 4Gi 3
다음 YAML 정의가 포함된 Pod를 생성합니다.
apiVersion: v1 kind: Pod metadata: name: nginx-ultra spec: nodeSelector: disk: ultrassd 1 containers: - name: nginx-ultra image: alpine:latest command: - "sleep" - "infinity" volumeMounts: - mountPath: "/mnt/azure" name: volume volumes: - name: volume persistentVolumeClaim: claimName: ultra-disk 2
검증
다음 명령을 실행하여 머신이 생성되었는지 확인합니다.
$ oc get machines
시스템은
Running
상태여야 합니다.실행 중이고 노드가 연결된 시스템의 경우 다음 명령을 실행하여 파티션을 검증합니다.
$ oc debug node/<node-name> -- chroot /host lsblk
이 명령에서
oc debug node/<node-name
>은 노드 <node-name
>에서 디버깅 쉘을 시작하고--
로 명령을 전달합니다. 전달된 명령chroot /host
는 기본 호스트 OS 바이너리에 대한 액세스를 제공하며lsblk
에는 호스트 OS 시스템에 연결된 블록 장치가 표시됩니다.
다음 단계
Pod 내에서 울트라 디스크를 사용하려면 마운트 지점을 사용하는 워크로드를 생성합니다. 다음 예와 유사한 YAML 파일을 생성합니다.
apiVersion: v1 kind: Pod metadata: name: ssd-benchmark1 spec: containers: - name: ssd-benchmark1 image: nginx ports: - containerPort: 80 name: "http-server" volumeMounts: - name: lun0p1 mountPath: "/tmp" volumes: - name: lun0p1 hostPath: path: /var/lib/lun0p1 type: DirectoryOrCreate nodeSelector: disktype: ultrassd
5.11.5.2. 울트라 디스크를 활성화하는 머신 세트의 리소스 문제 해결
이 섹션의 정보를 사용하여 발생할 수 있는 문제를 이해하고 복구하십시오.
5.11.5.2.1. 울트라 디스크가 지원하는 영구 볼륨 클레임을 마운트할 수 없음
울트라 디스크가 지원하는 영구 볼륨 클레임을 마운트하는 데 문제가 있으면 Pod가 ContainerCreating
상태로 중단되고 경고가 트리거됩니다.
예를 들어, pod를 호스팅하는 노드를 백업하는 시스템에 additionalCapabilities.ultraSSDEnabled
매개변수가 설정되지 않은 경우 다음 오류 메시지가 표시됩니다.
StorageAccountType UltraSSD_LRS can be used only when additionalCapabilities.ultraSSDEnabled is set.
이 문제를 해결하려면 다음 명령을 실행하여 Pod를 설명합니다.
$ oc -n <stuck_pod_namespace> describe pod <stuck_pod_name>