Azure Blob 存储容器存储接口 (CSI) 驱动程序是符合 CSI 规范的驱动程序,供 Azure Kubernetes 服务 (AKS) 用来管理 Azure Blob 存储的生命周期。 CSI 是有关对 Kubernetes 上的容器化工作负载公开任意块和文件存储系统的一个标准。
现在,AKS 可以采用和使用 CSI 来编写、部署和迭代插件,以在 Kubernetes 中公开新的存储系统或改进现有的存储系统。 使用 AKS 中的 CSI 驱动程序避免改动核心 Kubernetes 代码并等待经历代码发布周期。
将 Azure Blob 存储作为文件系统装载到容器或 Pod 中时,它使你可以将 Blob 存储用于处理大量非结构化数据的多个应用程序。 例如:
- 日志文件数据
- 图像、文档和流式传输视频或音频
- 灾难恢复数据
应用程序使用 BlobFuse 或网络文件系统 (NFS) 3.0 协议访问 Azure Blob 存储中存储的数据。 在引入 Azure Blob 存储 CSI 驱动程序之前,只能手动安装不受支持的驱动程序,从而借助在 AKS 上运行的应用程序访问 Blob 存储。 在 AKS 上启用 Azure Blob 存储 CSI 驱动程序时,有两个内置存储类:
- azureblob-fuse-premium
- azureblob-nfs-premium
要创建支持 CSI 驱动程序的 AKS 群集,请参阅 AKS 上的 CSI 驱动程序。 要详细了解使用 NFS 协议的每种 Azure 存储类型之间的访问差异,请参阅使用 NFS 比较对 Azure 文件、Blob 存储和 Azure NetApp 文件的访问。
Azure 磁盘容器存储接口(CSI)驱动程序是 Azure Kubernetes 服务(AKS)用于管理 Azure 磁盘生命周期的 CSI 规范兼容驱动程序。
CSI 是有关对 Kubernetes 上的容器化工作负载公开任意块和文件存储系统的一个标准。 现在,AKS 可以采用和使用 CSI 来编写、部署和迭代插件,以在 Kubernetes 中公开新的存储系统或改进现有的存储系统。 使用 AKS 中的 CSI 驱动程序避免改动核心 Kubernetes 代码并等待经历代码发布周期。 若要创建支持 CSI 驱动程序的 AKS 群集,请参阅 在 AKS 上启用 CSI 驱动程序。
有关 Kubernetes 存储卷的更多信息,请参阅 AKS 中应用程序的存储选项。
注释
树内驱动程序 是指属于核心 Kubernetes 代码的一部分的当前存储驱动程序,而新的 CSI 驱动程序是插件。
Azure 文件容器存储接口(CSI)驱动程序是 Azure Kubernetes 服务(AKS)用来管理 Azure 文件共享生命周期的 符合 CSI 规范的驱动程序。 CSI 是有关对 Kubernetes 上的容器化工作负载公开任意块和文件存储系统的一个标准。
现在,AKS 可以采用和使用 CSI 来编写、部署和迭代插件,以在 Kubernetes 中公开新的存储系统或改进现有的存储系统。 使用 AKS 中的 CSI 驱动程序避免改动核心 Kubernetes 代码并等待经历代码发布周期。
要创建支持 CSI 驱动程序的 AKS 群集,请参阅在 AKS 上启用 CSI 驱动程序。
注释
树内驱动程序 是指属于核心 Kubernetes 代码的一部分的当前存储驱动程序,而新的 CSI 驱动程序是插件。
Azure CSI 驱动程序功能
Azure Blob 存储 CSI 驱动程序支持以下功能:
- BlobFuse
- NFS 3.0 协议
除了树状驱动程序功能外,Azure 磁盘 CSI 驱动程序还支持以下功能:
并发磁盘附加和分离期间的性能改进
- 树中驱动程序以串行方式附加或分离磁盘,而 CSI 驱动程序分批附加或分离磁盘。 当多个磁盘连接到一个节点时,性能会显著改善。
支持高级 SSD v1 和 v2。
-
PremiumV2_LRS仅支持None缓存模式
-
区域冗余存储 (ZRS) 磁盘支持
-
Premium_ZRS,StandardSSD_ZRS支持磁盘类型。 ZRS 磁盘可以调度到区域或非区域节点上,且不受磁盘卷必须与给定节点位于同一区域的限制。 有关详细信息,包括支持哪些区域,请参阅 托管磁盘的区域冗余存储。
-
注释
根据所使用的 VM SKU,Azure 磁盘 CSI(容器存储接口)驱动程序可能对每个节点设有卷限制。 对于一些功能强大的 VM(例如 16 个核心),每个节点的限制为 64 个卷。 若要确定每个 VM SKU 的限制,请查看所提供的每个 VM SKU 的“最大数据磁盘数”列。 有关提供的 VM SKU 及其相应的详细容量限制的列表,请参阅常规用途虚拟机大小。
先决条件
必须安装并配置 Azure CLI 2.42 或更高版本。 若要查找版本,请运行
az --version。 如果需要安装或升级,请参阅 安装 Azure CLI。 如果安装了 Azure CLIaks-preview扩展,请确保通过调用az extension update --name aks-preview将扩展更新到最新版本。如果以前安装了 CSI Blob 存储开放源代码驱动程序以从群集访问 Azure Blob 存储,请执行以下步骤来清理开源驱动程序。
AKS 群集 控制平面 标识(AKS 群集名称)将添加到 VNet 和网络安全组的 “参与者 ”角色。
若要在使用 BlobFuse 挂载时支持 [Azure Data Lake Storage Gen2 帐户][azure-datalake-storage-account](ADLS),请执行以下操作:
- 若要在动态预配中使用驱动程序创建 ADLS 帐户,请在存储类参数中指定
isHnsEnabled: "true"。 - 若要在静态预配中启用对 ADLS 帐户的 BlobFuse 访问,请在持久卷中指定装载选项
--use-adls=true。 - 如果要激活具有分层命名空间的存储帐户,应使用
--use-adls=true挂载选项重新挂载已存在的持久卷(PV)。
- 若要在动态预配中使用驱动程序创建 ADLS 帐户,请在存储类参数中指定
默认情况下,BlobFuse 缓存位于
/mnt目录中。 如果虚拟机 (VM) SKU 提供临时磁盘,则会将/mnt目录装载到临时磁盘上。 但是,如果 VM SKU 不提供临时磁盘,则会将/mnt目录装载到 OS 磁盘上,可以设置--tmp-path=装载选项来指定不同的缓存目录。
注释
如果在安装开源驱动程序期间未启用 blobfuse-proxy ,则开放源代码驱动程序的卸载会中断现有的 blobfuse 装载。 但是,NFS 装载仍然不受影响。
必须启用 Azure 磁盘 CSI 驱动程序的 AKS 群集。 默认情况下,CSI 驱动程序在运行 Kubernetes 1.21 或更高版本的 AKS 群集上启用。
已安装并配置 Azure CLI 2.37.0 或更高版本。 运行
az --version即可查找版本。 如果需要安装或升级,请参阅 安装 Azure CLI。kubectl命令行工具已安装并配置为连接到 AKS 群集。配置为使用 Azure 磁盘 CSI 驱动程序的存储类(
disk.csi.azure.com)。Azure 磁盘 CSI 驱动程序对节点有卷限制。 卷计数因节点/节点池的大小而异。 运行 kubectl get 命令以确定可为每个节点分配的卷数:
kubectl get CSINode <nodename> -o yaml如果每个节点的卷限制是工作负载方面的问题,请考虑对永久性卷使用 Azure 容器存储,而不是 CSI 驱动程序。
常规要求:
您必须有一个启用了 Azure 文件 CSI 驱动程序的 AKS 群集。 默认情况下,在运行 Kubernetes 1.21 或更高版本的 AKS 群集上启用 Azure 文件 CSI 驱动程序。
已安装并配置 Azure CLI 2.37.0 或更高版本。 若要检查版本,请运行
az --version。 如果需要安装或升级,请参阅 安装 Azure CLI。kubectl命令行工具已安装并配置为连接到 AKS 群集。配置为使用 Azure 文件 CSI 驱动程序的存储类(
file.csi.azure.com)。在标准文件共享和高级文件共享之间进行选择时,请务必了解预配模型以及计划针对 Azure 文件运行的预期使用模式的要求。 有关详细信息,请参阅 基于使用模式选择 Azure 文件存储性能层。
网络文件共享(NFS)要求:
AKS 群集控制平面标识(AKS 群集名称)被添加到 VNet 和 网络安全组上的“参与者”角色。
必须将 AKS 群集的服务主体或托管服务标识(MSI)添加到存储帐户的 参与者 角色。
托管标识要求:
确保将用户分配的 Kubelet 标识授予
Storage File Data SMB MI Admin存储帐户上的适当角色。 如果使用自己的存储帐户,则需要将角色分配给Storage File Data SMB MI Admin该存储帐户上的用户分配的 Kubelet 标识。如果 CSI 驱动程序创建了存储帐户,请向存储帐户所在的资源组授予
Storage File Data SMB MI Admin角色。如果使用默认内置的用户指定的 Kubelet 标识,则它已具有托管节点资源组上所需的
Storage File Data SMB MI Admin角色。
注释
Azure 文件 CSI 驱动程序仅允许使用基于密钥(NTLM v2)的身份验证来装载 SMB 文件共享,因此不支持 Azure 文件共享设置的最高安全设置。 另一方面,装载 NFS 文件共享不需要基于密钥的身份验证。
在新的或现有 AKS 群集上启用 CSI 驱动程序
借助 Azure CLI,可以在新的或现有 AKS 群集上启用 Blob 存储 CSI 驱动程序,然后再配置永久性卷以供群集中的 Pod 使用。
要在新群集上启用驱动程序,请在
--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。
如果多个 Pod 需要对同一存储卷进行并发访问,则可以使用 Azure Blob 存储通过 NFS 或 BlobFuse 进行连接。 本文介绍如何动态创建 Azure Blob 存储容器,以供 AKS 群集中的多个 Pod 使用。
有关 Kubernetes 存储卷的更多信息,请参阅 AKS 中应用程序的存储选项。
本文介绍如何使用 Azure 磁盘动态创建 PV,供 AKS 群集中的单个 Pod 使用。
如果多个 Pod 需要并发访问同一存储卷,则可以使用 Azure Files 通过 服务器消息块(SMB) 或 网络文件系统(NFS)进行连接。 本文将介绍如何动态创建 Azure 文件共享以供 AKS 群集中的多个 Pod 使用。
动态预配的卷: 如果希望 Kubernetes 自动创建和管理存储资源,请使用此方法。 它非常适合需要按需缩放、首选基础结构即代码的方案,并且希望最大程度地减少手动配置步骤。
静态预配卷: 如果已有要使用的 Azure Blob 存储帐户或容器,请选择此方法。 它提供对存储设置、访问和生命周期的更多控制,当需要连接到现有资源或跨多个群集或工作负荷重复使用存储时,它适用。
本部分为想要预配一个或多个永久性卷的群集管理员提供指导,其中包括可供工作负荷使用的 Blob 存储的详细信息。 永久性卷声明(PVC)使用存储类对象来动态预配 Azure Blob 存储容器。
若要通过提供的存储类使用 Azure Blob 存储预配永久性卷,请执行以下步骤:
通过将以下 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
存储类用于定义创建 Azure Blob 存储容器的方法。 节点资源组中会自动创建一个存储帐户,用于与存储类一起来保存 Azure Blob 存储容器。 为“skuName”选择以下 Azure 存储冗余 SKU 之一:
- Standard_LRS:标准本地冗余存储
- Premium_LRS:高级本地冗余存储
- Standard_GRS:标准异地冗余存储
- Standard_RAGRS:标准只读访问地理冗余存储
在 AKS 上使用存储 CSI 驱动程序时,还存在两个内置组件,这些组件使用 Azure Blob CSI 存储驱动程序 StorageClasses。
针对这两个存储类的回收策略可确保在删除相应 PV 时删除基础 Azure Blob 存储。 默认情况下,存储类还会将容器配置为可扩展,因为 set allowVolumeExpansion 参数设置为 true。
注释
不支持收缩永久性卷。
使用 kubectl get sc 命令查看存储类。 以下示例显示了 AKS 群集中提供的 azureblob-fuse-premium 和 azureblob-nfs-premium 存储类:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
azureblob-fuse-premium blob.csi.azure.com Delete Immediate true 23h
azureblob-nfs-premium blob.csi.azure.com Delete Immediate true 23h
若要使用这些存储类,请创建一个引用并使用这些类的 PVC 和相应 Pod。 PVC 用于根据存储类自动分配存储。 可以使用内置存储类之一或自定义存储类创建 PVC。 此 PVC 创建具有指定 SKU、大小和协议的 Azure Blob 存储容器。 创建 Pod 定义时,将指定 PVC 来请求所需的存储。
PVC 使用存储类对象动态预配 Azure Blob 存储容器。 以下 YAML 可用于使用内置存储类创建具有 ReadWriteMany 访问权限的 5 GB PVC。 有关访问模式的详细信息,请参阅 Kubernetes 持久卷 文档。
创建一个名为
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 存储。
创建一个名为
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 自定义存储类
默认存储类适合最常见的方案,但并非适合所有方案。 在某些情况下,你可能想要使用自己的参数自定义自己的存储类。 在本部分中,我们将提供两个示例,其中第一个示例使用 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 命令创建存储类:
kubectl apply -f blob-nfs-sc.yaml命令的输出类似于以下示例:
storageclass.storage.k8s.io/blob-nfs-premium created
装载 NFS 或 BlobFuse PV
在本部分中,将使用 NFS 协议或 BlobFuse 装载 PV。
使用 NFS v3 协议装载 Blob 存储不会使用帐户密钥进行身份验证。 AKS 群集需要与代理节点位于同一虚拟网络或对等虚拟网络中。 保护存储帐户中的数据的唯一方法是使用虚拟网络和其他网络安全设置。 有关如何设置对存储帐户的 NFS 访问权限的详细信息,请参阅 使用网络文件系统 (NFS) 3.0 协议装载 Blob 存储。
以下示例演示如何使用 NFS 协议将 Blob 存储容器装载为永久性卷。
创建名为
pv-blob-nfs.yaml的文件,并将其复制到以下 YAML 中。 在storageClass下,更新resourceGroup、storageAccount和containerName。注释
volumeHandleYAML 中的值应当是群集中每个相同的存储 Blob 容器的唯一 volumeID。字符
#并/保留供内部使用,不能使用。apiVersion: v1 kind: PersistentVolume metadata: annotations: pv.kubernetes.io/provisioned-by: blob.csi.azure.com name: pv-blob spec: capacity: storage: 1Pi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain # If set as "Delete" container would be removed after pvc deletion storageClassName: azureblob-nfs-premium mountOptions: - nconnect=4 csi: driver: blob.csi.azure.com # make sure volumeid is unique for every identical storage blob container in the cluster # character `#` and `/` are reserved for internal use and cannot be used in volumehandle volumeHandle: account-name_container-name volumeAttributes: resourceGroup: resourceGroupName storageAccount: storageAccountName containerName: containerName protocol: nfs注释
虽然 Kubernetes API容量 属性是必需的,但 Azure Blob 存储 CSI 驱动程序不使用此值,因为可以灵活写入数据,直到达到存储帐户的容量限制。 特性的值
capacity仅用于 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 存储:
kubectl exec -it nginx-blob -- df -h命令的输出如下例所示:
Filesystem Size Used Avail Use% Mounted on ... blobfuse 14G 41M 13G 1% /mnt/blob ...
创建 StatefulSet
若要确保工作负载在 Pod 重启或替换时保留其存储卷,请使用 StatefulSet。 StatefulSet 简化了将持久存储与 Pod 相关联的过程,从而使用于替换失败 Pod 的新 Pod 可以自动访问相同的存储卷。 以下示例演示如何使用 BlobFuse 或 NFS 协议为 Blob 存储设置 StatefulSet。
创建名为
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 存储帐户类型(别名: storageAccountType) 。 |
Standard_LRS、Premium_LRS、Standard_GRS、Standard_RAGRS |
否 | Standard_LRS |
| 位置 | 指定 Azure 位置。 | chinanorth3 |
否 | 如果为空,驱动程序使用与当前群集相同的位置名称。 |
| resourceGroup | 指定 Azure 资源组名称。 | myResourceGroup | 否 | 如果为空,驱动程序将使用与当前群集相同的资源组名称。 |
| 存储帐户 | 指定 Azure 存储帐户名称。 | storageAccountName | 否 | 如果未提供特定的存储帐户名称,驱动程序将查找与同一资源组中的帐户设置匹配的合适存储帐户。 如果找不到匹配的存储帐户,则会创建一个新帐户。 但是,如果指定了存储帐户名称,则存储帐户必须已经存在。 |
| networkEndpointType 1 | 为驱动程序创建的存储帐户指定网络终结点类型。 如果指定了 privateEndpoint,则会为存储帐户创建 专用终结点 。 对于其他情况,将为 NFS 协议创建服务终结点。 | privateEndpoint |
否 | 对于 AKS 群集,请将 AKS 群集名称添加到托管 VNet 的资源组的“参与者”角色中。 |
| 协议 | 指定 BlobFuse 装载或 NFSv3 装载。 |
fuse、nfs |
否 | fuse |
| containerName | 指定现有容器(目录)名称。 | 容器 | 否 | 如果为空,驱动程序将创建一个新的容器名称,从 pvc-fuse BlobFuse 或 pvc-nfs NFS v3 开始。 |
| containerNamePrefix | 指定驱动程序创建的 Azure 存储目录前缀。 | 我 | 否 | 只能包含小写字母、数字、连字符和长度应少于 21 个字符。 |
| 服务器 | 指定 Azure 存储帐户域名。 | 现有存储帐户的 DNS 域名,例如 <storage-account>.blob.core.chinacloudapi.cn。 |
否 | 如果为空,驱动程序使用默认 <storage-account>.blob.core.chinacloudapi.cn 或其他主权云存储帐户 DNS 域名。 |
| 允许Blob公共访问 | 允许或禁止公共访问驱动程序创建的存储帐户的所有 Blob 或容器。 |
true、false |
否 | false |
| storageEndpointSuffix | 指定 Azure 存储终结点后缀。 | core.chinacloudapi.cn |
否 | 如果为空,驱动程序会根据云环境使用默认存储终结点后缀。 |
| tags | [标记][az-tags] 将在新的存储帐户中创建。 | 标记格式:“foo=aaa,bar=bbb” | 否 | "" |
| matchTags | 驱动程序尝试查找合适的存储帐户时匹配标记。 |
true、false |
否 | false |
1 如果存储帐户由驱动程序创建,则只需在存储类中指定 networkEndpointType: privateEndpoint 参数。 CSI 驱动程序将创建专用终结点和专用 DNS 区域(命名 privatelink.blob.core.chinacloudapi.cn)以及帐户。 如果自带存储帐户,则需要为存储帐户 创建专用终结点 。 如果在网络隔离群集中使用 Azure Blob 存储,则必须使用 networkEndpointType: privateEndpoint 创建自定义存储类。
静态 PV 预配参数
下表包含可用于定义静态 PV 的参数。
| Name | Description | Example | 强制的 | 默认值 |
|---|---|---|---|---|
| volumeHandle | 指定一个值,以供驱动程序在群集中唯一识别存储 Blob 容器。 | 生成唯一值的建议方法是组合全局唯一存储帐户名称和容器名称: {account-name}_{container-name} # 和 / 字符保留供内部使用,不能在卷句柄中使用。 |
是的 | |
| volumeAttributes.resourceGroup | 指定 Azure 资源组名称。 | myResourceGroup | 否 | 如果为空,驱动程序将使用与当前群集相同的资源组名称。 |
| 卷属性.存储账户 | 指定现有的 Azure 存储帐户名称。 | storageAccountName | 是的 | |
| volumeAttributes.containerName | 指定现有的容器名称。 | 容器 | 是的 | |
| volumeAttributes.protocol | 指定 BlobFuse 装载或 NFS v3 装载。 |
fuse、nfs |
否 | fuse |
使用内置存储类创建 Azure 磁盘 PV
存储类用于定义如何使用 PV 动态创建存储单元。 有关 Kubernetes 存储类的详细信息,请参阅 Kubernetes 存储类。
在 AKS 上使用 Azure 磁盘 CSI 驱动程序时,还有两个使用 Azure 磁盘 CSI 存储驱动程序的内置 StorageClasses 驱动程序。 其他 CSI 存储类是使用群集连同树中默认的存储类一起创建的。
managed-csi:使用具有本地冗余存储的 Azure 标准 SSD 创建托管磁盘(LRS)。 对于跨多个可用性区域部署的 AKS 群集的 Kubernetes 版本 1.29,此存储类使用 Azure 标准 SSD 区域冗余存储(ZRS)来预配托管磁盘。managed-csi-premium:使用 Azure 高级 LRS 预配托管磁盘。 从 Kubernetes 版本 1.29 开始,对于跨多个可用性区域的 AKS 群集,此存储类会自动使用 Azure Premium ZRS 创建托管磁盘。
从 Kubernetes 版本 1.29 开始,跨多个可用性区域部署 Azure Kubernetes 服务 (AKS) 群集时,AKS 现在利用区域冗余存储 (ZRS) 在内置存储类中创建托管磁盘。
ZRS 确保在所选区域中的多个 Azure 可用性区域之间同步复制 Azure 托管磁盘。 此冗余策略可增强应用程序的复原能力,并保护数据免受数据中心故障的影响。
但是,请务必注意,与本地冗余存储 (LRS) 相比,区域冗余存储 (ZRS) 的成本更高。 如果成本优化是优先级,则可以使用 LRS SKU 名称参数创建新的存储类,并将其用于永久性卷声明。
由于存在数据丢失风险,不支持缩小 PVC 的大小。 可以使用 kubectl edit sc 命令编辑现有存储类,也可以创建自己的自定义存储类。 例如,如果要使用大小为 4 TiB 的磁盘,则必须创建一个存储类,该类定义 cachingmode: None ,因为磁盘 4 TiB 和更大的磁盘不支持磁盘缓存][disk-host-cache-setting]。 有关存储类和创建自己的存储类的详细信息,请参阅 AKS 中应用程序的存储选项。
这两个存储类中的回收策略可确保在删除相应的 PV 时删除基础 Azure 磁盘。 存储类还会将 PV 配置为可扩展。 只需将 PVC 编辑为新大小即可。
若要使用这些存储类,请创建一个 PVC 和相应的 Pod 来引用和使用它们。 PVC 用于基于存储类自动预配存储。 PVC 可以使用预先创建的存储类之一或用户定义的存储类为所需的 SKU 和大小创建 Azure 托管磁盘。 创建 Pod 定义时,将指定 PVC 来请求所需的存储。
注释
持久性卷声明是以 GiB 为单位指定的,但 Azure 托管磁盘的收费是基于特定大小的 SKU。 这些 SKU 的范围为 32 GiB(适用于 S4 或 P4 磁盘)到 32 TiB(适用于 S80 或 P80 磁盘),属于预览版。 高级托管磁盘的吞吐量和 IOPS 性能取决于 SKU 和 AKS 群集中节点的实例大小。 有关详细信息,请参阅托管磁盘的定价和性能。
可以使用 kubectl get sc 命令查看预先创建的存储类。 以下示例显示了 AKS 群集中可用的预先创建的存储类:
kubectl get sc
命令的输出类似于以下示例:
NAME PROVISIONER AGE
default (default) disk.csi.azure.com 1h
managed-csi disk.csi.azure.com 1h
PVC 根据存储类自动预配存储。 在这种情况下,PVC 可以使用预先创建的存储类之一创建标准或高级 Azure 托管磁盘。
创建名为
azure-pvc.yaml的文件,并将其复制到以下清单中。 请求获取一个名为azure-managed-disk且大小为5 GB的磁盘,并具有ReadWriteOnce访问权限。 managed-csi 存储类指定为存储类。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: azure-managed-disk spec: accessModes: - ReadWriteOnce storageClassName: managed-csi resources: requests: storage: 5Gi小窍门
要创建使用高级存储的磁盘,请使用
storageClassName: managed-csi-premium而不是 managed-csi。使用
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的持久性卷声明,在路径/mnt/azure上挂载 Azure 磁盘。 对于 Windows Server 容器,请使用 Windows 路径约定指定mountPath,例如“D:”。kind: Pod apiVersion: v1 metadata: name: mypod spec: containers: - name: mypod image: mcr.azk8s.cn/oss/nginx/nginx:1.15.5-alpine resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi volumeMounts: - mountPath: "/mnt/azure" name: volume readOnly: false volumes: - name: volume persistentVolumeClaim: claimName: azure-managed-disk使用
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 定义自定义存储类的参数。
| 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 |
否 | "" |
| writeAcceleratorEnabled | [Azure 磁盘上的写入加速器][azure-disk-write-accelerator] |
true、false |
否 | "" |
| networkAccessPolicy | NetworkAccessPolicy 属性,用于防止生成磁盘或快照的 SAS URI |
AllowAll、DenyAll、AllowPrivate |
否 | AllowAll |
| diskAccessID | 用于在磁盘上使用专用终结点的 DiskAccess 资源的 Azure 资源 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 磁盘自定义存储类
默认存储类适用于最常见的方案。 在某些情况下,你可能想要使用自己的参数来自定义自己的存储类。 例如,你可能想要更改 volumeBindingMode 类。
可以使用一个 volumeBindingMode: Immediate 类,该类保证在创建持久性卷声明(PVC)后能立即使用。 当节点池受到拓扑约束时,例如使用可用区时,PV 会被绑定或提供,而无法知晓 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命令创建一个卷快照类:
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。
使用在上一步中创建的快照,来创建新的 PVC 和新的 Pod,以便进行使用:
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/snapshot/pvc-azuredisk-snapshot-restored.yaml kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/snapshot/nginx-pod-restored-snapshot.yaml命令的输出类似于以下示例:
persistentvolumeclaim/pvc-azuredisk-snapshot-restored created pod/nginx-restored created为了确保它与之前创建的 PVC 是相同的,请通过运行以下命令来检查内容。
kubectl exec nginx-restored -- ls /mnt/azuredisk命令的输出类似于以下示例:
lost+found outfile test.txt
我们仍然可以按预期看到我们之前创建的test.txt文件,
克隆卷
克隆的卷定义为现有 Kubernetes 卷的副本。 有关在 Kubernetes 中克隆卷的详细信息,请参阅 卷克隆。
创建以前创建的
azuredisk-pvc和新 Pod 以使用它。kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/cloning/pvc-azuredisk-cloning.yaml kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/cloning/nginx-pod-restored-cloning.yaml命令的输出类似于以下示例:
persistentvolumeclaim/pvc-azuredisk-cloning created pod/nginx-restored-cloning created可以通过运行以下命令来验证克隆的卷的内容,并查看文件
test.txt是否已创建:kubectl exec nginx-restored-cloning -- ls /mnt/azuredisk命令的输出类似于以下示例:
lost+found outfile test.txt
在不停机的情况下调整 Azure 磁盘 PV 的大小
可为 PVC 请求较大的卷。 编辑 PVC 对象,并指定较大的大小。 此项更改会触发为 PV 提供支持的基础卷的扩展。
注释
永远不会创建新的 PV 来满足声明, 而是会调整现有卷的大小。
在 AKS 中,内置 managed-csi 存储类已经支持扩展,因此请使用 以前创建的 扩展。 PVC 请求 10 GiB 永久性存储卷。 可以通过运行以下命令进行确认:
kubectl exec -it nginx-azuredisk -- df -h /mnt/azuredisk
命令的输出类似于以下示例:
Filesystem Size Used Avail Use% Mounted on
/dev/sdc 9.8G 42M 9.8G 1% /mnt/azuredisk
通过运行以下命令来扩展 PVC,并增加
spec.resources.requests.storage字段:kubectl patch pvc pvc-azuredisk --type merge --patch '{"spec": {"resources": {"requests": {"storage": "15Gi"}}}}'注释
目前不支持缩小 PV。 尝试修改尺寸比当前大小更小的现有 PVC 会出现以下错误消息:
The persistentVolumeClaim "pvc-azuredisk" is invalid: spec.resources.requests.storage: Forbidden: field can not be less than previous value.命令的输出类似于以下示例:
persistentvolumeclaim/pvc-azuredisk patched运行以下命令以确认存储卷大小增加:
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。 可以部署一个基于 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 存储类已禁用按需突发,并使用基于信用的突发。 基于默认 managed-csi-premium 存储类的持久卷声明动态创建的任何高级 SSD 也禁用了按需突发。
若要创建启用了 按需突发 的高级 SSD 永久性卷,可以通过以下 YAML 模板创建一个新的存储类,将 enableBursting 参数设置为 true。 有关启用按需突发的更多信息,请参阅 按需突发。 有关构建启用按需突发功能的自定义存储类的更多信息,请参阅 创建可突发的托管CSI高端存储类。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: burstable-managed-csi-premium
provisioner: disk.csi.azure.com
parameters:
skuname: Premium_LRS
enableBursting: "true"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
清理资源
完成本文中创建的资源后,可以使用 kubectl delete 命令将其删除。
# Remove the pod
kubectl delete -f azure-pvc-disk.yaml
# Remove the persistent volume claim
kubectl delete -f azure-pvc.yaml
预配 Azure 文件 PV
Azure 文件存储支持 Azure 高级文件共享。 最小文件共享容量为 100 GiB。 建议使用 Azure 高级文件共享而不是标准文件共享,因为高级文件共享为 I/O 密集型工作负荷提供更高的性能、低延迟磁盘支持。 使用 Azure 文件共享时,可以在一个节点上装载的共享数量没有限制。 有关 Kubernetes 存储卷的更多信息,请参阅 AKS 中应用程序的存储选项。
在 AKS 中使用存储 CSI 驱动程序时,还有两个内置 StorageClasses 使用 Azure 文件存储 CSI 存储驱动程序。 其他 CSI 存储类是使用群集连同树中默认的存储类一起创建的。
azurefile-csi:使用 Azure 标准存储创建 Azure 文件共享。azurefile-csi-premium:使用 Azure 高级存储创建 Azure 文件共享。
针对这两个存储类的回收策略可确保在删除相应的 PV 时删除基础 Azure 文件共享。 由于存储类还会将文件共享配置为可扩展,因此只需编辑具有新大小的 PVC 即可。
注释
若要获得 Azure 文件存储的最佳体验,请遵循这些最佳做法。 配置装载选项的位置(mountOptions)取决于您是为动态持久卷还是静态持久卷进行预配置。
- 如果要使用存储类动态预配卷,请在存储类对象(类型:
StorageClass) 上指定装载选项。 - 如果要静态预配卷,请在 PersistentVolume 对象上指定装载选项(类型:
PersistentVolume)。 - 如果要将文件共享装载为内联卷,请在 Pod 对象上指定装载选项(类型:
Pod) 。
建议在运行基准测试时使用 FIO。 有关详细信息,请参阅 基准测试工具和测试。
存储类用于定义如何创建 Azure 文件共享。 系统会在节点资源组中自动创建一个存储帐户,以便与存储类一起用来保存 Azure 文件共享。 为“skuName”选择以下 Azure 存储冗余 SKU 之一:
- Standard_LRS:标准本地冗余存储
- Standard_GRS:标准异地冗余存储
- Standard_RAGRS:标准只读访问地理冗余存储
- Standard_RAGZRS:标准读取访问地理区域冗余存储
- Premium_LRS:高级本地冗余存储
有关 Azure 文件的 Kubernetes 存储类的详细信息,请参阅 Kubernetes 存储类。
创建名为
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
PVC 使用存储类对象动态预配 Azure 文件共享。 可以使用以下 YAML 创建具有 ReadWriteMany 访问权限并且大小为 100 GB 的 PVC。 有关访问模式的详细信息,请参阅 Kubernetes 永久性卷。
创建名为
azure-file-pvc.yaml的文件,并将其复制到以下 YAML 中。 请确保storageClassName与前述步骤中创建的存储类匹配。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-azurefile spec: accessModes: - ReadWriteMany storageClassName: my-azurefile resources: requests: storage: 100Gi注释
如果将
Premium_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 文件共享。 对于 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现有一个正在运行的 Pod,其中的 Azure 文件共享已装载到 /mnt/azure 目录中。 使用
kubectl describe命令检查 Pod 时,可以看到此配置。 以下精简示例输出显示容器中装载的卷。Containers: mypod: Container ID: docker://053bc9c0df72232d755aa040bfba8b533fa696b123876108dec400e364d2523e Image: mcr.azk8s.cn/oss/nginx/nginx:1.15.5-alpine Image ID: docker-pullable://nginx@sha256:d85914d547a6c92faa39ce7058bd7529baacab7e0cd4255442b04577c4d1f424 State: Running Started: Fri, 01 Mar 2019 23:56:16 +0000 Ready: True Mounts: /mnt/azure from volume (rw) /var/run/secrets/kubernetes.io/serviceaccount from default-token-8rv4z (ro) [...] Volumes: volume: Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) ClaimName: my-azurefile ReadOnly: false [...]
装载选项
对于 Kubernetes 版本 1.13.0 及更高版本,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 存储帐户服务器地址。 | 现有服务器地址,例如 accountname.privatelink.file.core.chinacloudapi.cn。 |
否 | 如果为空,驱动程序使用默认的 accountname.file.core.chinacloudapi.cn 或其他主权云帐户地址。 |
| shareAccessTier | 文件共享的访问层 | 常规用途 v2 帐户可以在 TransactionOptimized(默认)、Hot 和 Cool 之间进行选择。 仅适用于文件共享的高级存储帐户类型。 |
否 | 空白。 对不同的存储帐户类型使用默认设置。 |
| 共享名称 | 指定 Azure 文件共享名称。 | 现有或新的 Azure 文件共享名称。 | 否 | 如果为空,驱动程序将生成一个 Azure 文件共享名称。 |
| shareNamePrefix | 指定由驱动程序创建的 Azure 文件共享名称前缀。 | 共享名只能包含小写字母、数字、连字符,长度应少于 21 个字符。 | 否 | |
| skuName | Azure 文件存储帐户类型(别名:storageAccountType) |
Standard_LRS、、Standard_GRSStandard_RAGRS、Standard_RAGZRS、Premium_LRS |
否 | Standard_LRS高级帐户类型的最小文件共享大小为 100 GB。 NFS 文件共享仅支持高级帐户类型。 标准 V2 SKU 名称适用于 预配的 Azure 文件存储 v2 模型。 |
| 存储帐户 | 指定 Azure 存储帐户名称。 | storageAccountName | - 否 | 如果未提供特定的存储帐户名称,驱动程序将查找与同一资源组中的帐户设置匹配的合适存储帐户。 如果找不到匹配的存储帐户,则会创建一个新帐户。 但是,如果指定了存储帐户名称,则存储帐户必须已经存在。 |
| storageEndpointSuffix | 指定 Azure 存储终结点后缀。 |
core.chinacloudapi.cn、core.chinacloudapi.cn 等 |
否 | 如果为空,驱动程序将根据云环境使用默认存储终结点后缀。 例如,core.chinacloudapi.cn。 |
| tags | 标记会在新的存储帐户中创建。 | 标记格式:“foo=aaa,bar=bbb” | 否 | "" |
1 如果存储帐户由驱动程序创建,则只需在存储类中指定 networkEndpointType: privateEndpoint 参数。 CSI 驱动程序将创建专用终结点和专用 DNS 区域(命名 privatelink.file.core.chinacloudapi.cn)以及帐户。 如果自带存储帐户,则需要为存储帐户 创建专用终结点 。 如果在网络隔离群集中使用 Azure 文件存储,则必须使用“networkEndpointType: privateEndpoint”创建自定义存储类。 可以按照此示例进行参考:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azurefile-csi
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
skuName: Premium_LRS # available values: Premium_LRS, Standard_LRS, Standard_GRS, Standard_RAGRS, Standard_RAGZRS
networkEndpointType: privateEndpoint
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
- dir_mode=0777 # modify this permission if you want to enhance the security
- file_mode=0777
- mfsymlinks
- cache=strict # https://linux.die.net/man/8/mount.cifs
- nosharesock # reduce probability of reconnect race
- actimeo=30 # reduce latency for metadata-heavy workload
- nobrl # disable sending byte range lock requests to the server and for applications which have challenges with posix locks
PVS 的静态预配参数
下表包含可用于定义 PV 的参数。
| Name | Meaning | 可用值 | 强制的 | 默认值 |
|---|---|---|---|---|
| volumeAttributes.resourceGroup | 指定 Azure 资源组名称。 | myResourceGroup | 否 | 如果为空,驱动程序将使用与当前群集相同的资源组名称。 |
| 卷属性.存储账户 | 指定现有的 Azure 存储帐户名称。 | storageAccountName | 是的 | |
| volumeAttributes.shareName | 指定 Azure 文件共享名称。 | fileShareName | 是的 | |
| volumeAttributes.folderName | 在 Azure 文件共享中指定文件夹名称。 | folderName | 否 | 如果文件共享中不存在文件夹名称,装载将失败。 |
| volumeAttributes.protocol | 指定文件共享协议。 |
smb、nfs |
否 | smb |
| volumeAttributes.server | 指定 Azure 存储帐户服务器地址 | 现有服务器地址,例如 accountname.privatelink.file.core.chinacloudapi.cn。 |
否 | 如果为空,驱动程序使用默认的 accountname.file.core.chinacloudapi.cn 或其他主权云帐户地址。 |
创建 PV 快照类
Azure 文件存储 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 文件 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 文件存储配合使用(专用终结点)
如果 Azure 文件存储资源受专用终结点保护,则必须创建自己的存储类。 请确保将 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命令创建存储类: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 文件现在支持使用托管身份认证进行 SMB 访问。 借助此功能,AKS 中运行的应用程序可以安全地访问 Azure 文件共享,而无需存储或管理存储帐户密钥或凭据。 托管标识提供简化且安全的身份验证机制,简化了访问管理并降低与凭据泄露相关的风险。 可以创建动态卷或静态卷。
注释
从 Linux 节点上的 AKS 版本 1.34 开始,在预览版中提供对 AKS 中的 Azure 文件的托管标识支持。
若要为动态预配的卷启用托管标识,请执行以下步骤:
使用 YAML 文件创建启用了托管标识的存储类,例如,
azurefile-csi-managed-identity.yaml包含以下示例内容。 设置mountWithManagedIdentity: "true"于parameters:apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: azurefile-csi provisioner: file.csi.azure.com parameters: resourceGroup: EXISTING_RESOURCE_GROUP_NAME # optional, node resource group by default if it's not provided storageAccount: EXISTING_STORAGE_ACCOUNT_NAME # optional, a new account will be created if it's not provided mountWithManagedIdentity: "true" # optional, clientID of the managed identity, kubelet identity would be used by default if it's not provided clientID: "xxxxx-xxxx-xxx-xxx-xxxxxxx" reclaimPolicy: Delete volumeBindingMode: Immediate allowVolumeExpansion: true mountOptions: - dir_mode=0777 # modify this permission if you want to enhance the security - file_mode=0777 - uid=0 - gid=0 - mfsymlinks - cache=strict # https://linux.die.net/man/8/mount.cifs - nosharesock # reduce probability of reconnect race - actimeo=30 # reduce latency for metadata-heavy workload - nobrl # disable sending byte range lock requests to the server通过运行以下命令应用此存储类:
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 文件 NFS
Azure 文件支持 NFS v4.1 协议。 对 Azure 文件的 NFS 版本 4.1 支持,提供一个完全托管的 NFS 系统,即基于一个高度可用、高度持久的分布式可复原存储平台构建的服务。
此选项已针对包含就地数据更新的随机访问工作负载进行优化,提供全面的 POSIX 文件系统支持。 本部分将介绍如何在 AKS 群集上通过 Azure 文件存储 CSI 驱动程序使用 NFS 共享。
注释
可以使用专用终结点,而不必允许访问所选 VNet。
本部分介绍如何在将 Azure 文件 NFS 4.1 与 AKS 配合使用时最大程度地提高性能和安全性。 学习如何做到:
优化 NFS 读取和写入大小设置
创建和配置 NFS 存储类
部署使用 NFS 支持的卷的工作负荷
启用传输中的加密(EiT),以便在 AKS 群集和 Azure 文件之间移动时保护数据。
本部分介绍如何使用 Azure 文件 CSI 驱动程序和 NFS 的 rsize (读取大小)及 wsize (写入大小)选项进行性能优化。
rsize和wsize选项设置NFS操作的最大传输大小。 如果rsize或wsize在装载时未指定,则客户端和服务器将协商两者所支持的最大大小。 目前,Azure 文件和新式 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,请在存储类中配置 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 文件存储 CSI 驱动程序还支持 Windows 节点和容器。 若要使用 Windows 容器,请遵循 Windows 容器快速入门教程添加 Windows 节点池。
添加 Windows 节点池后,使用内置的存储类(如
azurefile-csi)或创建自定义存储类。 可以通过运行 kubectl apply 命令部署data.txt示例,该示例将时间戳保存到文件 中:kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/deploy/example/windows/statefulset.yaml命令的输出类似于以下示例:
statefulset.apps/busybox-azurefile created通过运行以下 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 文件 CSI 驱动程序参数,请参阅 CSI 驱动程序参数。
- 有关存储最佳做法的详细信息,请参阅 Azure Kubernetes 服务中存储和备份的最佳做法。
- 有关 Azure 超级磁盘的详细信息,请参阅 [在 Azure Kubernetes 服务(AKS)上使用超级磁盘][use-ultra-disks]。
- 有关 Azure 标记的详细信息,请参阅 在 Azure Kubernetes 服务(AKS)中使用 Azure 标记。