6.11. Azure File CSI Driver Operator


6.11.1. 概述

OpenShift Container Platform 可以使用 Microsoft Azure File Storage 的 Container Storage Interface(CSI)驱动程序置备持久性卷(PV)。

在使用 CSI Operator 和驱动程序时,建议先熟悉 持久性存储配置 CSI 卷

要创建挂载到 Azure File 存储资产中的 CSI 置备 PV,OpenShift Container Platform 在 openshift-cluster-csi-drivers 命名空间中默认安装 Azure File CSI Driver Operator 和 Azure File CSI 驱动程序。

  • Azure File CSI Driver Operator 提供了一个名为 azurefile-csi 的存储类,您可以使用它来创建持久性卷声明(PVC)。如果需要,您可以禁用此默认存储类 (请参阅管理默认存储类)。
  • Azure File CSI 驱动程序 允许您创建并挂载 Azure File PV。Azure File CSI 驱动程序支持动态卷置备,方法是允许按需创建存储卷,使集群管理员无需预置备存储。

Azure File CSI Driver Operator 不支持:

  • 虚拟硬盘(VHD)
  • 在启用了联邦信息处理标准(FIPS)模式的节点上运行,用于服务器消息块(SMB)文件共享。但是,网络文件系统(NFS)支持 FIPS 模式。

有关支持的功能的更多信息,请参阅支持的 CSI 驱动程序和功能

6.11.2. 关于 CSI

在过去,存储厂商一般会把存储驱动作为 Kubernetes 的一个部分提供。随着容器存储接口 (CSI) 的实现,第三方供应商可以使用标准接口来提供存储插件,而无需更改核心 Kubernetes 代码。

CSI Operators 为 OpenShift Container Platform 用户提供了存储选项,如卷快照,它无法通过 in-tree 卷插件实现。

6.11.3. NFS 支持

OpenShift Container Platform 4.14 及更新的版本支持带有 Network File System (NFS) 的 Azure File Container Storage Interface (CSI) Driver Operator,请考虑以下事项:

  • 使用调度到 control plane 节点的 Azure File NFS 卷创建 pod 会导致挂载被拒绝。

    要临时解决这个问题:如果您的 control plane 节点可以调度,pod 可以在 worker 节点上运行,使用 nodeSelector 或 Affinity 将 pod 调度到 worker 节点上。

  • FS 组策略行为:

    重要

    带有 NFS 的 Azure File CSI 不遵循 pod 请求的 fsGroupChangePolicy。带有 NFS 的 Azure File CSI 会应用默认的 OnRootMismatch FS Group 策略,无论 pod 请求的策略是什么。

  • 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 File 跨订阅支持

通过跨订阅支持,您可以在一个 Azure 订阅中有一个 OpenShift Container Platform 集群,并使用 Azure File Container Storage Interface (CSI) 驱动程序将 Azure 文件共享挂载到另一个 Azure 订阅中。

重要

OpenShift Container Platform 集群和 Azure File 共享(预置备或置备)都应在同一租户中。

6.11.4.1. Azure File 订阅的动态置备

先决条件

  • 在一个订阅中(称为 Subscription A)在 Azure 上安装带有服务主体或受管身份作为 Azure 身份的 OpenShift Container Platform 集群
  • 使用与集群相同的租户中的存储访问另一个订阅(称为 Subscription B)
  • 登录到 Azure CLI

流程

