Azure 存储 CSI 驱动程序和卷预配

Azure Blob 存储容器存储接口 (CSI) 驱动程序是符合 CSI 规范的驱动程序,供 Azure Kubernetes 服务 (AKS) 用来管理 Azure Blob 存储的生命周期。 CSI 是有关对 Kubernetes 上的容器化工作负载公开任意块和文件存储系统的一个标准。

现在,AKS 可以采用和使用 CSI 来编写、部署和迭代插件,以在 Kubernetes 中公开新的存储系统或改进现有的存储系统。 使用 AKS 中的 CSI 驱动程序避免改动核心 Kubernetes 代码并等待经历代码发布周期。

将 Azure Blob 存储作为文件系统装载到容器或 Pod 中时,它使你可以将 Blob 存储用于处理大量非结构化数据的多个应用程序。 例如:

  • 日志文件数据
  • 图像、文档和流式传输视频或音频
  • 灾难恢复数据

应用程序使用 BlobFuse 或网络文件系统 (NFS) 3.0 协议访问 Azure Blob 存储中存储的数据。 在引入 Azure Blob 存储 CSI 驱动程序之前,只能手动安装不受支持的驱动程序,从而借助在 AKS 上运行的应用程序访问 Blob 存储。 在 AKS 上启用 Azure Blob 存储 CSI 驱动程序时,有两个内置存储类:

  • azureblob-fuse-premium
  • azureblob-nfs-premium

要创建支持 CSI 驱动程序的 AKS 群集,请参阅 AKS 上的 CSI 驱动程序。 要详细了解使用 NFS 协议的每种 Azure 存储类型之间的访问差异,请参阅使用 NFS 比较对 Azure 文件、Blob 存储和 Azure NetApp 文件的访问

Azure 磁盘容器存储接口(CSI)驱动程序是 Azure Kubernetes 服务(AKS)用于管理 Azure 磁盘生命周期的 CSI 规范兼容驱动程序。

CSI 是有关对 Kubernetes 上的容器化工作负载公开任意块和文件存储系统的一个标准。 现在,AKS 可以采用和使用 CSI 来编写、部署和迭代插件,以在 Kubernetes 中公开新的存储系统或改进现有的存储系统。 使用 AKS 中的 CSI 驱动程序避免改动核心 Kubernetes 代码并等待经历代码发布周期。 若要创建支持 CSI 驱动程序的 AKS 群集,请参阅 在 AKS 上启用 CSI 驱动程序

有关 Kubernetes 存储卷的更多信息,请参阅 AKS 中应用程序的存储选项

注释

树内驱动程序 是指属于核心 Kubernetes 代码的一部分的当前存储驱动程序,而新的 CSI 驱动程序是插件。

Azure 文件容器存储接口(CSI)驱动程序是 Azure Kubernetes 服务(AKS)用来管理 Azure 文件共享生命周期的 符合 CSI 规范的驱动程序。 CSI 是有关对 Kubernetes 上的容器化工作负载公开任意块和文件存储系统的一个标准。

现在,AKS 可以采用和使用 CSI 来编写、部署和迭代插件,以在 Kubernetes 中公开新的存储系统或改进现有的存储系统。 使用 AKS 中的 CSI 驱动程序避免改动核心 Kubernetes 代码并等待经历代码发布周期。

要创建支持 CSI 驱动程序的 AKS 群集,请参阅在 AKS 上启用 CSI 驱动程序

注释

树内驱动程序 是指属于核心 Kubernetes 代码的一部分的当前存储驱动程序,而新的 CSI 驱动程序是插件。

Azure CSI 驱动程序功能

Azure Blob 存储 CSI 驱动程序支持以下功能:

  • BlobFuse
  • NFS 3.0 协议

除了树状驱动程序功能外,Azure 磁盘 CSI 驱动程序还支持以下功能:

  • 并发磁盘附加和分离期间的性能改进

    • 树中驱动程序以串行方式附加或分离磁盘,而 CSI 驱动程序分批附加或分离磁盘。 当多个磁盘连接到一个节点时,性能会显著改善。
  • 支持高级 SSD v1 和 v2。

    • PremiumV2_LRS 仅支持 None 缓存模式
  • 区域冗余存储 (ZRS) 磁盘支持

    • Premium_ZRSStandardSSD_ZRS 支持磁盘类型。 ZRS 磁盘可以调度到区域或非区域节点上,且不受磁盘卷必须与给定节点位于同一区域的限制。 有关详细信息,包括支持哪些区域,请参阅 托管磁盘的区域冗余存储
  • 卷快照

  • 卷克隆

  • 在不停机的情况下调整磁盘永久性卷的大小

注释

根据所使用的 VM SKU,Azure 磁盘 CSI(容器存储接口)驱动程序可能对每个节点设有卷限制。 对于一些功能强大的 VM(例如 16 个核心),每个节点的限制为 64 个卷。 若要确定每个 VM SKU 的限制,请查看所提供的每个 VM SKU 的“最大数据磁盘数”列。 有关提供的 VM SKU 及其相应的详细容量限制的列表,请参阅常规用途虚拟机大小

先决条件

  • 必须安装并配置 Azure CLI 2.42 或更高版本。 若要查找版本,请运行 az --version。 如果需要安装或升级,请参阅 安装 Azure CLI。 如果安装了 Azure CLI aks-preview 扩展,请确保通过调用 az extension update --name aks-preview将扩展更新到最新版本。

  • 如果以前安装了 CSI Blob 存储开放源代码驱动程序以从群集访问 Azure Blob 存储,请执行以下步骤来清理开源驱动程序

  • AKS 群集 控制平面 标识(AKS 群集名称)将添加到 VNet 和网络安全组的 “参与者 ”角色。

  • 若要在使用 BlobFuse 挂载时支持 [Azure Data Lake Storage Gen2 帐户][azure-datalake-storage-account](ADLS),请执行以下操作:

    • 若要在动态预配中使用驱动程序创建 ADLS 帐户,请在存储类参数中指定 isHnsEnabled: "true"
    • 若要在静态预配中启用对 ADLS 帐户的 BlobFuse 访问,请在持久卷中指定装载选项 --use-adls=true
    • 如果要激活具有分层命名空间的存储帐户,应使用 --use-adls=true 挂载选项重新挂载已存在的持久卷(PV)。
  • 默认情况下,BlobFuse 缓存位于 /mnt 目录中。 如果虚拟机 (VM) SKU 提供临时磁盘,则会将 /mnt 目录装载到临时磁盘上。 但是,如果 VM SKU 不提供临时磁盘,则会将 /mnt 目录装载到 OS 磁盘上,可以设置 --tmp-path= 装载选项来指定不同的缓存目录。

注释

如果在安装开源驱动程序期间未启用 blobfuse-proxy ,则开放源代码驱动程序的卸载会中断现有的 blobfuse 装载。 但是,NFS 装载仍然不受影响。

  • 必须启用 Azure 磁盘 CSI 驱动程序的 AKS 群集。 默认情况下,CSI 驱动程序在运行 Kubernetes 1.21 或更高版本的 AKS 群集上启用。

  • 已安装并配置 Azure CLI 2.37.0 或更高版本。 运行 az --version 即可查找版本。 如果需要安装或升级,请参阅 安装 Azure CLI

  • kubectl命令行工具已安装并配置为连接到 AKS 群集。

  • 配置为使用 Azure 磁盘 CSI 驱动程序的存储类(disk.csi.azure.com)。

  • Azure 磁盘 CSI 驱动程序对节点有卷限制。 卷计数因节点/节点池的大小而异。 运行 kubectl get 命令以确定可为每个节点分配的卷数:

    kubectl get CSINode <nodename> -o yaml
    

    如果每个节点的卷限制是工作负载方面的问题,请考虑对永久性卷使用 Azure 容器存储,而不是 CSI 驱动程序。

常规要求:

  • 您必须有一个启用了 Azure 文件 CSI 驱动程序的 AKS 群集。 默认情况下,在运行 Kubernetes 1.21 或更高版本的 AKS 群集上启用 Azure 文件 CSI 驱动程序。

  • 已安装并配置 Azure CLI 2.37.0 或更高版本。 若要检查版本,请运行 az --version。 如果需要安装或升级,请参阅 安装 Azure CLI

  • kubectl命令行工具已安装并配置为连接到 AKS 群集。

  • 配置为使用 Azure 文件 CSI 驱动程序的存储类(file.csi.azure.com)。

  • 在标准文件共享和高级文件共享之间进行选择时,请务必了解预配模型以及计划针对 Azure 文件运行的预期使用模式的要求。 有关详细信息,请参阅 基于使用模式选择 Azure 文件存储性能层

网络文件共享(NFS)要求:

  • AKS 群集控制平面标识(AKS 群集名称)被添加到 VNet 和 网络安全组上的“参与者”角色。

  • 必须将 AKS 群集的服务主体或托管服务标识(MSI)添加到存储帐户的 参与者 角色。

托管标识要求:

  • 确保将用户分配的 Kubelet 标识授予Storage File Data SMB MI Admin存储帐户上的适当角色。 如果使用自己的存储帐户,则需要将角色分配给 Storage File Data SMB MI Admin 该存储帐户上的用户分配的 Kubelet 标识。

  • 如果 CSI 驱动程序创建了存储帐户,请向存储帐户所在的资源组授予Storage File Data SMB MI Admin角色。

  • 如果使用默认内置的用户指定的 Kubelet 标识,则它已具有托管节点资源组上所需的 Storage File Data SMB MI Admin 角色。

注释

Azure 文件 CSI 驱动程序仅允许使用基于密钥(NTLM v2)的身份验证来装载 SMB 文件共享,因此不支持 Azure 文件共享设置的最高安全设置。 另一方面,装载 NFS 文件共享不需要基于密钥的身份验证。

在新的或现有 AKS 群集上启用 CSI 驱动程序

借助 Azure CLI,可以在新的或现有 AKS 群集上启用 Blob 存储 CSI 驱动程序,然后再配置永久性卷以供群集中的 Pod 使用。

  1. 要在新群集上启用驱动程序,请在 --enable-blob-driver 命令中包含 az aks create 参数,如下例所示:

    az aks create \
        --enable-blob-driver \
        --name myAKSCluster \
        --resource-group myResourceGroup \
        --generate-ssh-keys
    
  2. 要在现有群集上启用驱动程序,请在 --enable-blob-driver 命令中包含 az aks update 参数,如下例所示:

    az aks update --enable-blob-driver --name myAKSCluster --resource-group myResourceGroup
    

系统会提示你确认未安装开放源代码 Blob CSI 驱动程序。 确认后,可能需要几分钟才能完成此操作。 完成后,你应会在输出中看到在群集上所启用驱动程序的状态。 以下示例类似于指示上一个命令结果的部分:

"storageProfile": {
  "blobCsiDriver": {
    "enabled": true
  },
  ...
}

在现有 AKS 群集上禁用 CSI 驱动程序

借助 Azure CLI,从群集中删除永久性卷后,可禁用现有 AKS 群集上的 Blob 存储 CSI 驱动程序。

  1. 要在现有群集上禁用驱动程序,请在 --disable-blob-driver 命令中包含 az aks update 参数,如下例所示:

    az aks update --disable-blob-driver --name myAKSCluster --resource-group myResourceGroup
    

使用持久卷进行存储

Kubernetes 将 持久卷(PV)作为存储资源分配给一个或多个 Pod。 可以通过 Kubernetes 动态预配 PV,也可以以管理员身份静态预配 PV。

如果多个 Pod 需要对同一存储卷进行并发访问,则可以使用 Azure Blob 存储通过 NFS 或 BlobFuse 进行连接。 本文介绍如何动态创建 Azure Blob 存储容器,以供 AKS 群集中的多个 Pod 使用。

有关 Kubernetes 存储卷的更多信息,请参阅 AKS 中应用程序的存储选项

本文介绍如何使用 Azure 磁盘动态创建 PV,供 AKS 群集中的单个 Pod 使用。

如果多个 Pod 需要并发访问同一存储卷,则可以使用 Azure Files 通过 服务器消息块(SMB)网络文件系统(NFS)进行连接。 本文将介绍如何动态创建 Azure 文件共享以供 AKS 群集中的多个 Pod 使用。

动态预配的卷: 如果希望 Kubernetes 自动创建和管理存储资源,请使用此方法。 它非常适合需要按需缩放、首选基础结构即代码的方案,并且希望最大程度地减少手动配置步骤。

静态预配卷: 如果已有要使用的 Azure Blob 存储帐户或容器,请选择此方法。 它提供对存储设置、访问和生命周期的更多控制,当需要连接到现有资源或跨多个群集或工作负荷重复使用存储时,它适用。

本部分为想要预配一个或多个永久性卷的群集管理员提供指导,其中包括可供工作负荷使用的 Blob 存储的详细信息。 永久性卷声明(PVC)使用存储类对象来动态预配 Azure Blob 存储容器。

若要通过提供的存储类使用 Azure Blob 存储预配永久性卷,请执行以下步骤:

  1. 通过将以下 YAML 保存到名为 StorageClass 的文件中来创建 blob-fuse-sc.yaml 清单:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: blob-fuse
    provisioner: blob.csi.azure.com
    parameters:
      skuName: Premium_LRS  # available values: Standard_LRS, Premium_LRS, Standard_GRS, Standard_RAGRS
      protocol: fuse2
      networkEndpointType: privateEndpoint
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    allowVolumeExpansion: true
    mountOptions:
      - -o allow_other
      - --file-cache-timeout-in-seconds=120
      - --use-attr-cache=true
      - --cancel-list-on-mount-seconds=10  # prevent billing charges on mounting
      - -o attr_timeout=120
      - -o entry_timeout=120
      - -o negative_timeout=120
      - --log-level=LOG_WARNING  # LOG_WARNING, LOG_INFO, LOG_DEBUG
      - --cache-size-mb=1000  # Default will be 80% of available memory, eviction will happen beyond specified value.
    
  2. 若要在群集中创建存储类,请运行以下命令,以应用 StorageClass

    kubectl apply -f blob-fuse-sc.yaml
    

使用内置存储类创建 PVC

存储类用于定义创建 Azure Blob 存储容器的方法。 节点资源组中会自动创建一个存储帐户,用于与存储类一起来保存 Azure Blob 存储容器。 为“skuName”选择以下 Azure 存储冗余 SKU 之一:

  • Standard_LRS:标准本地冗余存储
  • Premium_LRS:高级本地冗余存储
  • Standard_GRS:标准异地冗余存储
  • Standard_RAGRS:标准只读访问地理冗余存储

在 AKS 上使用存储 CSI 驱动程序时,还存在两个内置组件,这些组件使用 Azure Blob CSI 存储驱动程序 StorageClasses

针对这两个存储类的回收策略可确保在删除相应 PV 时删除基础 Azure Blob 存储。 默认情况下,存储类还会将容器配置为可扩展,因为 set allowVolumeExpansion 参数设置为 true

注释

不支持收缩永久性卷。

使用 kubectl get sc 命令查看存储类。 以下示例显示了 AKS 群集中提供的 azureblob-fuse-premiumazureblob-nfs-premium 存储类:

NAME                     PROVISIONER          RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
azureblob-fuse-premium   blob.csi.azure.com   Delete          Immediate           true                   23h
azureblob-nfs-premium    blob.csi.azure.com   Delete          Immediate           true                   23h

若要使用这些存储类,请创建一个引用并使用这些类的 PVC 和相应 Pod。 PVC 用于根据存储类自动分配存储。 可以使用内置存储类之一或自定义存储类创建 PVC。 此 PVC 创建具有指定 SKU、大小和协议的 Azure Blob 存储容器。 创建 Pod 定义时,将指定 PVC 来请求所需的存储。

PVC 使用存储类对象动态预配 Azure Blob 存储容器。 以下 YAML 可用于使用内置存储类创建具有 ReadWriteMany 访问权限的 5 GB PVC。 有关访问模式的详细信息,请参阅 Kubernetes 持久卷 文档。

  1. 创建一个名为 blob-nfs-pvc.yaml 并复制以下 YAML 的文件:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: azure-blob-storage
    spec:
      accessModes:
      - ReadWriteMany
      storageClassName: azureblob-nfs-premium
      resources:
        requests:
          storage: 5Gi
    
  2. 使用 kubectl create 命令创建 PVC:

    kubectl create -f blob-nfs-pvc.yaml
    

完成后,将创建 Blob 存储容器。 可以使用 kubectl get 命令查看 PVC 的状态:

kubectl get pvc azure-blob-storage

命令的输出类似于以下示例:

NAME                 STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                AGE
azure-blob-storage   Bound    pvc-b88e36c5-c518-4d38-a5ee-337a7dda0a68   5Gi        RWX            azureblob-nfs-premium       92m

装载 PVC

以下 YAML 创建一个 Pod,该 Pod 使用 PVC azure-blob-storage/mnt/blob 路径装载 Azure Blob 存储。

  1. 创建一个名为 blob-nfs-pv的文件,并复制以下 YAML。 请确保 claimName 与上一步中创建的 PVC 匹配。

    kind: Pod
    apiVersion: v1
    metadata:
      name: mypod
    spec:
      containers:
      - name: mypod
        image: mcr.azk8s.cn/oss/nginx/nginx:1.17.3-alpine
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 250m
            memory: 256Mi
        volumeMounts:
        - mountPath: "/mnt/blob"
          name: volume
          readOnly: false
      volumes:
        - name: volume
          persistentVolumeClaim:
            claimName: azure-blob-storage
    
  2. 使用 kubectl apply 命令创建 Pod:

    kubectl apply -f blob-nfs-pv.yaml
    
  3. Pod 处于运行状态后,运行以下命令以创建名为 test.txt 的新文件。

    kubectl exec mypod -- touch /mnt/blob/test.txt
    
  4. 若要验证磁盘是否已正确装载,请运行以下命令,并验证是否在 test.txt 输出中看到该文件:

    kubectl exec mypod -- ls /mnt/blob
    

    命令的输出类似于以下示例:

    test.txt
    

创建 Azure Blob 自定义存储类

默认存储类适合最常见的方案,但并非适合所有方案。 在某些情况下,你可能想要使用自己的参数自定义自己的存储类。 在本部分中,我们将提供两个示例,其中第一个示例使用 NFS 协议,第二个示例使用 BlobFuse。

在此示例中,以下清单使用 NFS 协议配置装载 Blob 存储容器。 使用它添加 tags 参数。

  1. 创建名为 blob-nfs-sc.yaml 的文件,并粘贴以下示例清单:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: azureblob-nfs-premium
    provisioner: blob.csi.azure.com
    parameters:
      protocol: nfs
      tags: environment=Development
    volumeBindingMode: Immediate
    allowVolumeExpansion: true
    mountOptions:
      - nconnect=4
    
  2. 使用 kubectl apply 命令创建存储类:

    kubectl apply -f blob-nfs-sc.yaml
    

    命令的输出类似于以下示例:

    storageclass.storage.k8s.io/blob-nfs-premium created
    

装载 NFS 或 BlobFuse PV

在本部分中,将使用 NFS 协议或 BlobFuse 装载 PV。

使用 NFS v3 协议装载 Blob 存储不会使用帐户密钥进行身份验证。 AKS 群集需要与代理节点位于同一虚拟网络或对等虚拟网络中。 保护存储帐户中的数据的唯一方法是使用虚拟网络和其他网络安全设置。 有关如何设置对存储帐户的 NFS 访问权限的详细信息,请参阅 使用网络文件系统 (NFS) 3.0 协议装载 Blob 存储

以下示例演示如何使用 NFS 协议将 Blob 存储容器装载为永久性卷。

  1. 创建名为 pv-blob-nfs.yaml 的文件,并将其复制到以下 YAML 中。 在 storageClass 下,更新 resourceGroupstorageAccountcontainerName

    注释

    volumeHandle YAML 中的值应当是群集中每个相同的存储 Blob 容器的唯一 volumeID。

    字符 #/ 保留供内部使用,不能使用。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      annotations:
        pv.kubernetes.io/provisioned-by: blob.csi.azure.com
      name: pv-blob
    spec:
      capacity:
        storage: 1Pi
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain  # If set as "Delete" container would be removed after pvc deletion
      storageClassName: azureblob-nfs-premium
      mountOptions:
        - nconnect=4
      csi:
        driver: blob.csi.azure.com
        # make sure volumeid is unique for every identical storage blob container in the cluster
        # character `#` and `/` are reserved for internal use and cannot be used in volumehandle
        volumeHandle: account-name_container-name
        volumeAttributes:
          resourceGroup: resourceGroupName
          storageAccount: storageAccountName
          containerName: containerName
          protocol: nfs
    

    注释

    虽然 Kubernetes API容量 属性是必需的,但 Azure Blob 存储 CSI 驱动程序不使用此值,因为可以灵活写入数据,直到达到存储帐户的容量限制。 特性的值 capacity 仅用于 PVPVC 之间的大小匹配。 建议使用虚构的较高数值。 Pod 看到一个装载的卷,其虚构大小为 5 PB。

  2. 运行以下命令,使用 kubectl create 命令创建永久性卷,引用前面创建的 YAML 文件:

    kubectl create -f pv-blob-nfs.yaml
    
  3. 使用 pvc-blob-nfs.yamlPersistentVolumeClaim 创建文件。 例如:

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pvc-blob
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
      volumeName: pv-blob
      storageClassName: azureblob-nfs-premium
    
  4. 运行以下命令,通过引用之前创建的 YAML 文件的 kubectl create 命令来创建持久卷声明:

    kubectl create -f pvc-blob-nfs.yaml
    

创建容器组

以下 YAML 创建了一个 Pod,该 Pod 使用之前创建的名为 pvc-blob 的 PV 或 PVC,以便在 /mnt/blob 路径下装载 Azure Blob 存储。

  1. 创建名为 nginx-pod-blob.yaml 的文件,并将其复制到以下 YAML 中。 确保在为 NFS 或 BlobFuse 创建 PV 时,claimName 与在上一步中创建的 PVC 匹配。

    kind: Pod
    apiVersion: v1
    metadata:
      name: nginx-blob
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
        - image: mcr.azk8s.cn/oss/nginx/nginx:1.17.3-alpine
          name: nginx-blob
          volumeMounts:
            - name: blob01
              mountPath: "/mnt/blob"
              readOnly: false
      volumes:
        - name: blob01
          persistentVolumeClaim:
            claimName: pvc-blob
    
  2. 运行以下命令,使用 kubectl create 命令创建 Pod 并装载 PVC:

    kubectl create -f nginx-pod-blob.yaml
    
  3. 运行以下命令,使用 Pod 创建交互式 shell 会话,以验证是否已装载 Blob 存储:

    kubectl exec -it nginx-blob -- df -h
    

    命令的输出如下例所示:

    Filesystem      Size  Used Avail Use% Mounted on
    ...
    blobfuse         14G   41M   13G   1% /mnt/blob
    ...
    

创建 StatefulSet

若要确保工作负载在 Pod 重启或替换时保留其存储卷,请使用 StatefulSet。 StatefulSet 简化了将持久存储与 Pod 相关联的过程,从而使用于替换失败 Pod 的新 Pod 可以自动访问相同的存储卷。 以下示例演示如何使用 BlobFuse 或 NFS 协议为 Blob 存储设置 StatefulSet。

  1. 创建名为 azure-blob-nfs-ss.yaml 的文件,并将其复制到以下 YAML 中。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: statefulset-blob-nfs
      labels:
        app: nginx
    spec:
      serviceName: statefulset-blob-nfs
      replicas: 1
      template:
        metadata:
          labels:
            app: nginx
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
            - name: statefulset-blob-nfs
              image: mcr.azk8s.cn/azurelinux/base/nginx:1.25
              volumeMounts:
                - name: persistent-storage
                  mountPath: /mnt/blob
      updateStrategy:
        type: RollingUpdate
      selector:
        matchLabels:
          app: nginx
      volumeClaimTemplates:
        - metadata:
            name: persistent-storage
          spec:
            storageClassName: azureblob-nfs-premium
            accessModes: ["ReadWriteMany"]
            resources:
              requests:
                storage: 100Gi
    
  2. 使用 kubectl create 以下命令创建 StatefulSet:

    kubectl create -f azure-blob-nfs-ss.yaml
    

动态 PVC 存储类参数

下表包含可用于为动态 PVC 定义自定义存储类的参数。

Name Description Example 强制的 默认值
skuName 指定 Azure 存储帐户类型(别名: storageAccountType) 。 Standard_LRSPremium_LRSStandard_GRSStandard_RAGRS Standard_LRS
位置 指定 Azure 位置。 chinanorth3 如果为空,驱动程序使用与当前群集相同的位置名称。
resourceGroup 指定 Azure 资源组名称。 myResourceGroup 如果为空,驱动程序将使用与当前群集相同的资源组名称。
存储帐户 指定 Azure 存储帐户名称。 storageAccountName 如果未提供特定的存储帐户名称,驱动程序将查找与同一资源组中的帐户设置匹配的合适存储帐户。 如果找不到匹配的存储帐户,则会创建一个新帐户。 但是,如果指定了存储帐户名称,则存储帐户必须已经存在。
networkEndpointType 1 为驱动程序创建的存储帐户指定网络终结点类型。 如果指定了 privateEndpoint,则会为存储帐户创建 专用终结点 。 对于其他情况,将为 NFS 协议创建服务终结点。 privateEndpoint 对于 AKS 群集,请将 AKS 群集名称添加到托管 VNet 的资源组的“参与者”角色中。
协议 指定 BlobFuse 装载或 NFSv3 装载。 fusenfs fuse
containerName 指定现有容器(目录)名称。 容器 如果为空,驱动程序将创建一个新的容器名称,从 pvc-fuse BlobFuse 或 pvc-nfs NFS v3 开始。
containerNamePrefix 指定驱动程序创建的 Azure 存储目录前缀。 只能包含小写字母、数字、连字符和长度应少于 21 个字符。
服务器 指定 Azure 存储帐户域名。 现有存储帐户的 DNS 域名,例如 <storage-account>.blob.core.chinacloudapi.cn 如果为空,驱动程序使用默认 <storage-account>.blob.core.chinacloudapi.cn 或其他主权云存储帐户 DNS 域名。
允许Blob公共访问 允许或禁止公共访问驱动程序创建的存储帐户的所有 Blob 或容器。 truefalse false
storageEndpointSuffix 指定 Azure 存储终结点后缀。 core.chinacloudapi.cn 如果为空,驱动程序会根据云环境使用默认存储终结点后缀。
tags [标记][az-tags] 将在新的存储帐户中创建。 标记格式:“foo=aaa,bar=bbb” ""
matchTags 驱动程序尝试查找合适的存储帐户时匹配标记。 truefalse false

1 如果存储帐户由驱动程序创建,则只需在存储类中指定 networkEndpointType: privateEndpoint 参数。 CSI 驱动程序将创建专用终结点和专用 DNS 区域(命名 privatelink.blob.core.chinacloudapi.cn)以及帐户。 如果自带存储帐户,则需要为存储帐户 创建专用终结点 。 如果在网络隔离群集中使用 Azure Blob 存储,则必须使用 networkEndpointType: privateEndpoint 创建自定义存储类。

静态 PV 预配参数

下表包含可用于定义静态 PV 的参数。

Name Description Example 强制的 默认值
volumeHandle 指定一个值,以供驱动程序在群集中唯一识别存储 Blob 容器。 生成唯一值的建议方法是组合全局唯一存储帐户名称和容器名称: {account-name}_{container-name}

#/ 字符保留供内部使用,不能在卷句柄中使用。
是的
volumeAttributes.resourceGroup 指定 Azure 资源组名称。 myResourceGroup 如果为空,驱动程序将使用与当前群集相同的资源组名称。
卷属性.存储账户 指定现有的 Azure 存储帐户名称。 storageAccountName 是的
volumeAttributes.containerName 指定现有的容器名称。 容器 是的
volumeAttributes.protocol 指定 BlobFuse 装载或 NFS v3 装载。 fusenfs fuse

使用内置存储类创建 Azure 磁盘 PV

存储类用于定义如何使用 PV 动态创建存储单元。 有关 Kubernetes 存储类的详细信息,请参阅 Kubernetes 存储类

在 AKS 上使用 Azure 磁盘 CSI 驱动程序时,还有两个使用 Azure 磁盘 CSI 存储驱动程序的内置 StorageClasses 驱动程序。 其他 CSI 存储类是使用群集连同树中默认的存储类一起创建的。

  • managed-csi:使用具有本地冗余存储的 Azure 标准 SSD 创建托管磁盘(LRS)。 对于跨多个可用性区域部署的 AKS 群集的 Kubernetes 版本 1.29,此存储类使用 Azure 标准 SSD 区域冗余存储(ZRS)来预配托管磁盘。

  • managed-csi-premium:使用 Azure 高级 LRS 预配托管磁盘。 从 Kubernetes 版本 1.29 开始,对于跨多个可用性区域的 AKS 群集,此存储类会自动使用 Azure Premium ZRS 创建托管磁盘。

从 Kubernetes 版本 1.29 开始,跨多个可用性区域部署 Azure Kubernetes 服务 (AKS) 群集时,AKS 现在利用区域冗余存储 (ZRS) 在内置存储类中创建托管磁盘。

  • ZRS 确保在所选区域中的多个 Azure 可用性区域之间同步复制 Azure 托管磁盘。 此冗余策略可增强应用程序的复原能力,并保护数据免受数据中心故障的影响。

  • 但是,请务必注意,与本地冗余存储 (LRS) 相比,区域冗余存储 (ZRS) 的成本更高。 如果成本优化是优先级,则可以使用 LRS SKU 名称参数创建新的存储类,并将其用于永久性卷声明。

由于存在数据丢失风险,不支持缩小 PVC 的大小。 可以使用 kubectl edit sc 命令编辑现有存储类,也可以创建自己的自定义存储类。 例如,如果要使用大小为 4 TiB 的磁盘,则必须创建一个存储类,该类定义 cachingmode: None ,因为磁盘 4 TiB 和更大的磁盘不支持磁盘缓存][disk-host-cache-setting]。 有关存储类和创建自己的存储类的详细信息,请参阅 AKS 中应用程序的存储选项

这两个存储类中的回收策略可确保在删除相应的 PV 时删除基础 Azure 磁盘。 存储类还会将 PV 配置为可扩展。 只需将 PVC 编辑为新大小即可。

若要使用这些存储类,请创建一个 PVC 和相应的 Pod 来引用和使用它们。 PVC 用于基于存储类自动预配存储。 PVC 可以使用预先创建的存储类之一或用户定义的存储类为所需的 SKU 和大小创建 Azure 托管磁盘。 创建 Pod 定义时,将指定 PVC 来请求所需的存储。

注释

持久性卷声明是以 GiB 为单位指定的,但 Azure 托管磁盘的收费是基于特定大小的 SKU。 这些 SKU 的范围为 32 GiB(适用于 S4 或 P4 磁盘)到 32 TiB(适用于 S80 或 P80 磁盘),属于预览版。 高级托管磁盘的吞吐量和 IOPS 性能取决于 SKU 和 AKS 群集中节点的实例大小。 有关详细信息,请参阅托管磁盘的定价和性能

可以使用 kubectl get sc 命令查看预先创建的存储类。 以下示例显示了 AKS 群集中可用的预先创建的存储类:

kubectl get sc

命令的输出类似于以下示例:

NAME                PROVISIONER                AGE
default (default)   disk.csi.azure.com         1h
managed-csi         disk.csi.azure.com         1h

PVC 根据存储类自动预配存储。 在这种情况下,PVC 可以使用预先创建的存储类之一创建标准或高级 Azure 托管磁盘。

  1. 创建名为 azure-pvc.yaml 的文件,并将其复制到以下清单中。 请求获取一个名为azure-managed-disk且大小为5 GB的磁盘,并具有ReadWriteOnce访问权限。 managed-csi 存储类指定为存储类

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
        name: azure-managed-disk
    spec:
      accessModes:
      - ReadWriteOnce
      storageClassName: managed-csi
      resources:
        requests:
          storage: 5Gi
    

    小窍门

    要创建使用高级存储的磁盘,请使用 storageClassName: managed-csi-premium 而不是 managed-csi

  2. 使用 kubectl apply 命令创建永久性卷声明,并指定 azure-pvc.yaml 文件。

    kubectl apply -f azure-pvc.yaml
    

    命令的输出类似于以下示例:

    persistentvolumeclaim/azure-managed-disk created
    

将 PVC 应用到 Pod

创建永久性卷声明后,必须验证其状态为“Pending”。 状态“Pending”指示它已准备好供 Pod 使用。

  1. 使用 kubectl describe pvc 命令检查 PVC 的状态。

    kubectl describe pvc azure-managed-disk
    

    命令的输出类似于以下示例:

    Name:            azure-managed-disk
    Namespace:       default
    StorageClass:    managed-csi
    Status:          Pending
    [...]
    
  2. 创建名为 azure-pvc-disk.yaml 的文件,并将其复制到以下清单中。 此清单创建了一个基本的 NGINX Pod,该 Pod 使用名为 azure-managed-disk 的持久性卷声明,在路径 /mnt/azure 上挂载 Azure 磁盘。 对于 Windows Server 容器,请使用 Windows 路径约定指定 mountPath,例如“D:”

    kind: Pod
    apiVersion: v1
    metadata:
      name: mypod
    spec:
      containers:
        - name: mypod
          image: mcr.azk8s.cn/oss/nginx/nginx:1.15.5-alpine
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: 250m
              memory: 256Mi
          volumeMounts:
            - mountPath: "/mnt/azure"
              name: volume
              readOnly: false
      volumes:
        - name: volume
          persistentVolumeClaim:
            claimName: azure-managed-disk
    
  3. 使用 kubectl apply 命令创建 pod。

    kubectl apply -f azure-pvc-disk.yaml
    

    命令的输出类似于以下示例:

    pod/mypod created
    
  4. 现在你有一个正在运行的 Pod,其中 Azure 磁盘被装载到 /mnt/azure 目录中。 使用 kubectl describe 命令检查 Pod 配置。

    kubectl describe pod mypod
    

    命令的输出类似于以下示例:

    [...]
    Volumes:
      volume:
        Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
        ClaimName:  azure-managed-disk
        ReadOnly:   false
       default-token-smm2n:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  default-token-smm2n
        Optional:    false
    [...]
     Events:
      Type    Reason                 Age   From                               Message
      ----    ------                 ----  ----                               -------
      Normal  Scheduled              2m    default-scheduler                  Successfully assigned mypod to aks-nodepool1-79590246-0
      Normal  SuccessfulMountVolume  2m    kubelet, aks-nodepool1-79590246-0  MountVolume.SetUp succeeded for volume "default-token-smm2n"
      Normal  SuccessfulMountVolume  1m    kubelet, aks-nodepool1-79590246-0  MountVolume.SetUp succeeded for volume "pvc-faf0f176-8b8d-11e8-923b-deb28c58d242"
    [...]
    

PVC 的动态存储类参数

下表包含可用于为 PVC 定义自定义存储类的参数。

Name Meaning 可用值 强制的 默认值
skuName Azure 磁盘存储帐户类型(别名:storageAccountType Standard_LRSPremium_LRSStandardSSD_LRSPremiumV2_LRSUltraSSD_LRS StandardSSD_LRS
fsType 文件系统类型 ext4ext3ext2xfsbtrfs(适用于 Linux)、ntfs(适用于 Windows) ext4(适用于 Linux)、ntfs(适用于 Windows)
cachingMode [Azure 数据磁盘主机缓存设置][disk-host-cache-setting](PremiumV2_LRS和UltraSSD_LRS仅支持 None 缓存模式) NoneReadOnlyReadWrite ReadOnly
resourceGroup 指定 Azure 磁盘的资源组 现有资源组名称 如果为空,驱动程序将使用与当前 AKS 群集相同的资源组名称
DiskIOPSReadWrite [UltraSSD 磁盘][ultra-ssd-disks] 或 [Premium SSD v2][premiumv2_lrs_disks] IOPS 性能(最小值:2 IOPS/GiB) 100~160000 500
DiskMBpsReadWrite [UltraSSD 磁盘][ultra-ssd-disks] 或 [Premium SSD v2][premiumv2_lrs_disks] 吞吐能力(最小值:0.032/GiB) 1~2000 100
LogicalSectorSize 超级磁盘的逻辑扇区大小(以字节为单位)。 支持的值为 512 ad 4096。 4096 是默认值。 5124096 4096
tags Azure 磁盘 [tags][azure-tags] 标记格式:key1=val1,key2=val2 ""
diskEncryptionSetID 要用于[启用静态加密][disk-encryption] 的磁盘加密集的 ResourceId 格式:/subscriptions/{subs-id}/resourceGroups/{rg-name}/providers/Microsoft.Compute/diskEncryptionSets/{diskEncryptionSet-name} ""
diskEncryptionType 磁盘加密集的加密类型。 EncryptionAtRestWithCustomerKey (默认情况下), EncryptionAtRestWithPlatformAndCustomerKeys ""
writeAcceleratorEnabled [Azure 磁盘上的写入加速器][azure-disk-write-accelerator] truefalse ""
networkAccessPolicy NetworkAccessPolicy 属性,用于防止生成磁盘或快照的 SAS URI AllowAllDenyAllAllowPrivate AllowAll
diskAccessID 用于在磁盘上使用专用终结点的 DiskAccess 资源的 Azure 资源 ID ``
enableBursting [启用按需突发][按需突发] 超出磁盘的预配性能目标。 按需突发应仅应用于高级版磁盘,同时磁盘大小 > 512 GB。 不支持超级磁盘和共享磁盘。 默认情况下禁用突发。 truefalse false
userAgent 用户代理用于 [客户使用情况归因][customer-usage-attribution] 生成的用户代理的格式设置为 driverName/driverVersion compiler/version (OS-ARCH)
subscriptionID 指定在其中创建 Azure 磁盘的 Azure 订阅 ID。 Azure 订阅 ID 如果不为空,则必须提供 resourceGroup

PV 的静态预配参数

下表包含可用于定义 PV 的参数。

Name Meaning 可用值 强制的 默认值
volumeHandle Azure 磁盘 URI /subscriptions/{sub-id}/resourcegroups/{group-name}/providers/microsoft.compute/disks/{disk-id} 是的 N/A
volumeAttributes.fsType 文件系统类型 ext4ext3ext2xfsbtrfs(适用于 Linux)、ntfs(适用于 Windows) ext4(适用于 Linux)、ntfs(适用于 Windows)
volumeAttributes.partition 现有磁盘的分区号(仅在 Linux 上受支持) 123 空(无分区)
- 确保分区格式类似于 -part1
volumeAttributes.cachingMode [磁盘主机缓存设置][disk-host-cache-setting] NoneReadOnlyReadWrite ReadOnly

创建 Azure 磁盘自定义存储类

默认存储类适用于最常见的方案。 在某些情况下,你可能想要使用自己的参数来自定义自己的存储类。 例如,你可能想要更改 volumeBindingMode 类。

可以使用一个 volumeBindingMode: Immediate 类,该类保证在创建持久性卷声明(PVC)后能立即使用。 当节点池受到拓扑约束时,例如使用可用区时,PV 会被绑定或提供,而无法知晓 Pod 的调度要求。

若要解决这种情况,可以使用 volumeBindingMode: WaitForFirstConsumer,这会在创建一个使用 PVC 的 Pod 之前延迟 PV 的绑定和预配。 此方法可确保按照 Pod 的调度约束,在相同的可用性区域或拓扑中预配持久卷(PV)。 默认存储类使用 volumeBindingMode: WaitForFirstConsumer 类。

  1. 创建一个名为 sc-azuredisk-csi-waitforfirstconsumer.yaml的文件,然后粘贴以下清单。 存储类与 managed-csi 存储类相同,但具有不同的 volumeBindingMode 类。 例如:

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: azuredisk-csi-waitforfirstconsumer
    provisioner: disk.csi.azure.com
    parameters:
      skuname: StandardSSD_LRS
    allowVolumeExpansion: true
    reclaimPolicy: Delete
    volumeBindingMode: WaitForFirstConsumer
    
  2. 通过运行 kubectl apply 命令并指定 sc-azuredisk-csi-waitforfirstconsumer.yaml 文件来创建存储类:

    kubectl apply -f sc-azuredisk-csi-waitforfirstconsumer.yaml
    

    命令的输出类似于以下示例:

    storageclass.storage.k8s.io/azuredisk-csi-waitforfirstconsumer created
    

了解卷快照

Azure 磁盘 CSI 驱动程序支持卷快照,使你能够在特定时间点捕获持久卷的状态,从而便于进行备份和还原操作。 卷快照允许您在不中断正在运行的应用程序的情况下创建持久数据的时间点副本。 可以使用这些快照创建新卷或将现有卷还原到以前的状态。

可以创建两种类型的快照:

  • 完整快照:捕获磁盘的完整状态。

  • 增量快照:仅捕获自上次快照以来的更改,从而提供更好的存储效率和成本节省。 当在您的 VolumeSnapshotClass 中,将 参数设置为 incremental 时,true是默认行为。

下表提供了这些参数的详细信息。

Name Meaning 可用值 强制的 默认值
resourceGroup 用于存储快照的资源组 现有资源组 如果未指定存储位置,快照将存储在源 Azure 磁盘所在的同一资源组中。
增量 创建 完整快照或增量快照 truefalse true
tags Azure 磁盘 标记 标记格式:“key1=val1,key2=val2” ""
userAgent 用于客户使用情况归因的用户代理 生成的用户代理格式为 driverName/driverVersion compiler/version (OS-ARCH)
subscriptionID 指定用于创建 Azure 磁盘的 Azure 订阅 ID Azure 订阅 ID 如果未为空, resourceGroup 则必须提供, incremental 必须设置为 false

卷快照支持以下场景:

  • 备份和还原:创建有状态应用程序数据的时间点备份,并在需要时还原。
  • 数据克隆:克隆现有卷以使用相同的数据创建新的永久性卷。
  • 灾难恢复:快速从数据丢失或损坏中恢复。

创建卷快照

注释

在继续之前,请确保应用程序不会将数据写入源磁盘。

  1. 有关此功能的示例,请使用kubectl apply命令创建一个卷快照类

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/snapshot/storageclass-azuredisk-snapshot.yaml
    

    命令的输出类似于以下示例:

    volumesnapshotclass.snapshot.storage.k8s.io/csi-azuredisk-vsc created
    
  2. 从本文前面提到的 PVC 创建 卷快照

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/snapshot/azuredisk-volume-snapshot.yaml
    

    命令的输出类似于以下示例:

    volumesnapshot.snapshot.storage.k8s.io/azuredisk-volume-snapshot created
    
  3. 若要验证是否已正确创建快照,请运行以下命令:

    kubectl describe volumesnapshot azuredisk-volume-snapshot
    

    命令的输出类似于以下示例:

    Name:         azuredisk-volume-snapshot
    Namespace:    default
    Labels:       <none>
    Annotations:  API Version:  snapshot.storage.k8s.io/v1
    Kind:         VolumeSnapshot
    Metadata:
      Creation Timestamp:  2020-08-27T05:27:58Z
      Finalizers:
        snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection
        snapshot.storage.kubernetes.io/volumesnapshot-bound-protection
      Generation:        1
      Resource Version:  714582
      Self Link:         /apis/snapshot.storage.k8s.io/v1/namespaces/default/volumesnapshots/azuredisk-volume-snapshot
      UID:               dd953ab5-6c24-42d4-ad4a-f33180e0ef87
    Spec:
      Source:
        Persistent Volume Claim Name:  pvc-azuredisk
      Volume Snapshot Class Name:      csi-azuredisk-vsc
    Status:
      Bound Volume Snapshot Content Name:  snapcontent-dd953ab5-6c24-42d4-ad4a-f33180e0ef87
      Creation Time:                       2020-08-31T05:27:59Z
      Ready To Use:                        true
      Restore Size:                        10Gi
    Events:                                <none>
    

基于卷快照创建新的 PVC

可以基于卷快照创建新的 PVC。

  1. 使用在上一步中创建的快照,来创建新的 PVC 和新的 Pod,以便进行使用:

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/snapshot/pvc-azuredisk-snapshot-restored.yaml
    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/snapshot/nginx-pod-restored-snapshot.yaml
    

    命令的输出类似于以下示例:

    persistentvolumeclaim/pvc-azuredisk-snapshot-restored created
    pod/nginx-restored created
    
  2. 为了确保它与之前创建的 PVC 是相同的,请通过运行以下命令来检查内容。

    kubectl exec nginx-restored -- ls /mnt/azuredisk
    

    命令的输出类似于以下示例:

    lost+found
    outfile
    test.txt
    

我们仍然可以按预期看到我们之前创建的test.txt文件,

克隆卷

克隆的卷定义为现有 Kubernetes 卷的副本。 有关在 Kubernetes 中克隆卷的详细信息,请参阅 卷克隆

  1. 创建以前创建的azuredisk-pvc和新 Pod 以使用它。

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/cloning/pvc-azuredisk-cloning.yaml
    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/cloning/nginx-pod-restored-cloning.yaml
    

    命令的输出类似于以下示例:

    persistentvolumeclaim/pvc-azuredisk-cloning created
    pod/nginx-restored-cloning created
    
  2. 可以通过运行以下命令来验证克隆的卷的内容,并查看文件 test.txt 是否已创建:

    kubectl exec nginx-restored-cloning -- ls /mnt/azuredisk
    

    命令的输出类似于以下示例:

    lost+found
    outfile
    test.txt
    

在不停机的情况下调整 Azure 磁盘 PV 的大小

可为 PVC 请求较大的卷。 编辑 PVC 对象,并指定较大的大小。 此项更改会触发为 PV 提供支持的基础卷的扩展。

注释

永远不会创建新的 PV 来满足声明, 而是会调整现有卷的大小。

在 AKS 中,内置 managed-csi 存储类已经支持扩展,因此请使用 以前创建的 扩展。 PVC 请求 10 GiB 永久性存储卷。 可以通过运行以下命令进行确认:

kubectl exec -it nginx-azuredisk -- df -h /mnt/azuredisk

命令的输出类似于以下示例:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sdc        9.8G   42M  9.8G   1% /mnt/azuredisk
  1. 通过运行以下命令来扩展 PVC,并增加 spec.resources.requests.storage 字段:

    kubectl patch pvc pvc-azuredisk --type merge --patch '{"spec": {"resources": {"requests": {"storage": "15Gi"}}}}'
    

    注释

    目前不支持缩小 PV。 尝试修改尺寸比当前大小更小的现有 PVC 会出现以下错误消息:

    The persistentVolumeClaim "pvc-azuredisk" is invalid: spec.resources.requests.storage: Forbidden: field can not be less than previous value.

    命令的输出类似于以下示例:

    persistentvolumeclaim/pvc-azuredisk patched
    
  2. 运行以下命令以确认存储卷大小增加:

    kubectl get pv
    

    命令的输出类似于以下示例:

    NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                     STORAGECLASS   REASON   AGE
    pvc-391ea1a6-0191-4022-b915-c8dc4216174a   15Gi       RWO            Delete           Bound    default/pvc-azuredisk     managed-csi             2d2h
    (...)
    
  3. 几分钟后,运行以下命令以确认 PVC 的大小:

    kubectl get pvc pvc-azuredisk
    

    命令的输出类似于以下示例:

    NAME            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    pvc-azuredisk   Bound    pvc-391ea1a6-0191-4022-b915-c8dc4216174a   15Gi       RWO            managed-csi    2d2h
    
  4. 运行以下命令,确认 Pod 中的磁盘大小:

    kubectl exec -it nginx-azuredisk -- df -h /mnt/azuredisk
    

    命令的输出类似于以下示例:

    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sdc         15G   46M   15G   1% /mnt/azuredisk
    

如果 Pod 有多个 容器,可以通过运行以下命令来指定哪个容器:

kubectl exec -it nginx-azuredisk -c <ContainerName> -- df -h /mnt/azuredisk

Windows 容器

Azure 磁盘 CSI 驱动程序支持 Windows 节点和容器。 若要使用 Windows 容器,请按照 Windows 容器快速入门 添加 Windows 节点池。

  1. 拥有 Windows 节点池后,现在可以使用内置的存储类,例如 managed-csi。 可以部署一个基于 Windows 的有状态集示例,通过运行以下data.txt命令,将时间戳保存到文件中:

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/windows/statefulset.yaml
    

    命令的输出类似于以下示例:

    statefulset.apps/busybox-azuredisk created
    
  2. 若要验证卷的内容,请运行以下命令:

    kubectl exec -it statefulset-azuredisk-win-0 -- powershell -c "type c:/mnt/azuredisk/data.txt"
    

    命令的输出类似于以下示例:

    2020-08-27 08:13:41Z
    2020-08-27 08:13:42Z
    2020-08-27 08:13:44Z
    (...)
    

按需突发

随需磁盘突发模型允许当磁盘需求超过当前容量时进行突发。 每当磁盘突发时,此模型会产生额外的费用。 按需突发仅适用于大于 512 GiB 的高级 SSD。 有关每个磁盘预配的高级 SSD IOPS 和吞吐量的详细信息,请参阅 高级 SSD 大小。 或者,基于信用额度的突发是指磁盘只有在其信用桶中累积了突发信用时才会突发。 磁盘突发时,基于信用的突发机制不会产生额外的费用。 基于信用的突发仅适用于 512 GiB 及以下的高级 SSD 和 1,024 GiB 及以下的标准 SSD。 有关按需突发的详细信息,请参阅 按需突发

重要

默认 managed-csi-premium 存储类已禁用按需突发,并使用基于信用的突发。 基于默认 managed-csi-premium 存储类的持久卷声明动态创建的任何高级 SSD 也禁用了按需突发。

若要创建启用了 按需突发 的高级 SSD 永久性卷,可以通过以下 YAML 模板创建一个新的存储类,将 enableBursting 参数设置为 true。 有关启用按需突发的更多信息,请参阅 按需突发。 有关构建启用按需突发功能的自定义存储类的更多信息,请参阅 创建可突发的托管CSI高端存储类

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: burstable-managed-csi-premium
provisioner: disk.csi.azure.com
parameters:
  skuname: Premium_LRS
  enableBursting: "true"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true

清理资源

完成本文中创建的资源后,可以使用 kubectl delete 命令将其删除。

# Remove the pod
kubectl delete -f azure-pvc-disk.yaml

# Remove the persistent volume claim
kubectl delete -f azure-pvc.yaml

预配 Azure 文件 PV

Azure 文件存储支持 Azure 高级文件共享。 最小文件共享容量为 100 GiB。 建议使用 Azure 高级文件共享而不是标准文件共享,因为高级文件共享为 I/O 密集型工作负荷提供更高的性能、低延迟磁盘支持。 使用 Azure 文件共享时,可以在一个节点上装载的共享数量没有限制。 有关 Kubernetes 存储卷的更多信息,请参阅 AKS 中应用程序的存储选项

在 AKS 中使用存储 CSI 驱动程序时,还有两个内置 StorageClasses 使用 Azure 文件存储 CSI 存储驱动程序。 其他 CSI 存储类是使用群集连同树中默认的存储类一起创建的。

  • azurefile-csi:使用 Azure 标准存储创建 Azure 文件共享。

  • azurefile-csi-premium:使用 Azure 高级存储创建 Azure 文件共享。

针对这两个存储类的回收策略可确保在删除相应的 PV 时删除基础 Azure 文件共享。 由于存储类还会将文件共享配置为可扩展,因此只需编辑具有新大小的 PVC 即可。

注释

若要获得 Azure 文件存储的最佳体验,请遵循这些最佳做法。 配置装载选项的位置(mountOptions)取决于您是为动态持久卷还是静态持久卷进行预配置。

  • 如果要使用存储类动态预配卷,请在存储类对象(类型: StorageClass) 上指定装载选项。
  • 如果要静态预配卷,请在 PersistentVolume 对象上指定装载选项(类型: PersistentVolume)。
  • 如果要将文件共享装载为内联卷,请在 Pod 对象上指定装载选项(类型: Pod) 。

建议在运行基准测试时使用 FIO。 有关详细信息,请参阅 基准测试工具和测试

存储类用于定义如何创建 Azure 文件共享。 系统会在节点资源组中自动创建一个存储帐户,以便与存储类一起用来保存 Azure 文件共享。 为“skuName”选择以下 Azure 存储冗余 SKU 之一

  • Standard_LRS:标准本地冗余存储
  • Standard_GRS:标准异地冗余存储
  • Standard_RAGRS:标准只读访问地理冗余存储
  • Standard_RAGZRS:标准读取访问地理区域冗余存储
  • Premium_LRS:高级本地冗余存储

有关 Azure 文件的 Kubernetes 存储类的详细信息,请参阅 Kubernetes 存储类

  1. 创建名为 azure-file-sc.yaml 的文件,并将其复制到以下示例清单中。 有关 mountOptions 的详细信息,请参阅装载选项部分。

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: my-azurefile
    provisioner: file.csi.azure.com # replace with "kubernetes.io/azure-file" if aks version is less than 1.21
    allowVolumeExpansion: true
    mountOptions:
     - dir_mode=0777
     - file_mode=0777
     - uid=0
     - gid=0
     - mfsymlinks
     - cache=strict
     - actimeo=30
     - nobrl  # disable sending byte range lock requests to the server and for applications which have challenges with posix locks
    parameters:
      skuName: Premium_LRS
    
  2. 使用 kubectl apply 命令创建存储类。

    kubectl apply -f azure-file-sc.yaml
    

创建 PVC

PVC 使用存储类对象动态预配 Azure 文件共享。 可以使用以下 YAML 创建具有 ReadWriteMany 访问权限并且大小为 100 GB 的 PVC。 有关访问模式的详细信息,请参阅 Kubernetes 永久性卷

  1. 创建名为 azure-file-pvc.yaml 的文件,并将其复制到以下 YAML 中。 请确保 storageClassName 与前述步骤中创建的存储类匹配。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: my-azurefile
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: my-azurefile
      resources:
        requests:
          storage: 100Gi
    

    注释

    如果将 Premium_LRS SKU 用于存储类,则 storage 最小值必须为 100Gi

  2. 使用 kubectl apply 命令创建 PVC。

    kubectl apply -f azure-file-pvc.yaml
    

    完成此步骤后,文件共享即创建完毕。 同时还会创建一个包含连接信息和凭据的 Kubernetes 机密。 可以使用 kubectl get 命令查看 PVC 的状态:

    kubectl get pvc my-azurefile
    

    命令的输出类似于以下示例:

    NAME           STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
    my-azurefile   Bound     pvc-8436e62e-a0d9-11e5-8521-5a8664dc0477   100Gi       RWX           my-azurefile      5m
    

装载 PVC

以下 YAML 创建一个 Pod,该 Pod 使用 PVC my-azurefile/mnt/azure 路径挂载 Azure 文件共享。 对于 Windows Server 容器,请使用 Windows 路径约定指定mountPath,例如“D:”。

  1. 创建名为 azure-pvc-files.yaml 的文件,并将其复制到以下 YAML 中。 请确保 claimName 与前述步骤中创建的 PVC 匹配。

    kind: Pod
    apiVersion: v1
    metadata:
      name: mypod
    spec:
      containers:
        - name: mypod
          image: mcr.azk8s.cn/oss/nginx/nginx:1.15.5-alpine
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: 250m
              memory: 256Mi
          volumeMounts:
            - mountPath: /mnt/azure
              name: volume
              readOnly: false
      volumes:
       - name: volume
         persistentVolumeClaim:
           claimName: my-azurefile
    
  2. 使用 kubectl apply 命令创建 pod。

    kubectl apply -f azure-pvc-files.yaml
    

    现有一个正在运行的 Pod,其中的 Azure 文件共享已装载到 /mnt/azure 目录中。 使用 kubectl describe 命令检查 Pod 时,可以看到此配置。 以下精简示例输出显示容器中装载的卷。

    Containers:
      mypod:
        Container ID:   docker://053bc9c0df72232d755aa040bfba8b533fa696b123876108dec400e364d2523e
        Image:          mcr.azk8s.cn/oss/nginx/nginx:1.15.5-alpine
        Image ID:       docker-pullable://nginx@sha256:d85914d547a6c92faa39ce7058bd7529baacab7e0cd4255442b04577c4d1f424
        State:          Running
          Started:      Fri, 01 Mar 2019 23:56:16 +0000
        Ready:          True
        Mounts:
          /mnt/azure from volume (rw)
          /var/run/secrets/kubernetes.io/serviceaccount from default-token-8rv4z (ro)
    [...]
    Volumes:
      volume:
        Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
        ClaimName:  my-azurefile
        ReadOnly:   false
    [...]
    

装载选项

对于 Kubernetes 版本 1.13.0 及更高版本,fileModedirMode 的默认值为 0777。 使用存储类动态预配 PV 时,可以直接在存储类清单中定义装载选项。 有关详细信息,请参阅 装载选项。 以下示例演示如何将这些权限设置为 0777

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: my-azurefile
provisioner: file.csi.azure.com # replace with "kubernetes.io/azure-file" if aks version is less than 1.21
allowVolumeExpansion: true
mountOptions:
  - dir_mode=0777
  - file_mode=0777
  - uid=0
  - gid=0
  - mfsymlinks
  - cache=strict
  - actimeo=30
  - nobrl  # disable sending byte range lock requests to the server and for applications which have challenges with posix locks
parameters:
  skuName: Premium_LRS

动态卷的存储类别参数

下表包含可用于为 PVC 定义自定义存储类的参数。

Name Meaning 可用值 强制的 默认值
accountAccessTier 存储帐户的访问层 标准帐户可以选择 HotCool,高级帐户只能选择 Premium 空白。 对不同的存储帐户类型使用默认设置。
accountQuota 限制帐户的配额。 默认情况下,可以指定最大配额(102,400 GB)。 如果帐户超过指定的配额,驱动程序将跳过选择该帐户的步骤。 102400
允许Blob公共访问 允许或禁止公共访问驱动程序创建的存储帐户的所有 Blob 或容器。 truefalse false
删除保留策略禁用 指定是否禁用为驱动程序创建的存储帐户的 DeleteRetentionPolicy。 truefalse false
folderName 在 Azure 文件共享中指定文件夹名称。 Azure 文件共享中的现有文件夹名称。 如果文件共享中不存在文件夹名称,装载会失败。
获取最新账户 确定是否根据创建时间获取最新的帐户密钥。 默认情况下,此驱动程序将获取第一个密钥。 truefalse false
位置 指定 Azure 存储帐户的 Azure 区域。 例如,chinanorth3 如果为空,驱动程序将使用与当前 AKS 群集相同的位置名称。
matchTags 驱动程序尝试查找合适的存储帐户时匹配标记。 truefalse false
networkEndpointType 1 为驱动程序创建的存储帐户指定网络终结点类型。 如果指定 privateEndpoint,则会为存储帐户创建专用终结点。 对于其他情况,默认会创建服务终结点。 "",privateEndpoint ""
协议 指定文件共享协议。 smbnfs smb
requireInfraEncryption 指定服务是否使用平台托管密钥驱动程序创建的存储帐户的静态数据应用第二层加密。 truefalse false
resourceGroup 指定 Azure 磁盘的资源组。 现有资源组名称 如果为空,驱动程序将使用与当前 AKS 群集相同的资源组名称。
selectRandomMatchingAccount 确定是否随机选择匹配帐户。 默认情况下,驱动程序始终按字母顺序选择第一个匹配的帐户(注意:此驱动程序使用帐户搜索缓存,这会导致多个帐户之间的文件创建分布不均匀)。 truefalse false
服务器 指定 Azure 存储帐户服务器地址。 现有服务器地址,例如 accountname.privatelink.file.core.chinacloudapi.cn 如果为空,驱动程序使用默认的 accountname.file.core.chinacloudapi.cn 或其他主权云帐户地址。
shareAccessTier 文件共享的访问层 常规用途 v2 帐户可以在 TransactionOptimized(默认)、HotCool 之间进行选择。 仅适用于文件共享的高级存储帐户类型。 空白。 对不同的存储帐户类型使用默认设置。
共享名称 指定 Azure 文件共享名称。 现有或新的 Azure 文件共享名称。 如果为空,驱动程序将生成一个 Azure 文件共享名称。
shareNamePrefix 指定由驱动程序创建的 Azure 文件共享名称前缀。 共享名只能包含小写字母、数字、连字符,长度应少于 21 个字符。
skuName Azure 文件存储帐户类型(别名:storageAccountType Standard_LRS、、Standard_GRSStandard_RAGRSStandard_RAGZRSPremium_LRS Standard_LRS
高级帐户类型的最小文件共享大小为 100 GB。
NFS 文件共享仅支持高级帐户类型。
标准 V2 SKU 名称适用于 预配的 Azure 文件存储 v2 模型
存储帐户 指定 Azure 存储帐户名称。 storageAccountName - 否 如果未提供特定的存储帐户名称,驱动程序将查找与同一资源组中的帐户设置匹配的合适存储帐户。 如果找不到匹配的存储帐户,则会创建一个新帐户。 但是,如果指定了存储帐户名称,则存储帐户必须已经存在。
storageEndpointSuffix 指定 Azure 存储终结点后缀。 core.chinacloudapi.cncore.chinacloudapi.cn 如果为空,驱动程序将根据云环境使用默认存储终结点后缀。 例如,core.chinacloudapi.cn
tags 标记会在新的存储帐户中创建。 标记格式:“foo=aaa,bar=bbb” ""

1 如果存储帐户由驱动程序创建,则只需在存储类中指定 networkEndpointType: privateEndpoint 参数。 CSI 驱动程序将创建专用终结点和专用 DNS 区域(命名 privatelink.file.core.chinacloudapi.cn)以及帐户。 如果自带存储帐户,则需要为存储帐户 创建专用终结点 。 如果在网络隔离群集中使用 Azure 文件存储,则必须使用“networkEndpointType: privateEndpoint”创建自定义存储类。 可以按照此示例进行参考:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azurefile-csi
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
  skuName: Premium_LRS  # available values: Premium_LRS, Standard_LRS, Standard_GRS, Standard_RAGRS, Standard_RAGZRS
  networkEndpointType: privateEndpoint
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
  - dir_mode=0777  # modify this permission if you want to enhance the security
  - file_mode=0777
  - mfsymlinks
  - cache=strict  # https://linux.die.net/man/8/mount.cifs
  - nosharesock  # reduce probability of reconnect race
  - actimeo=30  # reduce latency for metadata-heavy workload
  - nobrl  # disable sending byte range lock requests to the server and for applications which have challenges with posix locks

PVS 的静态预配参数

下表包含可用于定义 PV 的参数。

Name Meaning 可用值 强制的 默认值
volumeAttributes.resourceGroup 指定 Azure 资源组名称。 myResourceGroup 如果为空,驱动程序将使用与当前群集相同的资源组名称。
卷属性.存储账户 指定现有的 Azure 存储帐户名称。 storageAccountName 是的
volumeAttributes.shareName 指定 Azure 文件共享名称。 fileShareName 是的
volumeAttributes.folderName 在 Azure 文件共享中指定文件夹名称。 folderName 如果文件共享中不存在文件夹名称,装载将失败。
volumeAttributes.protocol 指定文件共享协议。 smbnfs smb
volumeAttributes.server 指定 Azure 存储帐户服务器地址 现有服务器地址,例如 accountname.privatelink.file.core.chinacloudapi.cn 如果为空,驱动程序使用默认的 accountname.file.core.chinacloudapi.cn 或其他主权云帐户地址。

创建 PV 快照类

Azure 文件存储 CSI 驱动程序支持创建持久性卷和基础文件共享的快照

  1. 使用 kubectl apply 命令创建卷快照类

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/deploy/example/snapshot/volumesnapshotclass-azurefile.yaml
    

    命令的输出类似于以下示例:

    volumesnapshotclass.snapshot.storage.k8s.io/csi-azurefile-vsc created
    
  2. 从先前创建的 PVC 中创建 卷快照pvc-azurefile)。

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/deploy/example/snapshot/volumesnapshot-azurefile.yaml
    

    命令的输出类似于以下示例:

    volumesnapshot.snapshot.storage.k8s.io/azurefile-volume-snapshot created
    
  3. 通过运行以下命令验证快照是否已正确创建:

    kubectl describe volumesnapshot azurefile-volume-snapshot
    

    命令的输出类似于以下示例:

    Name:         azurefile-volume-snapshot
    Namespace:    default
    Labels:       <none>
    Annotations:  API Version:  snapshot.storage.k8s.io/v1beta1
    Kind:         VolumeSnapshot
    Metadata:
      Creation Timestamp:  2020-08-27T22:37:41Z
      Finalizers:
        snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection
        snapshot.storage.kubernetes.io/volumesnapshot-bound-protection
      Generation:        1
      Resource Version:  955091
      Self Link:         /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/azurefile-volume-snapshot
      UID:               c359a38f-35c1-4fb1-9da9-2c06d35ca0f4
    Spec:
      Source:
        Persistent Volume Claim Name:  pvc-azurefile
      Volume Snapshot Class Name:      csi-azurefile-vsc
    Status:
      Bound Volume Snapshot Content Name:  snapcontent-c359a38f-35c1-4fb1-9da9-2c06d35ca0f4
      Ready To Use:                        false
    Events:                                <none>
    

调整 Azure 文件 PV 的大小

可为 PVC 请求较大的卷。 编辑 PVC 对象,并指定较大的大小。 此项更改会触发为 PV 提供支持的基础卷的扩展。

注释

永远不会创建新的 PV 来满足声明, 而是会调整现有卷的大小。 目前不支持收缩永久性卷。

在 AKS 中,内置 azurefile-csi 存储类已经支持扩展,因此请使用前面创建的 PVC 和此存储类。 PVC 请求了 100 GiB 文件共享。 可通过运行以下命令来确认这一点:

kubectl exec -it nginx-azurefile -- df -h /mnt/azurefile

命令的输出类似于以下示例:

Filesystem                                                                                Size  Used Avail Use% Mounted on
//f149b5a219bd34caeb07de9.file.core.chinacloudapi.cn/pvc-5e5d9980-da38-492b-8581-17e3cad01770  100G  128K  100G   1% /mnt/azurefile
  1. 通过增大 spec.resources.requests.storage 字段值来扩展 PVC:

    kubectl patch pvc pvc-azurefile --type merge --patch '{"spec": {"resources": {"requests": {"storage": "200Gi"}}}}'
    

    命令的输出类似于以下示例:

    persistentvolumeclaim/pvc-azurefile patched
    
  2. 验证 Pod 中的 PVC 和文件系统是否都显示新的大小:

    kubectl get pvc pvc-azurefile
    NAME            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS    AGE
    pvc-azurefile   Bound    pvc-5e5d9980-da38-492b-8581-17e3cad01770   200Gi      RWX            azurefile-csi   64m
    
    kubectl exec -it nginx-azurefile -- df -h /mnt/azurefile
    Filesystem                                                                                Size  Used Avail Use% Mounted on
    //f149b5a219bd34caeb07de9.file.core.chinacloudapi.cn/pvc-5e5d9980-da38-492b-8581-17e3cad01770  200G  128K  200G   1% /mnt/azurefile
    

将 PV 与专用 Azure 文件存储配合使用(专用终结点)

如果 Azure 文件存储资源受专用终结点保护,则必须创建自己的存储类。 请确保将 DNS 设置配置为将专用终结点 IP 地址解析为连接字符串的 FQDN

自定义以下参数:

  • resourceGroup:部署存储帐户的资源组。

  • storageAccount:存储帐户名称。

  • server:存储帐户的专用终结点的 FQDN。

  1. 创建一个名为 private-azure-file-sc.yaml 的文件,然后将以下示例清单粘贴到该文件中。 替换 <resourceGroup><storageAccountName> 的值。 例如:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: private-azurefile-csi
    provisioner: file.csi.azure.com
    allowVolumeExpansion: true
    parameters:
      resourceGroup: <resourceGroup>
      storageAccount: <storageAccountName>
      server: <storageAccountName>.file.core.chinacloudapi.cn
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    mountOptions:
      - dir_mode=0777
      - file_mode=0777
      - uid=0
      - gid=0
      - mfsymlinks
      - cache=strict  # https://linux.die.net/man/8/mount.cifs
      - nosharesock  # reduce probability of reconnect race
      - actimeo=30  # reduce latency for metadata-heavy workload
    
  2. 使用 kubectl apply 命令创建存储类:

    kubectl apply -f private-azure-file-sc.yaml
    

    命令的输出类似于以下示例:

    storageclass.storage.k8s.io/private-azurefile-csi created
    
  3. 创建一个名为 private-pvc.yaml 的文件,然后将以下示例清单粘贴到该文件中:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: private-azurefile-pvc
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: private-azurefile-csi
      resources:
        requests:
          storage: 100Gi
    
  4. 使用 kubectl apply 命令创建 PVC:

    kubectl apply -f private-pvc.yaml
    

使用托管标识访问 Azure 文件存储(预览版)

Azure 文件现在支持使用托管身份认证进行 SMB 访问。 借助此功能,AKS 中运行的应用程序可以安全地访问 Azure 文件共享,而无需存储或管理存储帐户密钥或凭据。 托管标识提供简化且安全的身份验证机制,简化了访问管理并降低与凭据泄露相关的风险。 可以创建动态卷或静态卷。

注释

从 Linux 节点上的 AKS 版本 1.34 开始,在预览版中提供对 AKS 中的 Azure 文件的托管标识支持。

若要为动态预配的卷启用托管标识,请执行以下步骤:

  1. 使用 YAML 文件创建启用了托管标识的存储类,例如, azurefile-csi-managed-identity.yaml 包含以下示例内容。 设置 mountWithManagedIdentity: "true"parameters

     apiVersion: storage.k8s.io/v1
     kind: StorageClass
     metadata:
       name: azurefile-csi
     provisioner: file.csi.azure.com
     parameters:
       resourceGroup: EXISTING_RESOURCE_GROUP_NAME   # optional, node resource group by default if it's not provided
       storageAccount: EXISTING_STORAGE_ACCOUNT_NAME # optional, a new account will be created if it's not provided
       mountWithManagedIdentity: "true"
       # optional, clientID of the managed identity, kubelet identity would be used by default if it's not provided
       clientID: "xxxxx-xxxx-xxx-xxx-xxxxxxx"
     reclaimPolicy: Delete
     volumeBindingMode: Immediate
     allowVolumeExpansion: true
     mountOptions:
      - dir_mode=0777  # modify this permission if you want to enhance the security
      - file_mode=0777
      - uid=0
      - gid=0
      - mfsymlinks
      - cache=strict  # https://linux.die.net/man/8/mount.cifs
      - nosharesock  # reduce probability of reconnect race
      - actimeo=30  # reduce latency for metadata-heavy workload
      - nobrl  # disable sending byte range lock requests to the server
    
  2. 通过运行以下命令应用此存储类:

    kubectl apply -f azurefile-csi-managed-identity.yaml
    
  3. 使用引用此 PVC 的新存储类部署 StatefulSet 或工作负载,以确保卷使用托管标识身份验证进行预配。 在 PVC 清单中,设置 storageClassName: azurefile-csi-managed-identity。 例如:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: azurefile-managed-identity-pvc
    spec:
      accessModes:
       - ReadWriteMany
      storageClassName: azurefile-csi-managed-identity
      resources:
       requests:
        storage: 100Gi
    

了解 Azure 文件 NFS

Azure 文件支持 NFS v4.1 协议。 对 Azure 文件的 NFS 版本 4.1 支持,提供一个完全托管的 NFS 系统,即基于一个高度可用、高度持久的分布式可复原存储平台构建的服务。

此选项已针对包含就地数据更新的随机访问工作负载进行优化,提供全面的 POSIX 文件系统支持。 本部分将介绍如何在 AKS 群集上通过 Azure 文件存储 CSI 驱动程序使用 NFS 共享。

注释

可以使用专用终结点,而不必允许访问所选 VNet。

本部分介绍如何在将 Azure 文件 NFS 4.1 与 AKS 配合使用时最大程度地提高性能和安全性。 学习如何做到:

  • 优化 NFS 读取和写入大小设置

  • 创建和配置 NFS 存储类

  • 部署使用 NFS 支持的卷的工作负荷

  • 启用传输中的加密(EiT),以便在 AKS 群集和 Azure 文件之间移动时保护数据。

本部分介绍如何使用 Azure 文件 CSI 驱动程序和 NFS 的 rsize (读取大小)及 wsize (写入大小)选项进行性能优化。 rsizewsize选项设置NFS操作的最大传输大小。 如果rsizewsize在装载时未指定,则客户端和服务器将协商两者所支持的最大大小。 目前,Azure 文件和新式 Linux 分发版都支持大小为 1,048,576 字节(1 MiB)的读取和写入大小。

最佳性能基于高效的客户端-服务器通信。 增加或减少 装载 读取和写入选项大小值可以提高 NFS 性能。 对于客户端和服务器之间传输的读/写数据包,针对 NFS 版本 2 的默认大小为 8 KB,针对 NFS 版本 3 和 4 的默认大小为 32 KB。 这些默认值可能太大或太小。 通过减少rsizewsize,并为每个 NFS 读取回复和写入请求发送较小的数据包,可以在拥堵的网络中提高 NFS 性能。 但是,这种减少可以增加跨网络发送数据的数据包数,增加客户端和服务器上的网络流量和 CPU 使用率。

请务必执行测试以查找能够维持高效数据包传输的rsizewsize,确保它们不会降低吞吐量或增加延迟。

例如,若要配置最大值 rsizewsize 256-KiB,请在存储类中配置 mountOptions 如下:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azurefile-csi-nfs
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
  protocol: nfs
mountOptions:
  - nconnect=4
  - noresvport
  - actimeo=30
  - rsize=262144
  - wsize=262144

其他存储类示例

建议的 SMB 共享装载选项在以下存储类示例中提供:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azurefile-csi
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
  skuName: Premium_LRS  # available values: Premium_LRS, Standard_LRS, Standard_GRS, Standard_RAGRS, Standard_RAGZRS
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
  - dir_mode=0777  # modify this permission if you want to enhance the security
  - file_mode=0777 # modify this permission if you want to enhance the security
  - mfsymlinks    # support symbolic links
  - cache=strict  # https://linux.die.net/man/8/mount.cifs
  - nosharesock  # reduces probability of reconnect race
  - actimeo=30  # reduces latency for metadata-heavy workload
  - nobrl  # disable sending byte range lock requests to the server and for applications which have challenges with posix locks

如果使用高级(SSD)文件共享和工作负荷是元数据密集型的,请注册以使用 元数据缓存 功能来提高性能。

有关详细信息,请参阅 提高 SMB Azure 文件共享的性能

Windows 容器

Azure 文件存储 CSI 驱动程序还支持 Windows 节点和容器。 若要使用 Windows 容器,请遵循 Windows 容器快速入门教程添加 Windows 节点池。

  1. 添加 Windows 节点池后,使用内置的存储类(如 azurefile-csi)或创建自定义存储类。 可以通过运行 kubectl apply 命令部署data.txt 示例,该示例将时间戳保存到文件 中:

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/deploy/example/windows/statefulset.yaml
    

    命令的输出类似于以下示例:

    statefulset.apps/busybox-azurefile created
    
  2. 通过运行以下 kubectl exec 命令验证卷的内容:

    kubectl exec -it busybox-azurefile-0 -- cat c:\\mnt\\azurefile\\data.txt # on Linux or MacOS Bash
    kubectl exec -it busybox-azurefile-0 -- cat c:\mnt\azurefile\data.txt # on Windows Powershell or CMD
    

    命令的输出类似于以下示例:

    2020-08-27 22:11:01Z
    2020-08-27 22:11:02Z
    2020-08-27 22:11:04Z
    (...)
    

后续步骤