你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
永久性卷表示已经过预配可以用于 Kubernetes Pod 的存储块。 永久性卷可供一个或多个 Pod 使用,并可进行动态或静态预配。 如果多个 Pod 需要对同一存储卷进行并发访问,则可以使用 Azure 文件存储使用 服务器消息块 (SMB) 协议进行连接。 本文介绍如何动态创建 Azure 文件共享以供 Azure Kubernetes 服务 (AKS) 群集中的多个 Pod 使用。
本文介绍如何:
- 通过安装容器存储接口 (CSI) 驱动程序并动态创建一个或多个要附加到 Pod 的 Azure 文件存储共享来使用动态永久性卷 (PV)。
- 通过创建一个或多个 Azure 文件存储共享来使用静态 PV,或者使用现有 Azure 文件存储共享并将其附加到 Pod。
有关 Kubernetes 存储卷的更多信息,请参阅 AKS 中应用程序的存储选项。
开始之前
- 需要一个 Azure 存储帐户。
- 确保已安装且已配置 Azure CLI 版本 2.0.59。 运行
az --version即可查找版本。 如果需要安装或升级,请参阅 安装 Azure CLI。 - 在标准文件共享和高级文件共享之间进行选择时,请务必了解预配模型以及计划针对 Azure 文件存储运行的预期使用模式的要求。 有关详细信息,请参阅 基于使用模式选择 Azure 文件存储性能层。
动态预配卷
本部分为想要预配一个或多个永久性卷的群集管理员提供指导,这些卷中包含 Azure 文件存储上的一个或多个共享的详细信息。 永久性卷声明 (PVC) 使用存储类对象来动态预配 Azure 文件存储文件共享。
动态 PersistentVolume 的存储类参数
下表包含可用于为 PersistentVolumeClaim 定义自定义存储类的参数。
| Name | Meaning | 可用值 | Mandatory | 默认值 |
|---|---|---|---|---|
| accountAccessTier | 存储帐户的访问层 | 标准帐户可以选择 Hot 或 Cool,高级帐户只能选择 Premium。 |
No | Empty. 对不同的存储帐户类型使用默认设置。 |
| accountQuota | 限制帐户的配额。 可以 GB 为单位指定最大配额(默认值为 102400GB)。 如果帐户超过指定的配额,驱动程序将跳过选择该帐户的步骤。 | No | 102400 |
|
| allowBlobPublicAccess | 允许或禁止公共访问驱动程序创建的存储帐户的所有 Blob 或容器。 |
true 或 false |
No | false |
| disableDeleteRetentionPolicy | 指定是否禁用为驱动程序创建的存储帐户的 DeleteRetentionPolicy。 |
true 或 false |
No | false |
| folderName | 在 Azure 文件共享中指定文件夹名称。 | Azure 文件共享中的现有文件夹名称。 | No | 如果文件共享中不存在文件夹名称,装载会失败。 |
| getLatestAccount | 确定是否根据创建时间获取最新的帐户密钥。 默认情况下,此驱动程序将获取第一个密钥。 |
true 或 false |
No | false |
| 位置 | 指定 Azure 存储帐户的 Azure 区域。 | 例如,eastus。 |
No | 如果为空,驱动程序将使用与当前 AKS 群集相同的位置名称。 |
| matchTags | 驱动程序尝试查找合适的存储帐户时匹配标记。 |
true 或 false |
No | false |
| networkEndpointType | 为驱动程序创建的存储帐户指定网络终结点类型。 如果指定 privateEndpoint,则会为存储帐户创建专用终结点。 对于其他情况,默认会创建服务终结点。 |
"",privateEndpoint |
No | "" |
| 协议 | 指定文件共享协议。 |
smb、nfs |
No | smb |
| requireInfraEncryption | 指定服务是否使用平台托管密钥驱动程序创建的存储帐户的静态数据应用第二层加密。 |
true 或 false |
No | false |
| resourceGroup | 指定 Azure 磁盘的资源组。 | 现有资源组名称 | No | 如果为空,驱动程序将使用与当前 AKS 群集相同的资源组名称。 |
| selectRandomMatchingAccount | 确定是否随机选择匹配帐户。 默认情况下,驱动程序始终按字母顺序选择第一个匹配的帐户(注意:此驱动程序使用帐户搜索缓存,这会导致多个帐户之间的文件创建分布不均匀)。 |
true 或 false |
No | false |
| 服务器 | 指定 Azure 存储帐户服务器地址。 | 现有服务器地址,例如 accountname.privatelink.file.core.windows.net。 |
No | 如果为空,驱动程序使用默认的 accountname.file.core.windows.net 或其他主权云帐户地址。 |
| shareAccessTier | 文件共享的访问层 | 常规用途 v2 帐户可以在 TransactionOptimized(默认)、Hot 和 Cool 之间进行选择。 仅适用于文件共享的高级存储帐户类型。 |
No | Empty. 对不同的存储帐户类型使用默认设置。 |
| shareName | 指定 Azure 文件共享名称。 | 现有或新的 Azure 文件共享名称。 | No | 如果为空,驱动程序将生成一个 Azure 文件共享名称。 |
| shareNamePrefix | 指定由驱动程序创建的 Azure 文件共享名称前缀。 | 共享名只能包含小写字母、数字、连字符,长度应少于 21 个字符。 | No | |
| skuName | Azure 文件存储存储帐户类型(别名:storageAccountType) |
Standard_LRS、、Standard_ZRS、Standard_GRSStandard_RAGRS、、Standard_RAGZRSPremium_LRS、Premium_ZRS、StandardV2_LRSStandardV2_ZRSStandardV2_GRS、StandardV2_GZRS、、 PremiumV2_LRSPremiumV2_ZRS |
No | Standard_LRS高级帐户类型的最小文件共享大小为 100 GB。 ZRS 帐户类型在有限区域内受支持。 NFS 文件共享仅支持高级帐户类型。 标准 V2 SKU 名称适用于 预配的 Azure 文件存储 v2 模型。 |
| storageAccount | 指定 Azure 存储帐户名称。 | storageAccountName | -不 | 如果未提供特定的存储帐户名称,驱动程序将查找与同一资源组中的帐户设置匹配的合适存储帐户。 如果驱动程序找不到匹配的存储帐户,则将创建新的存储帐户。 但是,如果指定了存储帐户名称,则存储帐户必须已经存在。 |
| storageEndpointSuffix | 指定 Azure 存储终结点后缀。 |
core.windows.net、core.chinacloudapi.cn 等 |
No | 如果为空,驱动程序将根据云环境使用默认存储终结点后缀。 例如,core.windows.net。 |
| tags | 标记 是在新的存储帐户中创建的。 | 标记格式:“foo=aaa,bar=bbb” | No | "" |
| --- | 以下参数仅适用于 SMB 协议 | --- | --- | |
| subscriptionID | 指定在其中创建 Azure 文件共享的 Azure 订阅 ID。 | Azure 订阅 ID | No | 如果不为空,则必须提供 resourceGroup。 |
| storeAccountKey | 指定是否将存储帐户密钥存储为 Kubernetes 机密。 |
true 或 falsefalse 表示驱动程序使用 kubelet 标识获取帐户密钥。 |
No | true |
| secretName | 指定用于存储帐户密钥的机密名称。 | No | ||
| secretNamespace | 指定用于存储帐户密钥的机密的命名空间。 Note: 如果未指定 secretNamespace,则会在 Pod 所在的同一命名空间中创建机密。 |
default、kube-system 等。 |
No | PVC 命名空间,例如 csi.storage.k8s.io/pvc/namespace |
| useDataPlaneAPI | 指定是否对文件共享使用 数据平面 API 创建/删除/调整大小,这可以解决 SRP API 限制问题,因为数据平面 API 几乎没有限制,而当存储帐户上存在防火墙或 Vnet 设置时,它将会失败。 |
true 或 false |
No | false |
| --- | 以下参数仅适用于 NFS 协议 | --- | --- | |
| mountPermissions | 装载的文件夹权限。 默认为 0777。 如果设置为 0,则驱动程序在装载后不会执行 chmod。 |
0777 |
No | |
| rootSquashType | 指定共享上的根压缩行为。 默认值为 NoRootSquash |
AllSquash、NoRootSquash、RootSquash |
No | |
| --- | 以下参数仅适用于 VNet 设置。 例如,NFS、专用终结点 | --- | --- | |
| fsGroupChangePolicy | 指示驱动程序如何更改卷的所有权。 Pod securityContext.fsGroupChangePolicy 将被忽略。 |
OnRootMismatch(默认)、Always、None |
No | OnRootMismatch |
| subnetName | 子网名称 | 代理节点的现有子网名称。 | No | 如果为空,驱动程序将使用 Azure 云配置文件中的 subnetName 值。 |
| vnetName | 虚拟网络名称 | 现有虚拟网络名称。 | No | 如果为空,驱动程序将更新群集虚拟网络下的所有子网。 |
| vnetResourceGroup | 指定在其中定义虚拟网络的 VNet 资源组。 | 现有资源组名称。 | No | 如果为空,驱动程序将使用 Azure 云配置文件中的 vnetResourceGroup 值。 |
1 如果存储帐户由驱动程序创建,则只需在存储类中指定 networkEndpointType: privateEndpoint 参数。 CSI 驱动程序将创建专用终结点和专用 DNS 区域(命名 privatelink.file.core.windows.net)以及帐户。 如果自带存储帐户,则需要为存储帐户 创建专用终结点 。 如果在网络隔离群集中使用 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, Premium_ZRS, Standard_LRS, Standard_GRS, Standard_ZRS, 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
创建存储类
存储类定义如何创建 Azure 文件共享。 在 节点资源组 中会自动创建一个存储帐户,以便与存储类配合使用,存储 Azure 文件共享。 为 选择以下 skuName:
-
Standard_LRS:标准本地冗余存储 (LRS) -
Standard_GRS:标准异地冗余存储 (GRS) -
Standard_ZRS:标准区域冗余存储 (ZRS) -
Standard_RAGRS:标准读取访问异地冗余存储 (RA-GRS) -
Premium_LRS:高级本地冗余存储 (LRS) -
Premium_ZRS:高级区域冗余存储 (ZRS)
Note
最小的高级文件共享为 100 GB。
有关 Azure 文件的 Kubernetes 存储类的详细信息,请参阅 Kubernetes 存储类。
创建名为
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使用
kubectl apply命令创建存储类。kubectl apply -f azure-file-sc.yaml
创建永久性卷声明
永久性卷声明 (PVC) 使用存储类对象来动态预配 Azure 文件共享。 可以使用以下 YAML 创建具有 ReadWriteMany 访问权限的永久性卷声明 100 GB 大小。 有关访问模式的详细信息,请参阅 Kubernetes 永久性卷。
创建名为
azure-file-pvc.yaml的文件,并将其复制到以下 YAML 中。 请确保storageClassName与前述步骤中创建的存储类匹配。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-azurefile spec: accessModes: - ReadWriteMany storageClassName: my-azurefile resources: requests: storage: 100GiNote
如果将
Premium_LRSSKU 用于存储类,则storage最小值必须为100Gi。使用
kubectl apply命令创建永久性卷声明。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
使用永久性卷
以下 YAML 创建一个 Pod,该 Pod 使用永久性卷声明 my-azurefile 在 /mnt/azure 路径中装载 Azure 文件存储文件共享。 对于 Windows Server 容器,请指定使用 mountPath Windows 路径约定,例如“D:”。
创建名为
azure-pvc-files.yaml的文件,并将其复制到以下 YAML 中。 请确保claimName与前述步骤中创建的 PVC 匹配。kind: Pod apiVersion: v1 metadata: name: mypod spec: containers: - name: mypod image: mcr.microsoft.com/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使用
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.microsoft.com/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 及更高版本的默认值 fileMode 为 dirMode0777 。 如果使用存储类动态创建永久性卷,可以在存储类对象上指定装载选项。 有关详细信息,请参阅 装载选项。 以下示例设置 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
Note
配置装载选项 (mountOptions) 的位置取决于是预配动态永久性卷还是静态永久性卷。 如果要使用存储类 动态预配卷 ,请在存储类对象(类型:StorageClass)上指定装载选项。 如果要 静态预配卷,请在 PersistentVolume 对象上指定装载选项(类型:PersistentVolume)。 如果要 将文件共享装载为内联卷,请在 Pod 对象上指定装载选项(类型:Pod)。
使用 Azure 标记
有关使用 Azure 标记的详细信息,请参阅 在 Azure Kubernetes 服务(AKS)中使用 Azure 标记。
静态预配卷
本部分为想要创建一个或多个永久性卷的群集管理员提供指导,其中包含供工作负载使用的现有 Azure 文件存储共享的详细信息。
PersistentVolume 的静态预配参数
下表包含可用于定义 PersistentVolume 的参数。
| Name | Meaning | 可用值 | Mandatory | 默认值 |
|---|---|---|---|---|
| volumeAttributes.resourceGroup | 指定 Azure 资源组名称。 | myResourceGroup | No | 如果为空,驱动程序将使用与当前群集相同的资源组名称。 |
| volumeAttributes.storageAccount | 指定现有的 Azure 存储帐户名称。 | storageAccountName | Yes | |
| volumeAttributes.shareName | 指定 Azure 文件共享名称。 | fileShareName | Yes | |
| volumeAttributes.folderName | 在 Azure 文件共享中指定文件夹名称。 | folderName | No | 如果文件共享中不存在文件夹名称,装载将失败。 |
| volumeAttributes.protocol | 指定文件共享协议。 |
smb、nfs |
No | smb |
| volumeAttributes.server | 指定 Azure 存储帐户服务器地址 | 现有服务器地址,例如 accountname.privatelink.file.core.windows.net。 |
No | 如果为空,驱动程序使用默认的 accountname.file.core.windows.net 或其他主权云帐户地址。 |
| --- | 以下参数仅适用于 SMB 协议 | --- | --- | --- |
| volumeAttributes.secretName | 指定用于存储帐户名称和密钥的机密名称。 | No | ||
| volumeAttributes.secretNamespace | 指定机密命名空间。 |
default、kube-system 等。 |
No | PVC 命名空间 (csi.storage.k8s.io/pvc/namespace) |
| nodeStageSecretRef.name | 指定用于存储帐户名称和密钥的机密名称。 | 现有机密名称。 | No | 如果为空,驱动程序则使用 kubelet 标识获取帐户密钥。 |
| nodeStageSecretRef.namespace | 指定机密命名空间。 | Kubernetes 命名空间 | No | |
| --- | 以下参数仅适用于 NFS 协议 | --- | --- | --- |
| volumeAttributes.fsGroupChangePolicy | 指示驱动程序如何更改卷的所有权。 Pod securityContext.fsGroupChangePolicy 将被忽略。 |
OnRootMismatch(默认)、Always、None |
No | OnRootMismatch |
| volumeAttributes.mountPermissions | 指定装载的文件夹权限。 默认值为 0777 |
No |
创建 Azure 文件共享
必须先创建 Azure 存储帐户和文件共享,然后才能将 Azure 文件存储共享用作 Kubernetes 卷。
使用具有
az aks show参数的--query nodeResourceGroup命令获取资源组名称。az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv该命令的输出类似于以下示例:
MC_myResourceGroup_myAKSCluster_eastus使用具有
az storage account create参数的--sku命令创建存储帐户。 以下命令使用Standard_LRSSKU 创建存储帐户。 请务必替换以下占位符:-
将
myAKSStorageAccount替换为存储帐户的名称 -
将
nodeResourceGroupName替换为托管 AKS 群集节点的资源组的名称 -
将
location替换为要在其中创建资源的区域的名称。 它应与 AKS 群集节点为同一区域。
az storage account create -n myAKSStorageAccount -g nodeResourceGroupName -l location --sku Standard_LRS-
将
使用以下命令将连接字符串导出为环境变量(用于创建文件共享)。
export AZURE_STORAGE_CONNECTION_STRING=$(az storage account show-connection-string -n storageAccountName -g resourceGroupName -o tsv)必须使用 Azure Key Vault 中的密钥轮换或存储来保护连接字符串。 有关连接字符串的详细信息,请参阅 配置 Azure 存储连接字符串 和管理 存储帐户访问密钥。
对于生产环境,Microsoft建议使用 Microsoft Entra ID 身份验证。 有关详细信息,请参阅 授权访问 Azure 存储中的数据。
使用
az storage share create命令创建文件共享。 请确保将shareName替换为自己的共享名称。az storage share create -n shareName --connection-string $AZURE_STORAGE_CONNECTION_STRING使用以下命令将存储帐户密钥导出为环境变量。
STORAGE_KEY=$(az storage account keys list --resource-group nodeResourceGroupName --account-name myAKSStorageAccount --query "[0].value" -o tsv)使用以下命令回显存储帐户名称和密钥。 复制此信息,因为创建 Kubernetes 卷时需要这些值。
echo Storage account key: $STORAGE_KEY
创建 Kubernetes 机密
Kubernetes 需要使用凭据访问上一步骤中创建的文件共享。 这些凭据存储在 Kubernetes 机密中,该机密是在创建 Kubernetes Pod 时引用的。
使用
kubectl create secret命令创建机密。 以下示例创建名为 azure 机密 的机密,并从上一步填充 azurestorageaccountname 和 azurestorageaccountkey 。 若要使用现有 Azure 存储帐户,请提供帐户名称和密钥。kubectl create secret generic azure-secret --from-literal=azurestorageaccountname=myAKSStorageAccount --from-literal=azurestorageaccountkey=$STORAGE_KEY
将文件共享装载为永久性卷
新建名为
azurefiles-pv.yaml的文件,并将以下内容复制到其中。 在csi下,更新resourceGroup、volumeHandle和shareName。 对于装载选项,默认值fileMode为dirMode0777。apiVersion: v1 kind: PersistentVolume metadata: annotations: pv.kubernetes.io/provisioned-by: file.csi.azure.com name: azurefile spec: capacity: storage: 5Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain storageClassName: azurefile-csi csi: driver: file.csi.azure.com volumeHandle: "{resource-group-name}#{account-name}#{file-share-name}" # make sure this volumeid is unique for every identical share in the cluster volumeAttributes: shareName: aksshare nodeStageSecretRef: name: azure-secret namespace: default mountOptions: - dir_mode=0777 - file_mode=0777 - uid=0 - gid=0 - mfsymlinks - cache=strict - nosharesock - nobrl # disable sending byte range lock requests to the server and for applications which have challenges with posix locks使用
kubectl create命令创建永久性卷。kubectl create -f azurefiles-pv.yaml创建名为 azurefiles-mount-options-pvc.yaml 的新文件,并复制以下内容。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: azurefile spec: accessModes: - ReadWriteMany storageClassName: azurefile-csi volumeName: azurefile resources: requests: storage: 5Gi使用
kubectl apply命令创建 PersistentVolumeClaim。kubectl apply -f azurefiles-mount-options-pvc.yaml使用
kubectl get命令验证 PersistentVolumeClaim 是否已创建并绑定到 PersistentVolume。kubectl get pvc azurefile命令的输出如下例所示:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE azurefile Bound azurefile 5Gi RWX azurefile 5s更新容器规格以引用 YAML 文件中 的 PersistentVolumeClaim 和 Pod。 例如:
... volumes: - name: azure persistentVolumeClaim: claimName: azurefile无法就地更新 Pod 规范,因此请使用
kubectl delete命令删除 Pod,然后使用kubectl apply命令重新创建 Pod。kubectl delete pod mypod kubectl apply -f azure-files-pod.yaml
装载文件共享作为内联卷
Note
为了避免性能问题,建议在大量 Pod 访问同一文件共享时使用永久性卷而不是内联卷。 内联卷只能访问与 Pod 位于同一命名空间的机密。 若要指定不同的机密命名空间,请使用 永久性卷。
若要将 Azure 文件存储共享装载到 Pod 中,请在容器规范中配置卷。
新建名为
azure-files-pod.yaml的文件,并将以下内容复制到其中。 如果更改了文件共享名称或机密名称,请更新shareName和secretName。 还可以更新mountPath,这是文件共享在 Pod 中的装载路径。 对于 Windows Server 容器,请指定使用mountPathWindows 路径约定,例如“D:”。apiVersion: v1 kind: Pod metadata: name: mypod spec: nodeSelector: kubernetes.io/os: linux containers: - image: 'mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine' name: mypod resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi volumeMounts: - name: azure mountPath: /mnt/azure readOnly: false volumes: - name: azure csi: driver: file.csi.azure.com volumeAttributes: secretName: azure-secret # required shareName: aksshare # required mountOptions: 'dir_mode=0777,file_mode=0777,cache=strict,actimeo=30,nosharesock,nobrl' # optional使用
kubectl apply命令创建 Pod。kubectl apply -f azure-files-pod.yaml现在有一个正在运行的 Pod,其中 Azure 文件文件共享装载在 /mnt/azure。 可以使用
kubectl describe命令验证是否已成功装载共享。kubectl describe pod mypod
最佳做法
若要获得 Azure 文件存储的最佳体验,请遵循以下最佳做法:
- 配置装载选项 (mountOptions) 的位置取决于是预配动态永久性卷还是静态永久性卷。 如果要使用存储类 动态预配卷 ,请在存储类对象(类型:StorageClass)上指定装载选项。 如果要 静态预配卷,请在 PersistentVolume 对象上指定装载选项(类型:PersistentVolume)。 如果要 将文件共享装载为内联卷,请在 Pod 对象上指定装载选项(类型:Pod)。
- 建议在运行基准测试时使用 FIO。 有关详细信息,请参阅 基准测试工具和测试。
SMB 共享
以下存储类示例中提供了 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, Premium_ZRS, Standard_LRS, Standard_GRS, Standard_ZRS, 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 文件共享的性能。
NFS 共享
以下存储类示例中提供了建议的 NFS 共享装载选项:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: azurefile-csi-nfs provisioner: file.csi.azure.com parameters: protocol: nfs skuName: Premium_LRS # available values: Premium_LRS, Premium_ZRS reclaimPolicy: Delete volumeBindingMode: Immediate allowVolumeExpansion: true mountOptions: - nconnect=4 # improves performance by enabling multiple connections to share - noresvport # improves availability - actimeo=30 # reduces latency for metadata-heavy workloads增加 预读大小 以提高读取吞吐量。
虽然 Azure Files 支持将 nconnect 最多设置为 16,但配置装载选项时建议使用最佳设置 nconnect=4。 目前,对于 nconnect 的 Azure 文件存储实现来说,超过 4 个通道不会带来增益。
有关详细信息,请参阅 提高 NFS Azure 文件共享的性能。
后续步骤
有关 Azure 文件 CSI 驱动程序参数,请参阅 CSI 驱动程序参数。
有关关联的最佳做法,请参阅 AKS 中存储和备份的最佳做法。