6.11. Azure 파일 CSI 드라이버 운영자


6.11.1. 개요

OpenShift Container Platform은 Microsoft Azure File Storage용 CSI(Container Storage Interface) 드라이버를 사용하여 영구 볼륨(PV)을 프로비저닝할 수 있습니다.

CSI 운영자와 드라이버를 사용할 때는 영구 저장소CSI 볼륨 구성 에 익숙해야 합니다.

Azure File Storage 자산에 마운트되는 CSI 프로비저닝 PV를 만들기 위해 OpenShift Container Platform은 기본적으로 openshift-cluster-csi-drivers 네임스페이스에 Azure File CSI Driver Operator와 Azure File CSI 드라이버를 설치합니다.

  • Azure File CSI Driver Operator는 영구적 볼륨 클레임(PVC)을 만드는 데 사용할 수 있는 azurefile-csi 라는 스토리지 클래스를 제공합니다. 원하는 경우 이 기본 저장소 클래스를 비활성화할 수 있습니다( 기본 저장소 클래스 관리 참조).
  • Azure File CSI 드라이버를 사용하면 Azure File PV를 만들고 탑재할 수 있습니다. Azure File CSI 드라이버는 필요에 따라 저장소 볼륨을 생성할 수 있도록 하여 동적 볼륨 프로비저닝을 지원하므로 클러스터 관리자가 저장소를 미리 프로비저닝할 필요가 없습니다.

Azure File CSI Driver Operator는 다음을 지원하지 않습니다.

  • 가상 하드 디스크(VHD)
  • SMB(서버 메시지 블록) 파일 공유를 위해 FIPS(연방 정보 처리 표준) 모드가 활성화된 노드에서 실행됩니다. 하지만 네트워크 파일 시스템(NFS)은 FIPS 모드를 지원합니다.

지원되는 기능에 대한 자세한 내용은 지원되는 CSI 드라이버 및 기능을 참조하세요.

6.11.2. CSI 정보

스토리지 벤더는 일반적으로 Kubernetes의 일부로 스토리지 드라이버를 제공합니다. CSI(Container Storage Interface) 구현을 통해 타사 공급자는 코어 Kubernetes 코드를 변경하지 않고 표준 인터페이스를 사용하여 스토리지 플러그인을 제공할 수 있습니다.

CSI Operator는 in-tree 볼륨 플러그인에서 사용할 수 없는 볼륨 스냅샷과 같은 OpenShift Container Platform 사용자 스토리지 옵션을 제공합니다.

6.11.3. NFS 지원

OpenShift Container Platform 4.14 이상에서는 다음 주의 사항과 함께 NFS(Network File System) Driver Operator를 지원합니다.

  • 컨트롤 플레인 노드에 예약된 Azure File NFS 볼륨을 사용하여 Pod를 생성하면 마운트가 거부됩니다.

    이 문제를 해결하려면 컨트롤 플레인 노드를 예약할 수 있고 작업자 노드에서 Pod를 실행할 수 있는 경우 nodeSelector 또는 Affinity를 사용하여 작업자 노드에서 Pod를 예약합니다.

  • FS 그룹 정책 동작:

    중요

    NFS를 사용하는 Azure File CSI는 Pod에서 요청한 fsGroupChangePolicy를 준수하지 않습니다. NFS를 사용하는 Azure File CSI는 Pod에서 요청한 정책에 관계없이 기본 OnRootMismatch FS 그룹 정책을 적용합니다.

  • Azure File CSI Operator는 NFS의 스토리지 클래스를 자동으로 생성하지 않습니다. 수동으로 생성해야 합니다. 다음과 유사한 파일을 사용합니다.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: <storage-class-name> 
    1
    
    provisioner: file.csi.azure.com 
    2
    
    parameters:
      protocol: nfs 
    3
    
      skuName: Premium_LRS  # available values: Premium_LRS, Premium_ZRS
    mountOptions:
      - nconnect=4
    Copy to Clipboard Toggle word wrap
    1
    스토리지 클래스 이름입니다.
    2
    Azure File CSI 공급자를 지정합니다.
    3
    NFS를 스토리지 백엔드 프로토콜로 지정합니다.

6.11.4. Azure 파일 간 서브스크립션 지원

서브스크립션 간 지원을 통해 하나의 Azure 서브스크립션에 OpenShift Container Platform 클러스터를 보유하고 CSI(Azure File Container Storage Interface) 드라이버를 사용하여 다른 Azure 서브스크립션에 Azure 파일 공유를 마운트할 수 있습니다.

중요

OpenShift Container Platform 클러스터와 Azure File 공유(사전 프로비저닝 또는 프로비저닝) 둘 다 동일한 테넌트 내에 있어야 합니다.

6.11.4.1. Azure File 서브스크립션 간 동적 프로비저닝

사전 요구 사항

  • 서비스 주체 또는 관리 ID를 하나의 서브스크립션에서 Azure ID로 사용하여 Azure에 설치된 OpenShift Container Platform 클러스터(서브스크립션 A라고 함)
  • 클러스터와 동일한 테넌트에 있는 스토리지를 사용하여 다른 서브스크립션(서브스크립션 B라고 함)에 액세스
  • Azure CLI에 로그인

프로세스

서브스크립션 간에 Azure File 동적 프로비저닝을 사용하려면 다음을 수행합니다.

  1. 다음 적용 가능한 명령을 실행하여 Azure ID(서비스 주체 또는 관리 ID)를 기록합니다. Azure ID는 이후 단계에서 필요합니다.

    • 클러스터를 설치할 때 서비스 주체 를 Azure ID로 사용하는 경우:

      $ sp_id=$(oc -n openshift-cluster-csi-drivers get secret azure-file-credentials -o jsonpath='{.data.azure_client_id}' | base64 --decode)
      
      $ az ad sp show --id ${sp_id} --query displayName --output tsv
      Copy to Clipboard Toggle word wrap
    • 클러스터를 설치할 때 관리 ID를 Azure ID로 사용하는 경우:

      $ mi_id=$(oc -n openshift-cluster-csi-drivers get secret azure-file-credentials -o jsonpath='{.data.azure_client_id}' | base64 --decode)
      
      $ az identity list --query "[?clientId=='${mi_id}'].{Name:name}" --output tsv
      Copy to Clipboard Toggle word wrap
  2. 다음 중 하나를 수행하여 Azure 파일 공유를 프로비저닝하려는 다른 구독 B의 리소스 그룹에 액세스할 수 있는 권한을 Azure ID(서비스 주체 또는 관리 ID)에 부여합니다.

    • 다음 Azure CLI 명령을 실행합니다.

      az role assignment create \
        --assignee <object-id-or-app-id> \
        --role <role-name> \
        --scope /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account-name>
      Copy to Clipboard Toggle word wrap

      다음과 같습니다.

      <object-id-or-app-id> : 이전 단계에서 얻은 서비스 주체 또는 관리 ID(예: sp_id 또는 mi_id) 입니다.

      <역할 이름> : 역할 이름. 기여자 또는 필요한 권한이 있는 본인의 역할.

      <subscription-id> : 구독 B ID.

      <리소스 그룹 이름> : 구독 B 리소스 그룹 이름입니다.

      또는

    • Azure Portal에 로그인하고 왼쪽 메뉴에서 리소스 그룹을 클릭합니다.

      1. 구독 B에서 역할을 할당하려는 리소스 그룹을 선택합니다 . 리소스 그룹 액세스 제어(IAM) 역할 할당 탭을 클릭하여 현재 할당을 확인한 다음 추가 > 역할 할당 추가를 클릭합니다.
      2. 역할 탭에서 할당할 기여자 역할을 선택한 후 다음을 클릭합니다. 필요한 권한을 부여받아 자신의 역할을 만들고 선택할 수도 있습니다.
      3. 회원 탭에서:

        1. 사용자, 그룹 또는 서비스 주체(또는 관리 ID) 등 담당자 유형을 선택하여 담당자를 선택합니다.
        2. 회원 선택을 클릭하세요.
        3. 이전 단계에서 기록한 원하는 서비스 주체 또는 관리 ID를 검색하여 선택합니다.
        4. 선택을 클릭하여 확인하세요.
      4. 검토 + 할당 탭에서 설정을 검토합니다.
      5. 역할 할당을 완료하려면 검토 + 할당을 클릭하세요.

        참고

        Azure 파일 공유를 프로비저닝하는 데 특정 스토리지 계정만 사용하려는 경우 비슷한 단계를 사용하여 스토리지 계정에 액세스하기 위한 Azure ID(서비스 주체 또는 관리 ID) 권한을 얻을 수도 있습니다.

  3. 다음과 유사한 구성을 사용하여 Azure 파일 저장소 클래스를 만듭니다.

    Azure 파일 저장소 클래스 YAML 파일 예제

    allowVolumeExpansion: true
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: <sc-name> 
    1
    
    mount options:
      - mfsymlinks
      - cache=strict
      - nosharesock
      - actimeo=30
    parameters:
      subscriptionID: <xxxx-xxxx-xxxx-xxxx-xxxx> 
    2
    
      resourceGroup: <resource group name> 
    3
    
      storageAccount: <storage account> 
    4
    
      skuName: <skuName> 
    5
    
    provisioner: file.csi.azure.com
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    Copy to Clipboard Toggle word wrap

    1
    저장 클래스의 이름
    2
    구독 B ID
    3
    구독 B 리소스 그룹 이름
    4
    저장 계정 이름(사용자가 직접 지정하려는 경우)
    5
    SKU 유형의 이름
  4. 다음과 유사한 구성을 사용하여 이전 단계에서 만든 Azure 파일 저장소 클래스를 지정하는 영구적 볼륨 클레임(PVC)을 만듭니다.

    PVC YAML 파일 예시

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: <pvc-name> 
    1
    
    spec:
      storageClassName: <sc-name-cross-sub> 
    2
    
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 5Gi
    Copy to Clipboard Toggle word wrap

    1
    PVC의 이름.
    2
    이전 단계에서 만든 스토리지 클래스의 이름입니다.

