Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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_ZRS,StandardSSD_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 CLIaks-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)。
- 若要在动态预配中使用驱动程序创建 ADLS 帐户,请在storage类参数中指定
默认情况下,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 驱动程序。
要在新群集上启用驱动程序,请在
--enable-blob-driver命令中包含az aks create参数,如下例所示:az aks create \ --enable-blob-driver \ --name myAKSCluster \ --resource-group myResourceGroup \ --generate-ssh-keys要在现有群集上启用驱动程序,请在
--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 驱动程序。
要在现有群集上禁用驱动程序,请在
--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 通过
动态预配的卷:当您希望 Kubernetes 自动创建和管理存储资源时,请使用此方法。 它非常适合需要按需缩放、首选基础结构即代码的方案,并且希望最大程度地减少手动配置步骤。
静态预配的卷:如果您已有可使用的 Azure Blob 存储帐户或容器,请选择此方法。 它提供对存储设置、访问和生命周期的更多控制,适用于需要连接到现有资源或在多个群集或工作负荷间重复使用存储的情况。
本部分为希望配置一个或多个持久卷的集群管理员提供指导,其中包括可供工作负载使用的Blob storage的详细信息。 永久性卷声明(PVC)使用存储类对象动态预配 Azure Blob 存储容器。
若要使用提供的存储类通过Azure Blob 存储预配持久卷,请执行以下步骤:
通过将以下 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.若要在群集中创建存储类,请应用以下命令以执行
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-premium 和 azureblob-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 持久性卷 文档。
创建一个名为
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使用 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。
创建一个名为
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使用 kubectl apply 命令创建 Pod:
kubectl apply -f blob-nfs-pv.yamlPod 处于运行状态后,运行以下命令以创建名为
test.txt的新文件。kubectl exec mypod -- touch /mnt/blob/test.txt若要验证磁盘是否已正确装载,请运行以下命令,并验证是否在
test.txt输出中看到该文件:kubectl exec mypod -- ls /mnt/blob命令的输出类似于以下示例:
test.txt
创建 Azure Blob 自定义存储类
默认Storage类适合最常见的场景,但并非全部。 在某些情况下,你可能想要使用自己的参数自定义自己的storage类。 在本部分中,我们将提供两个示例,其中第一个示例使用 NFS 协议,第二个示例使用 BlobFuse。
在此示例中,以下清单通过使用 "NFS" 协议配置装载 Blob存储容器。 使用它添加 tags 参数。
创建名为
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使用 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容器装载为永久性卷。
创建名为
pv-blob-nfs.yaml的文件,并将其复制到以下 YAML 中。 在storageClass下,更新resourceGroup、storageAccount和containerName。注释
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仅用于 PV 和 PVC 之间的大小匹配。 建议使用虚构的较高数值。 Pod 看到一个装载的卷,其虚构大小为 5 PB。运行以下命令,使用 kubectl create 命令创建永久性卷,引用前面创建的 YAML 文件:
kubectl create -f pv-blob-nfs.yaml使用
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运行以下命令,通过引用之前创建的 YAML 文件的 kubectl create 命令来创建持久卷声明:
kubectl create -f pvc-blob-nfs.yaml
创建容器组
以下 YAML 创建一个 Pod,该 Pod 使用之前创建的名为 pvc-blob 的 PV 或 PVC,在 /mnt/blob 路径上挂载 Azure Blob 存储。
创建名为
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运行以下命令,使用 kubectl create 命令创建 Pod 并装载 PVC:
kubectl create -f nginx-pod-blob.yaml运行以下命令,使用 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。
创建名为
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使用
kubectl create以下命令创建 StatefulSet:kubectl create -f azure-blob-nfs-ss.yaml
动态 PVC 存储类参数
下表包含可用于为动态 PVC 定义自定义 存储类 的参数。
| Name | Description | Example | 强制的 | 默认值 |
|---|---|---|---|---|
| skuName | 指定Azure storage帐户类型(别名:storageAccountType)。 |
Standard_LRS、Premium_LRS、Standard_GRS、Standard_RAGRS |
否 | Standard_LRS |
| 位置 | 指定Azure位置。 | chinanorth3 |
否 | 如果为空,驱动程序使用与当前群集相同的位置名称。 |
| resourceGroup | 指定Azure资源组名称。 | myResourceGroup | 否 | 如果为空,驱动程序将使用与当前群集相同的资源组名称。 |
| 存储帐户 | 指定Azure storage帐户名称。 | storageAccountName | 否 | 如果未提供特定的storage帐户名称,驱动程序将查找与同一资源组中的帐户设置匹配的合适storage帐户。 如果找不到匹配的存储帐户,则会创建一个新的帐户。 但是,如果指定了存储帐户名,则存储帐户必须已存在。 |
| networkEndpointType 1 | 为由驱动创建的存储帐户指定网络终结点类型。 如果指定 privateEndpoint,则会为存储帐户创建私有终结点。 对于其他情况,将为 NFS 协议创建服务终结点。 | privateEndpoint |
否 | 对于 AKS 群集,请将 AKS 群集名称添加到托管 VNet 的资源组的“参与者”角色中。 |
| 协议 | 指定 BlobFuse 装载或 NFSv3 装载。 |
fuse、nfs |
否 | 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 或容器进行公共访问。 |
true、false |
否 | false |
| storageEndpointSuffix | 指定 Azure 存储终结点后缀。 | core.chinacloudapi.cn |
否 | 如果为空,驱动程序会根据云环境使用默认存储端点后缀。 |
| tags | [标记][az-tags] 将在新的存储账户中创建。 | 标记格式:“foo=aaa,bar=bbb” | 否 | "" |
| matchTags | 驱动程序在尝试查找合适的存储帐户时匹配标记。 |
true、false |
否 | 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 装载。 |
fuse、nfs |
否 | 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 托管磁盘。
创建名为
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。使用
kubectl apply命令创建永久性卷声明,并指定 azure-pvc.yaml 文件。kubectl apply -f azure-pvc.yaml命令的输出类似于以下示例:
persistentvolumeclaim/azure-managed-disk created
将 PVC 应用到 Pod
创建永久性卷声明后,必须验证其状态为“Pending”。 状态“Pending”指示它已准备好供 Pod 使用。
使用
kubectl describe pvc命令检查 PVC 的状态。kubectl describe pvc azure-managed-disk命令的输出类似于以下示例:
Name: azure-managed-disk Namespace: default StorageClass: managed-csi Status: Pending [...]创建名为
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使用
kubectl apply命令创建 pod。kubectl apply -f azure-pvc-disk.yaml命令的输出类似于以下示例:
pod/mypod created您现在有一个正在运行的 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_LRS、Premium_LRS、StandardSSD_LRS、PremiumV2_LRS、UltraSSD_LRS |
否 | StandardSSD_LRS |
| fsType | 文件系统类型 |
ext4、ext3、ext2、xfs、btrfs(适用于 Linux)、ntfs(适用于 Windows) |
否 |
ext4(适用于 Linux)、ntfs(适用于 Windows) |
| cachingMode | [Azure数据磁盘主机缓存设置][disk-host-cache-setting](PremiumV2_LRS和UltraSSD_LRS仅支持 None 缓存模式) |
None、ReadOnly、ReadWrite |
否 | 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 是默认值。 |
512、4096 |
否 | 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] |
true、false |
否 | "" |
| 网络访问策略 (networkAccessPolicy) | NetworkAccessPolicy 属性,用于防止生成磁盘或快照的 SAS URI |
AllowAll、DenyAll、AllowPrivate |
否 | AllowAll |
| diskAccessID | 用于在磁盘上使用专用终结点的 Azure DiskAccess 资源的资源 ID | 否 | `` | |
| enableBursting | [启用按需突发][按需突发] 超出磁盘的预配性能目标。 按需突发应仅应用于高级版磁盘,同时磁盘大小 > 512 GB。 不支持超级磁盘和共享磁盘。 默认情况下禁用突发功能。 |
true、false |
否 | 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 | 文件系统类型 |
ext4、ext3、ext2、xfs、btrfs(适用于 Linux)、ntfs(适用于 Windows) |
否 |
ext4(适用于 Linux)、ntfs(适用于 Windows) |
| volumeAttributes.partition | 现有磁盘的分区号(仅在 Linux 上受支持) |
1、2、3 |
否 | 空(无分区) - 确保分区格式类似于 -part1 |
| volumeAttributes.cachingMode | [磁盘主机缓存设置][disk-host-cache-setting] |
None、ReadOnly、ReadWrite |
否 | ReadOnly |
创建Azure磁盘自定义存储类
默认存储类适用于大多数常见场景。 在某些情况下,你可能想要使用自己的参数自定义自己的storage类。 例如,你可能想要更改 volumeBindingMode 类。
可以使用一个 volumeBindingMode: Immediate 类,该类保证在创建持久性卷声明(PVC)后能立即使用。 当节点池受到拓扑约束时(例如使用 availability zones),PVs 在不知道 Pod 调度要求的情况下将被绑定或预配。
若要解决这种情况,可以使用 volumeBindingMode: WaitForFirstConsumer,这会在创建一个使用 PVC 的 Pod 之前延迟 PV 的绑定和预配。 此方法可确保按照 Pod 的调度约束,在相同的可用性区域或拓扑中预配持久卷(PV)。 默认存储类使用 volumeBindingMode: WaitForFirstConsumer 类。
创建一个名为
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运行 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 磁盘所在的同一资源组中。 |
| 增量 | 创建 完整快照或增量快照 |
true、false |
否 | true |
| tags | Azure磁盘标记 | 标记格式:“key1=val1,key2=val2” | 否 | "" |
| userAgent | 用于 客户使用情况归因 的用户代理 | 否 | 生成的用户代理格式为 driverName/driverVersion compiler/version (OS-ARCH) |
|
| subscriptionID | 指定创建 Azure 磁盘的 Azure 订阅 ID | Azure订阅 ID | 否 | 如果未为空, resourceGroup 则必须提供, incremental 必须设置为 false |
卷快照支持以下场景:
- 备份和还原:创建有状态应用程序数据的时间点备份,并在需要时还原。
- 数据克隆:克隆现有卷以使用相同的数据创建新的永久性卷。
- 灾难恢复:快速从数据丢失或损坏中恢复。
创建卷快照
注释
在继续之前,请确保应用程序不会将数据写入源磁盘。
请作为此功能的示例,使用 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在本文稍早部分创建的 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若要验证是否已正确创建快照,请运行以下命令:
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。
使用在上一步中创建的快照,并创建一个 new PVC 和 new 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为了确保它与之前创建的 PVC 是相同的,请通过运行以下命令来检查内容。
kubectl exec nginx-restored -- ls /mnt/azuredisk命令的输出类似于以下示例:
lost+found outfile test.txt
我们仍然可以按预期看到我们之前创建的test.txt文件,
克隆卷
克隆的卷定义为现有 Kubernetes 卷的副本。 有关在 Kubernetes 中克隆卷的详细信息,请参阅 卷克隆。
-
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 可以通过运行以下命令来验证克隆的卷的内容,并查看文件
test.txt是否已创建:kubectl exec nginx-restored-cloning -- ls /mnt/azuredisk命令的输出类似于以下示例:
lost+found outfile test.txt
在不停机的情况下调整Azure磁盘 PV 的大小
可为 PVC 请求较大的卷。 编辑 PVC 对象,并指定较大的大小。 此项更改会触发为 PV 提供支持的基础卷的扩展。
注释
永远不会创建新的 PV 来满足声明, 而是会调整现有卷的大小。
在 AKS 中,内置
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
通过运行以下命令增加
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运行以下命令以确认存储卷大小增加:
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 (...)几分钟后,运行以下命令以确认 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运行以下命令,确认 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 节点池。
拥有 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若要验证卷的内容,请运行以下命令:
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 类。
创建名为
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命令创建storage类。kubectl apply -f azure-file-sc.yaml
创建 PVC
PVC 使用 storage 类对象动态预配Azure文件共享。 可以使用以下 YAML 创建大小为 100 GB,具有 ReadWriteMany 访问权限的 PVC。 有关访问模式的详细信息,请参阅 Kubernetes 持久卷。
创建名为
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_LRSSKU,则storage的最小值必须为100Gi。使用
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:”。
创建名为
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使用
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 及更高版本,fileMode 和 dirMode 的默认值为 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 | 存储帐户的访问层 | 标准帐户可以选择 Hot 或 Cool,高级帐户只能选择 Premium。 |
否 | 空白。 对不同的存储帐户类型使用默认设置。 |
| accountQuota | 限制帐户的配额。 默认情况下,可以指定最大配额(102,400 GB)。 如果帐户超过指定的配额,驱动程序将跳过选择该帐户的步骤。 | 否 | 102400 |
|
| 允许Blob公共访问 | 允许或禁止对驱动程序创建的存储帐户中的所有 blob 或容器进行公共访问。 |
true 或 false |
否 | false |
| 删除保留策略禁用 | 指定是否禁用驱动程序创建的存储账户的DeleteRetentionPolicy。 |
true 或 false |
否 | false |
| folderName | 在Azure文件共享中指定文件夹名称。 | Azure文件共享中的现有文件夹名称。 | 否 | 如果文件共享中不存在文件夹名称,装载会失败。 |
| 获取最新账户 | 确定是否根据创建时间获取最新的帐户密钥。 默认情况下,此驱动程序将获取第一个密钥。 |
true 或 false |
否 | false |
| 位置 | 指定 Azure 存储帐户的 Azure 区域。 | 例如,chinanorth3。 |
否 | 如果为空,驱动程序将使用与当前 AKS 群集相同的位置名称。 |
| matchTags | 驱动程序尝试查找合适的存储帐户时匹配标签。 |
true 或 false |
否 | false |
| networkEndpointType 1 | 为由驱动创建的存储帐户指定网络终结点类型。 如果指定了 privateEndpoint,则会为存储帐户创建专用终结点。 对于其他情况,默认会创建服务终结点。 |
"",privateEndpoint |
否 | "" |
| 协议 | 指定文件共享协议。 |
smb、nfs |
否 | smb |
| requireInfraEncryption | 指定服务是否对驱动程序创建的存储帐户中的静态数据应用由平台托管密钥的二次加密层。 |
true 或 false |
否 | false |
| resourceGroup | 指定Azure磁盘的资源组。 | 现有资源组名称 | 否 | 如果为空,驱动程序将使用与当前 AKS 群集相同的资源组名称。 |
| selectRandomMatchingAccount | 确定是否随机选择匹配帐户。 默认情况下,驱动程序始终按字母顺序选择第一个匹配的帐户(注意:此驱动程序使用帐户搜索缓存,这会导致多个帐户之间的文件创建分布不均匀)。 |
true 或 false |
否 | false |
| 服务器 | 指定Azure storage帐户服务器地址。 | 现有服务器地址,例如 accountname.privatelink.file.core.chinacloudapi.cn。 |
否 | 如果为空,驱动程序使用默认的 accountname.file.core.chinacloudapi.cn 或其他主权云帐户地址。 |
| shareAccessTier | 文件共享的访问层级 | General purpose v2 帐户可以在 TransactionOptimized (默认值)、Hot 和 Cool 之间进行选择。 仅用于文件共享的 Premium 存储帐户类型。 |
否 | 空白。 为不同的存储账号类型使用默认设置。 |
| 共享名称 | 指定Azure文件共享名称。 | 现有或新的Azure文件共享名称。 | 否 | 如果为空,驱动程序将生成Azure文件共享名称。 |
| shareNamePrefix | 指定Azure驱动程序创建的文件共享名称前缀。 | 共享名只能包含小写字母、数字、连字符,长度应少于 21 个字符。 | 否 | |
| skuName | Azure Files 存储帐户类型(别名:storageAccountType) |
Standard_LRS、、Standard_GRSStandard_RAGRS、Standard_RAGZRS、Premium_LRS |
否 | Standard_LRS高级帐户类型的最小文件共享大小为 100 GB。 NFS 文件共享仅支持高级帐户类型。 标准 V2 SKU 名称适用于Azure Files预配的 v2 模型。 |
| 存储帐户 | 指定Azure storage帐户名称。 | storageAccountName | - 否 | 如果未提供特定的storage帐户名称,驱动程序将查找与同一资源组中的帐户设置匹配的合适storage帐户。 如果找不到匹配的存储帐户,则会创建一个新帐户。 但是,如果指定了存储帐户名,则存储帐户必须已存在。 |
| storageEndpointSuffix | 指定 Azure 存储终结点后缀。 |
core.chinacloudapi.cn、core.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 | 指定文件共享协议。 |
smb、nfs |
否 | smb |
| volumeAttributes.server | 指定Azure storage帐户服务器地址 | 现有服务器地址,例如 accountname.privatelink.file.core.chinacloudapi.cn。 |
否 | 如果为空,驱动程序使用默认的 accountname.file.core.chinacloudapi.cn 或其他主权云帐户地址。 |
创建 PV 快照类
Azure Files CSI 驱动程序支持创建持久卷的快照和基础文件共享。
使用 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从之前创建的 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通过运行以下命令验证快照是否已正确创建:
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
通过增加
spec.resources.requests.storage字段来扩展 PVC:kubectl patch pvc pvc-azurefile --type merge --patch '{"spec": {"resources": {"requests": {"storage": "200Gi"}}}}'命令的输出类似于以下示例:
persistentvolumeclaim/pvc-azurefile patched验证 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。
创建名为
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使用
kubectl apply命令创建storage类:kubectl apply -f private-azure-file-sc.yaml命令的输出类似于以下示例:
storageclass.storage.k8s.io/private-azurefile-csi created创建一个名为
private-pvc.yaml的文件,然后将以下示例清单粘贴到该文件中:apiVersion: v1 kind: PersistentVolumeClaim metadata: name: private-azurefile-pvc spec: accessModes: - ReadWriteMany storageClassName: private-azurefile-csi resources: requests: storage: 100Gi使用 kubectl apply 命令创建 PVC:
kubectl apply -f private-pvc.yaml
使用托管身份访问 Azure 文件存储(预览版)
Azure Files 现在支持基于托管标识的 SMB 访问身份验证。 借助此功能,运行在 AKS 中的应用程序可以安全地访问 Azure 文件共享,而无需存储或管理存储帐户密钥或凭据。 托管标识提供了一种简化且安全的身份验证机制,从而简化访问管理并降低与凭据泄露相关的风险。 可以创建动态卷或静态卷。
注释
从 AKS 版本 1.34 开始,Linux 节点上的 AKS 可在预览版中提供对 Azure Files 的托管标识支持。
若要为动态预配的卷启用托管标识,请执行以下步骤:
使用 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通过运行以下命令应用此存储类:
kubectl apply -f azurefile-csi-managed-identity.yaml使用引用此 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 的性能。
rsize和wsize选项设置NFS操作的最大传输大小。 如果rsize或wsize在装载时未指定,则客户端和服务器将协商两者所支持的最大大小。 目前,Azure Files和新式 Linux 分发版都支持大小为 1,048,576 字节(1 MiB)的读写大小。
最佳性能基于高效的客户端-服务器通信。 增加或减少 装载 读取和写入选项大小值可以提高 NFS 性能。 对于客户端和服务器之间传输的读/写数据包,针对 NFS 版本 2 的默认大小为 8 KB,针对 NFS 版本 3 和 4 的默认大小为 32 KB。 这些默认值可能太大或太小。 通过减少rsize和wsize,并为每个 NFS 读取回复和写入请求发送较小的数据包,可以在拥堵的网络中提高 NFS 性能。 但是,这种减少可以增加跨网络发送数据的数据包数,增加客户端和服务器上的网络流量和 CPU 使用率。
请务必执行测试以查找能够维持高效数据包传输的rsize和wsize,确保它们不会降低吞吐量或增加延迟。
例如,若要将最大 rsize 和 wsize 配置为 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
其他存储类示例
Windows 容器
Azure Files CSI 驱动程序还支持 Windows 节点和容器。 若要使用 Windows 容器,请遵循 Windows 容器快速入门教程添加 Windows 节点池。
拥有 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通过运行以下 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 (...)
后续步骤
- 有关 Azure Files CSI 驱动程序参数,请参阅 CSI 驱动程序参数。
- 有关存储最佳做法的详细信息,请参阅 Azure Kubernetes Service 中的存储和备份最佳做法。
- 有关Azure超级磁盘的详细信息,请参阅[在 Azure Kubernetes Service 上使用超级磁盘][use-ultra-disks]。
- 有关 Azure 标记的详细信息,请参阅 在 Azure Kubernetes 服务 (AKS) 中使用 Azure 标记。