在订阅间使用 Azure File 动态置备:

  1. 运行以下适用的命令,记录 Azure 身份(服务主体或受管身份)。在后续步骤中需要 Azure 身份:

    • 如果在安装集群时使用服务主体作为 Azure 身份:

      $ 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
    • 如果在安装集群时使用受管身份作为 Azure 身份:

      $ 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 File 共享:

    • 运行以下 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> : 从上一步中获取的服务主体或受管身份,如 sp_idmi_id

      <role-name>: 角色名称。具有所需权限的贡献者或您自己的角色。

      <subscription-id>: 订阅 B ID。

      <resource-group-name>: Subscription B 资源组名称。

      或者

    • 登录到 Azure 门户和左侧菜单,点 Resource groups

      1. 选择您要为其分配角色的 Subscription B 中的资源组,方法是点 resource group Access control (IAM) Role assignments 选项卡查看当前分配,然后点 Add > Add role assignment
      2. Role 选项卡上,选择要分配的 Issuer 角色,然后点 Next。您还可以创建并选择您自己的角色,并具有所需权限。
      3. Members 选项卡中:

        1. 通过选择分配者类型来选择分配者:用户、组或服务主体(或受管身份)。
        2. Select members
        3. 搜索,然后选择上一步中记录的所需服务主体或受管身份。
        4. Select 确认。
      4. Review + assign 选项卡中,查看设置。
      5. 要完成角色分配,请点 Review + assign

        注意

        如果您只想使用特定的存储帐户来置备 Azure File 共享,您也可以通过类似步骤获取 Azure 身份(服务主体或受管身份)权限来访问存储帐户。

  3. 使用类似如下的配置创建 Azure File 存储类:

    Azure File 存储类 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
    Subscription B 资源组名称
    4
    存储帐户名称(如果要需要指定您自己的)
    5
    SKU 类型的名称
  4. 使用类似如下的配置,创建一个持久性卷声明(PVC)来指定您在上一步中创建的 Azure File 存储类:

    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
    上一步中创建的存储类的名称。

先决条件

  • 在一个订阅中(称为 Subscription A)在 Azure 上安装带有服务主体或受管身份作为 Azure 身份的 OpenShift Container Platform 集群
  • 使用与集群相同的租户中的存储访问另一个订阅(称为 Subscription B)
  • 登录到 Azure CLI

流程

  1. 对于 Azure File 共享,记录资源组、存储帐户、存储帐户密钥和 Azure File 名称。这些值用于后续步骤。
  2. 运行以下命令,为持久性卷参数 spec.csi.nodeStageSecretRef.name 创建 secret:

    $ 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 存储帐户名称和密钥。

  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
    对于 '<existing-file-share-name>,只使用文件共享名称而不是完整路径。
    6
    上一步中创建的 secret 名称。
    7
    secret 所在的命名空间。
  4. 使用类似以下内容的配置,创建一个持久性卷声明(PVC)指定第 1 步中引用的现有 Azure File 共享:

    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 存储帐户创建 secret,请现在创建它:

    此 secret 必须包含 Azure Storage Account 名称和键,并带有以下非常具体的格式,并带有两个键值对:

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

      要创建名为 azure-secret 的 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
      <namespace_name> 设置为消耗 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
    重新声明策略。告诉集群在卷被释放后如何处理它。接受的值是 RetainRecycleDelete
    4
    存储类名称。PVC 使用这个名称来绑定到这个特定 PV。对于静态置备,一个 StorageClass 对象不需要存在,但 PV 和 PVC 中的名称必须匹配。
    5
    如果要增强安全性,请修改此权限。
    6
    缓存模式。接受的值是 none, strict, 和 loose。默认值为 strict
    7
    使用减少重新连接竞争的可能性。
    8
    CIFS 客户端在从服务器请求属性信息前缓存文件或目录的属性的时间(以秒为单位)。
    9
    禁用向服务器发送字节范围锁定请求,以及 POSIX 锁定面临挑战的应用程序。
    10
    确保 volumeHandle 在集群中是唯一的。resource-group-name 是存储帐户所在的 Azure 资源组。
    11
    文件共享名称。仅使用文件共享名称;不要使用完整路径。
    12
    提供在此流程的第 1 步中创建的 secret 名称。在本例中,它是 azure-secret
    13
    创建 secret 的命名空间。这必须是使用 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 在一段时间后创建并处于 Bound 状态:

    $ 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

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat