Compartilhar via

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

Azure Blob 存储容器存储接口(CSI)驱动程序是CSI 规范兼容的驱动程序,用于管理 Azure Kubernetes Service(AKS)中 Azure Blob 存储的生命周期。 CSI 是一种标准,用于向 Kubernetes 上的容器化工作负载公开任意块存储和文件存储系统。

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

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

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

应用程序使用 BlobFuse 或网络文件系统 (NFS) 3.0 协议访问存储在 Azure Blob 存储中的数据。 在引入 Azure Blob storage 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)驱动程序是与CSI 规范兼容的驱动程序,由 Azure Kubernetes Service(AKS)用于管理 Azure 磁盘生命周期。

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

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

注释

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

Azure Files 容器存储接口(CSI)驱动程序是符合CSI 规范的驱动程序,用于由Azure Kubernetes Service(AKS)管理 Azure 文件共享的生命周期。 CSI 是为 Kubernetes 上的容器化工作负载公开任意块和文件存储系统的标准。

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

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

注释

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

Azure CSI 驱动程序功能

Azure Blob storage 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。 如果需要安装或升级,请参阅 Install Azure CLI。 如果安装了 Azure CLI aks-preview 扩展,请确保通过调用 az extension update --name aks-preview 将扩展更新到最新版本。

  • 如果您以前安装了CSI Blob Storage开源驱动程序来访问Azure Blob存储,请执行以下步骤来清理开源驱动程序

  • AKS 群集的控制平面标识(您的 AKS 群集名称)被添加到 VNet 和网络安全组上的贡献者角色中。

  • 若要在使用 BlobFuse 装载时支持 Azure Data Lake Storage Gen2 帐户(ADLS),请执行以下步骤:

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

注释

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

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

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

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

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

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

    kubectl get CSINode <nodename> -o yaml
    

    如果每个节点的卷限制是工作负载的问题,请考虑使用 Azure 容器存储来代替 CSI 驱动程序来管理持久卷。

常规要求:

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

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

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

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

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

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

  • AKS 群集Control plane 标识(你的 AKS 群集名称)已添加到 VNet 上的 Contributor 角色和 NetworkSecurityGroup

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

托管标识要求:

  • 确保向 user 分配的 Kubelet 标识授予 storage 帐户上的 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,可以在配置永久性卷以供群集中的 Pod 使用之前,在新的或现有的 AKS 群集上启用 Blob storage CSI 驱动程序。

  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。

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

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

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

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

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

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

本部分为希望配置一个或多个持久卷的集群管理员提供指导,其中包括可供工作负载使用的Blob storage的详细信息。 永久性卷声明(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

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

注释

修改 AKS 群集中节点资源组下的任何资源是不支持的操作,将导致群集操作失败。 有关详细信息,请参阅为什么使用 AKS 创建两个资源组?

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

在 AKS 上使用 CSI 驱动程序时,还有两个内置组件使用 Azure Blob CSI 驱动程序。

这两种存储类的回收策略可确保当删除相应的持久卷时删除底层的 Azure Blob 存储。 默认情况下,storage类还会将容器配置为可扩展,因为 set allowVolumeExpansion 参数设置为 true

注释

不支持收缩永久性卷。

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

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

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

PVC 使用存储类对象动态预配 Azure Blob storage 容器。 以下 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 storage。

  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 自定义存储类

默认Storage类适合最常见的场景,但并非全部。 在某些情况下,你可能想要使用自己的参数自定义自己的storage类。 在本部分中,我们将提供两个示例,其中第一个示例使用 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 命令创建 storage 类:

    kubectl apply -f blob-nfs-sc.yaml
    

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

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

装载 NFS 或 BlobFuse PV

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

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

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

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

    注释

    YAML 中的 volumeHandle 值应该是群集中每个相同storage 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 storage CSI 驱动程序不使用此值,因为可以灵活写入数据,直到达到storage帐户的容量限制。 特性的值 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 storage:

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

    命令的输出如下例所示:

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

创建 StatefulSet

若要确保工作负载在 Pod 重启或更换过程中保留其存储卷,请使用 StatefulSet。 StatefulSets 简化了将持久性存储与 Pod 相关联的过程,以便为替换失败的 Pod 而创建的新 Pod 可以自动访问相同的存储卷。 以下示例演示如何使用 BlobFuse,或 NFS 协议为 Blob storage 设置 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 storage帐户类型(别名:storageAccountType)。 Standard_LRSPremium_LRSStandard_GRSStandard_RAGRS Standard_LRS
位置 指定Azure位置。 chinanorth3 如果为空,驱动程序使用与当前群集相同的位置名称。
resourceGroup 指定Azure资源组名称。 myResourceGroup 如果为空,驱动程序将使用与当前群集相同的资源组名称。
存储帐户 指定Azure storage帐户名称。 storageAccountName 如果未提供特定的storage帐户名称,驱动程序将查找与同一资源组中的帐户设置匹配的合适storage帐户。 如果找不到匹配的存储帐户,则会创建一个新的帐户。 但是,如果指定了存储帐户名,则存储帐户必须已存在。
networkEndpointType 1 为由驱动创建的存储帐户指定网络终结点类型。 如果指定 privateEndpoint,则会为存储帐户创建私有终结点。 对于其他情况,将为 NFS 协议创建服务终结点。 privateEndpoint 对于 AKS 群集,请将 AKS 群集名称添加到托管 VNet 的资源组的“参与者”角色中。
协议 指定 BlobFuse 装载或 NFSv3 装载。 fusenfs fuse
containerName 指定现有容器(目录)名称。 容器 如果为空,驱动程序将创建一个新的容器名称,从 pvc-fuse BlobFuse 或 pvc-nfs NFS v3 开始。
containerNamePrefix 指定驱动程序创建的Azure storage目录前缀。 只能包含小写字母、数字、连字符和长度应少于 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 如果驱动程序创建了storage帐户,则只需在 storage 类中指定 networkEndpointType: privateEndpoint 参数。 CSI 驱动程序将创建专用终结点和private DNS区域(命名为 privatelink.blob.core.chinacloudapi.cn),以及帐户。 如果自行提供存储帐户,则需要为存储帐户创建专用终结点。 如果在网络隔离群集中使用Azure Blob storage,则必须使用 networkEndpointType: privateEndpoint 创建自定义storage类。

静态 PV 预配参数

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

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

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

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

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

在 AKS 上使用 Azure 磁盘 CSI 驱动程序时,还有另外两个内置的使用 Azure 磁盘 CSI 存储驱动程序的 StorageClasses。 其他 CSI 存储类与群集以及内置默认存储类一起创建。

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

  • managed-csi-premium:使用 Azure Premium LRS 预配托管磁盘。 从 Kubernetes 版本 1.29 开始,对于跨多个可用区 (availability zones) 的 AKS 群集,此存储类 (storage class) 会自动使用 Azure Premium ZRS 来创建托管磁盘 (managed disks)。

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

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

  • 然而,值得注意的是,与本地冗余存储(LRS)相比,区域冗余存储(ZRS)的成本更高。 如果成本优化是首要任务,则可以使用 LRS SKU 名称参数创建新的存储类,并在持久性卷声明中使用它。

由于存在数据丢失风险,不支持缩小 PVC 的大小。 可以使用 kubectl edit sc 命令编辑现有storage类,也可以创建自己的自定义storage类。 例如,如果要使用大小为 4 TiB 的磁盘,则必须创建一个storage类,该类定义 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 命令查看预创建的storage类。 以下示例演示 AKS 群集中可用的预创建storage类:

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
    

    小窍门

    若要创建使用 premium storage 的磁盘,请使用 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 的永久性卷声明将 Azure 磁盘装载到路径 /mnt/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 定义自定义storage类的参数。

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 ""
写入加速器启用 [Azure 磁盘上的写入加速器][azure-disk-write-accelerator] truefalse ""
网络访问策略 (networkAccessPolicy) NetworkAccessPolicy 属性,用于防止生成磁盘或快照的 SAS URI AllowAllDenyAllAllowPrivate AllowAll
diskAccessID 用于在磁盘上使用专用终结点的 Azure DiskAccess 资源的资源 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磁盘自定义存储类

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

可以使用一个 volumeBindingMode: Immediate 类,该类保证在创建持久性卷声明(PVC)后能立即使用。 当节点池受到拓扑约束时(例如使用 availability zones),PVs 在不知道 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 命令创建 volume 快照类

    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. 使用在上一步中创建的快照,并创建一个 new PVCnew 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. 创建一个先前创建的克隆卷并创建一个新 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 中,内置 存储类已支持扩展,因此请使用前面创建的 。 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. 通过运行以下命令增加 spec.resources.requests.storage 字段来扩展 PVC:

    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。 您可以通过运行以下 kubectl apply 命令来部署示例 基于 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 storage class 已禁用按需突发功能,并使用基于信用的突发模式。 基于默认 managed-csi-premium 存储类的持久卷声明动态创建的任何高级 SSD 也禁用了按需突发。

若要创建支持按需突发的优质 SSD 永久性卷,您可以使用以下 YAML 模板,其中存储类设置的参数 enableBursting 的值为 true。 有关启用按需突发的更多信息,请参阅 按需突发。 有关构建支持按需突发的自定义存储类的详细信息,请参阅 创建可突发托管 CSI Premium 存储类

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 Files PV

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

在 AKS 上使用 storage CSI 驱动程序时,还有两个使用 Azure Files CSI storage 驱动程序的内置 StorageClasses。 其他 CSI 存储类与群集以及内置默认存储类一起创建。

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

  • azurefile-csi-premium:使用Azure Premium Storage创建Azure文件共享。

这两个存储类的回收策略可确保在删除相应的 PV 时,会删除其背后的 Azure 文件共享。 由于存储类还会将文件共享配置为可扩展的功能,因此只需根据新大小编辑 PVC

注释

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

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

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

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

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

有关 Azure Files Kubernetes storage 类的详细信息,请参阅 Kubernetes Storage 类

  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 命令创建storage类。

    kubectl apply -f azure-file-sc.yaml
    

创建 PVC

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

  1. 创建名为 azure-file-pvc.yaml 的文件,并在以下 YAML 中复制。 确保 storageClassName与在上一步中创建的storage类匹配。

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

    注释

    如果使用 storage 类的 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 Files 文件共享。 对于 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
    

    现在,您的 Azure Files 文件共享已挂载到 /mnt/azure 目录中并运行 Pod。 使用 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 storage帐户服务器地址。 现有服务器地址,例如 accountname.privatelink.file.core.chinacloudapi.cn 如果为空,驱动程序使用默认的 accountname.file.core.chinacloudapi.cn 或其他主权云帐户地址。
shareAccessTier 文件共享的访问层级 General purpose v2 帐户可以在 TransactionOptimized (默认值)、HotCool 之间进行选择。 仅用于文件共享的 Premium 存储帐户类型。 空白。 为不同的存储账号类型使用默认设置。
共享名称 指定Azure文件共享名称。 现有或新的Azure文件共享名称。 如果为空,驱动程序将生成Azure文件共享名称。
shareNamePrefix 指定Azure驱动程序创建的文件共享名称前缀。 共享名只能包含小写字母、数字、连字符,长度应少于 21 个字符。
skuName Azure Files 存储帐户类型(别名:storageAccountType Standard_LRS、、Standard_GRSStandard_RAGRSStandard_RAGZRSPremium_LRS Standard_LRS
高级帐户类型的最小文件共享大小为 100 GB。
NFS 文件共享仅支持高级帐户类型。
标准 V2 SKU 名称适用于Azure Files预配的 v2 模型
存储帐户 指定Azure storage帐户名称。 storageAccountName - 否 如果未提供特定的storage帐户名称,驱动程序将查找与同一资源组中的帐户设置匹配的合适storage帐户。 如果找不到匹配的存储帐户,则会创建一个新帐户。 但是,如果指定了存储帐户名,则存储帐户必须已存在。
storageEndpointSuffix 指定 Azure 存储终结点后缀。 core.chinacloudapi.cncore.chinacloudapi.cn 如果为空,驱动程序会根据云环境使用默认的存储终结点后缀。 例如,core.chinacloudapi.cn
tags 标签是在新的存储帐户中创建的。 标记格式:“foo=aaa,bar=bbb” ""

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

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 storage帐户名称。 storageAccountName 是的
volumeAttributes.shareName 指定Azure文件共享名称。 fileShareName 是的
volumeAttributes.folderName 在Azure文件共享中指定文件夹名称。 folderName 如果文件共享中不存在文件夹名称,装载将失败。
volumeAttributes.protocol 指定文件共享协议。 smbnfs smb
volumeAttributes.server 指定Azure storage帐户服务器地址 现有服务器地址,例如 accountname.privatelink.file.core.chinacloudapi.cn 如果为空,驱动程序使用默认的 accountname.file.core.chinacloudapi.cn 或其他主权云帐户地址。

创建 PV 快照类

Azure Files 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 Files 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 Files storage(专用终结点)配合使用

如果“Azure Files”资源受到专用终结点的保护,则必须创建自己的存储类。 请确保配置 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 命令创建storage类:

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

注释

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

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

  1. 使用 YAML 文件创建启用了托管标识的 storage 类,例如,使用以下示例内容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 Files NFS

Azure Files支持 NFS v4.1 协议。 Azure Files 的 NFS 版本 4.1 支持为您提供了一个完全托管的 NFS 系统即服务,该系统构建于一个高可用、高持久、分布式弹性存储平台。

此选项针对具有就地数据更新的随机访问工作负载进行了优化,并提供完整的 POSIX 文件系统支持。 本部分介绍如何在 AKS 群集上使用 Azure 文件 CSI 驱动程序的 NFS 共享。

注释

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

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

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

  • 创建和配置 NFS storage 类

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

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

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

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

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

例如,若要将最大 rsizewsize 配置为 256-KiB,请在 storage 类中配置 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)文件共享且工作负荷很重,请注册以使用 metadata 缓存功能来提高性能。

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

Windows 容器

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

  1. 拥有 Windows 节点池后,请使用内置的存储类(如 azurefile-csi)或创建自定义存储类。 可以通过运行 `kubectl apply` 命令部署一个示例 `基于 Windows 的有状态集`,以便将时间戳保存到文件 `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
    (...)
    

后续步骤