6.11.4.2. PV 및 PVC를 만들어 Azure File의 구독 전반에 정적 프로비저닝:

사전 요구 사항

  • 서비스 주체 또는 관리 ID를 하나의 구독(구독 A라고 함)의 Azure ID로 사용하여 Azure에 OpenShift Container Platform 클러스터를 설치했습니다.
  • 클러스터와 동일한 테넌트에 있는 스토리지를 사용하여 다른 구독(구독 B라고 함)에 액세스합니다.
  • Azure CLI에 로그인했습니다

프로세스

  1. Azure 파일 공유의 경우 리소스 그룹, 스토리지 계정, 스토리지 계정 키 및 Azure 파일 이름을 기록합니다. 이러한 값은 다음 단계에 사용됩니다.
  2. 다음 명령을 실행하여 영구 볼륨 매개변수 spec.csi.nodeStageSecretRef.name 에 대한 비밀을 만듭니다.

    $ oc create secret generic azure-storage-account-<storageaccount-name>-secret --from-literal=azurestorageaccountname="<azure-storage-account-name>" --from-literal azurestorageaccountkey="<azure-storage-account-key>" --type=Opaque
    Copy to Clipboard Toggle word wrap

    여기서: <azure-storage-account-name><azure-storage-account-key> 는 각각 1단계에서 기록한 Azure Storage 계정 이름과 키입니다.

  3. 다음 예제 파일과 유사한 구성을 사용하여 영구 볼륨(PV)을 만듭니다.

    PV YAML 파일 예시

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      annotations:
        pv.kubernetes.io/provisioned-by: file.csi.azure.com
      name: <pv-name> 
    1
    
    spec:
      capacity:
        storage: 10Gi 
    2
    
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      storageClassName: <sc-name> 
    3
    
      mountOptions:
        - cache=strict
        - nosharesock
        - actimeo=30
        - nobrl
      csi:
        driver: file.csi.azure.com
        volumeHandle: "{resource-group-name}#{storage-account-name}#{file-share-name}" 
    4
    
        volumeAttributes:
          shareName: <existing-file-share-name> 
    5
    
        nodeStageSecretRef:
          name: <secret-name>  
    6
    
          namespace: <secret-namespace>  
    7
    Copy to Clipboard Toggle word wrap

    1
    PV의 이름입니다.
    2
    PV의 크기입니다.
    3
    저장 클래스 이름.
    4
    클러스터의 모든 동일한 공유에 대해 volumeHandle 이 고유한지 확인하세요.
    5
    `<기존 파일 공유 이름>'에는 전체 경로가 아닌 파일 공유 이름만 사용하세요.
    6
    이전 단계에서 생성된 비밀 이름입니다.
    7
    비밀이 있는 네임스페이스입니다.
  4. 1단계에서 참조한 기존 Azure 파일 공유를 지정하는 영구적 값 클레임(PVC)을 다음과 유사한 구성을 사용하여 만듭니다.

    PVC YAML 파일 예시

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: <pvc-name> 
    1
    
    spec:
      storageClassName: <sc-name> 
    2
    
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 5Gi
    Copy to Clipboard Toggle word wrap

    1
    PVC의 이름.
    2
    이전 단계에서 PV에 대해 지정한 스토리지 클래스의 이름입니다.

스토리지 클래스를 사용하는 것이 좋습니다

구독 전반에 걸친 정적 프로비저닝의 이전 예에서 PV와 PVC에서 참조된 스토리지 클래스는 꼭 필요하지 않습니다. 정적 프로비저닝을 수행하는 데 스토리지 클래스가 필요하지 않기 때문입니다. 그러나 수동으로 생성된 PVC가 실수로 수동으로 생성된 PV와 일치하지 않아 잠재적으로 새 PV의 동적 프로비저닝이 트리거되는 경우를 방지하기 위해 스토리지 클래스를 사용하는 것이 좋습니다. 이 문제를 방지하는 다른 방법은 provisioner: kubernetes.io/no-provisioner를 사용하여 스토리지 클래스를 생성하거나 존재하지 않는 스토리지 클래스를 참조하는 것입니다. 두 경우 모두 동적 프로비저닝이 발생하지 않도록 보장합니다. 이러한 전략 중 하나를 사용하는 경우 PV와 PVC가 일치하지 않으면 PVC가 보류 상태로 유지되고 오류를 수정할 수 있습니다.

6.11.5. Azure File에 대한 정적 프로비저닝

정적 프로비저닝의 경우, 클러스터 관리자는 실제 저장소의 세부 정보를 정의하는 영구 볼륨(PV)을 만듭니다. 그러면 클러스터 사용자는 이러한 PV를 사용하는 영구 볼륨 클레임(PVC)을 만들 수 있습니다.

사전 요구 사항

  • 관리자 권한으로 OpenShift Container Platform 클러스터에 액세스

프로세스

Azure File에 정적 프로비저닝을 사용하려면:

  1. 아직 Azure 저장소 계정에 대한 비밀을 만들지 않았다면 지금 만드세요.

    이 비밀에는 Azure Storage 계정 이름과 키가 포함되어야 하며, 다음과 같은 매우 구체적인 형식과 두 개의 키-값 쌍이 있어야 합니다.

    • azurestorageaccountname: <storage_account_name>
    • azurestorageaccountkey: <account_key>

      azure-secret 이라는 이름의 비밀을 생성하려면 다음 명령을 실행하세요.

      oc create secret generic azure-secret  -n <namespace_name> --type=Opaque --from-literal=azurestorageaccountname="<storage_account_name>" --from-literal=azurestorageaccountkey="<account_key>" 
      1
       
      2
      Copy to Clipboard Toggle word wrap
      1
      <네임스페이스_이름>을 PV가 사용되는 네임스페이스로 설정합니다.
      2
      <storage_account_name><account_key> 에 대한 값을 제공하세요.
  2. 다음 예제 YAML 파일을 사용하여 PV를 만듭니다.

    PV YAML 파일 예시

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      annotations:
        pv.kubernetes.io/provisioned-by: file.csi.azure.com
      name: pv-azurefile
    spec:
      capacity:
        storage: 5Gi 
    1
    
      accessModes:
        - ReadWriteMany 
    2
    
      persistentVolumeReclaimPolicy: Retain 
    3
    
      storageClassName: <sc-name> 
    4
    
      mountOptions:
        - dir_mode=0777  
    5
    
        - file_mode=0777
        - uid=0
        - gid=0
        - cache=strict  
    6
    
        - nosharesock  
    7
    
        - actimeo=30  
    8
    
        - nobrl  
    9
    
      csi:
        driver: file.csi.azure.com
        volumeHandle: "{resource-group-name}#{account-name}#{file-share-name}" 
    10
    
        volumeAttributes:
          shareName: EXISTING_FILE_SHARE_NAME  
    11
    
        nodeStageSecretRef:
          name: azure-secret 
    12
    
          namespace: <my-namespace> 
    13
    Copy to Clipboard Toggle word wrap

    1
    볼륨 크기.
    2
    접근 모드. 읽기-쓰기 및 마운트 권한을 정의합니다. 자세한 내용은 추가 리소스 에서 액세스 모드를 참조하세요.
    3
    정책 회수. 볼륨이 해제된 후 클러스터에 볼륨을 어떻게 처리할지 알려줍니다. 허용되는 값은 Retain , Recycle 또는 Delete 입니다.
    4
    저장 클래스 이름. 이 이름은 PVC가 이 특정 PV에 바인딩하는 데 사용됩니다. 정적 프로비저닝의 경우 StorageClass 객체가 존재할 필요는 없지만 PV와 PVC의 이름은 일치해야 합니다.
    5
    보안을 강화하려면 이 권한을 수정하세요.
    6
    캐시 모드. 허용되는 값은 none , strict , loose 입니다. 기본값은 strict 입니다.
    7
    재연결 경쟁의 가능성을 줄이는 데 사용됩니다.
    8
    CIFS 클라이언트가 서버에 속성 정보를 요청하기 전에 파일이나 디렉토리의 속성을 캐시하는 시간(초)입니다.
    9
    서버에 바이트 범위 잠금 요청을 보내는 것을 비활성화하고, POSIX 잠금과 관련된 문제가 있는 애플리케이션에 대해서도 비활성화합니다.
    10
    클러스터 전체에서 volumeHandle이 고유한지 확인하세요. 리소스 그룹 이름은 스토리지 계정이 있는 Azure 리소스 그룹입니다.
    11
    파일 공유 이름. 파일 공유 이름만 사용하고 전체 경로를 사용하지 마세요.
    12
    이 절차의 1단계에서 생성된 비밀의 이름을 제공하세요. 이 예에서는 azure-secret 입니다.
    13
    비밀이 생성된 네임스페이스입니다. 이는 PV가 사용되는 네임스페이스여야 합니다.
  3. 다음 예제 파일을 사용하여 PV를 참조하는 PVC를 만듭니다.

    PVC YAML 파일 예시

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: <pvc-name> 
    1
    
      namespace: <my-namespace> 
    2
    
    spec:
      volumeName: pv-azurefile 
    3
    
      storageClassName: <sc-name> 
    4
    
      accessModes:
        - ReadWriteMany 
    5
    
      resources:
        requests:
          storage: 5Gi 
    6
    Copy to Clipboard Toggle word wrap

    1
    PVC 이름.
    2
    PVC의 네임스페이스.
    3
    이전 단계에서 만든 PV의 이름입니다.
    4
    저장 클래스 이름. 이 이름은 PVC가 이 특정 PV에 바인딩하는 데 사용됩니다. 정적 프로비저닝의 경우 StorageClass 객체가 존재할 필요는 없지만 PV와 PVC의 이름은 일치해야 합니다.
    5
    접근 모드. PVC에 대한 요청된 읽기-쓰기 액세스를 정의합니다. 클레임은 특정 액세스 모드로 스토리지를 요청할 때 볼륨과 동일한 규칙을 사용합니다. 자세한 내용은 추가 리소스 에서 액세스 모드를 참조하세요.
    6
    PVC 사이즈.
  4. 다음 명령을 실행하여 PVC가 생성되고 잠시 후 바운드 상태가 되었는지 확인하세요.

    $ oc get pvc <pvc-name> 
    1
    Copy to Clipboard Toggle word wrap
    1
    PVC의 이름입니다.

    출력 예

    NAME       STATUS    VOLUME         CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    pvc-name   Bound     pv-azurefile   5Gi        ReadWriteMany  my-sc          7m2s
    Copy to Clipboard Toggle word wrap

맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2025 Red Hat