你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure 容器存储排除故障

Azure 容器存储是一项基于云的卷管理、部署和业务流程服务,专为容器原生构建。 使用本文排查 Azure 容器存储的常见问题,并查找问题的解决方法。

安装问题疑难解答

Azure 容器存储安装失败

运行 az aks create 后,可能会看到“Azure 容器存储安装失败。AKS 群集已创建。请运行 az aks update--enable-azure-container-storage 来启用 Azure 容器存储”消息。

此消息表示未安装 Azure 容器存储,但已正确创建你的 AKS 群集。

若要再群集上安装 Azure 容器存储和创建存储池,请运行以下命令。 将 <cluster-name><resource-group> 替换为自己的值。 将 <storage-pool-type> 替换为 azureDiskephemeraldiskelasticSan

az aks update -n <cluster-name> -g <resource-group> --enable-azure-container-storage <storage-pool-type>

无法将存储池类型设置为 NVMe

如果尝试使用临时磁盘安装 Azure 容器存储,特别是虚拟机 (VM) SKU 没有 NVMe 驱动器的群集上的本地 NVMe,你会收到以下错误消息:无法将 --storage-pool-option 设置为 NVMe,因为节点池均不支持临时 NVMe 磁盘。

若要修正,请使用具有 NVMe 驱动器的 VM SKU 创建节点池,然后重试。 请参阅存储优化 VM

排查存储池问题

若要检查存储池的状态,请运行 kubectl describe sp <storage-pool-name> -n acstor。 下面是可能会遇到的一些问题。

尝试扩展 Azure 磁盘存储池时出错

如果现有存储池小于 4 TiB (4,096 GiB),则最多只能将其扩展到 4,095 GiB。 如果尝试扩展到更大的容量,内部 PVC 将收到一条错误消息,内容类似于“对于大小超过 4095 GB 的磁盘,只支持磁盘缓存类型‘无’”或“大小为 4096 GB (<=4096 GB) 的磁盘‘xxx’在附加到正在运行的 VM 时无法将其大小调整为 16384 GB (>4096 GB)。 请停止 VM 或分离磁盘,然后重试该操作”。

为了避免错误,如果当前存储池最初小于 4 TiB (4,096 GiB),请不要尝试将其扩展到 4,095 GiB 以上。 容量大于 4 TiB 的存储池可以扩展到可用的最大存储容量。

此限制仅适用于使用 Premium_LRSStandard_LRSStandardSSD_LRSPremium_ZRSStandardSSD_ZRS 磁盘 SKU 时。

弹性 SAN 创建失败

如果尝试创建弹性 SAN 存储池,可能会看到“Azure 弹性 SAN 创建失败: 已创建的订阅的最大弹性 SAN 数”消息。 这意味着,你已达到每个订阅可在一个区域中部署的弹性 SAN 资源数限制。 可在此处查看限制:弹性 SAN 可伸缩性和性能目标。 请考虑删除不再使用的订阅上的所有现有弹性 SAN 资源,或者尝试在其他区域中创建存储池。

找不到块设备

如果看到此消息,则表示你可能尝试在 VM SKU 没有 NVMe 驱动器的群集上创建临时磁盘存储池。

若要修正,请使用具有 NVMe 驱动器的 VM SKU 创建节点池,然后重试。 请参阅存储优化 VM

已启用存储池类型

如果尝试启用已启用的存储池类型,将收到“--enable-azure-container-storage 值无效。已在群集中为存储池类型 <storage-pool-type> 启用 Azure 容器存储”消息。 可运行 kubectl get sp -n acstor 来检查现在是否已经创建了任何存储池。

禁用存储池类型

通过 az aks update --disable-azure-container-storage <storage-pool-type> 禁用存储池类型或通过 az aks update --disable-azure-container-storage all 卸载 Azure 容器存储时,如果现在有该类型的存储池,你会收到以下消息:

如果禁用存储池类型 <storage-pool-type> 的 Azure 容器存储,将强制删除同一类型的所有存储池,并对使用这些存储池的应用程序产生影响。 强制删除存储池还可能导致正在使用的存储资源泄漏。 是否要在禁用 Azure 容器存储之前验证是否使用了 <storage-pool-type> 类型的存储池? (是/否)

如果选择“是”,则运行自动验证来确保没有从存储池创建的永久性卷。 如果选择“否”,会绕过此验证并禁用存储池类型,从而删除任何现有存储池并可能影响应用程序。

无法删除包含 AKS 群集的资源组

如果创建了弹性 SAN 存储池,可能无法删除 AKS 群集所在的资源组。

为了解决此问题,请登录到 Azure 门户,然后选择“资源组”。 找到 AKS 创建的资源组(资源组名称以 MC_ 开头)。 选择该资源组中的 SAN 资源对象。 手动删除所有卷和卷组。 然后重试删除包含 AKS 群集的资源组。

排查卷的问题

由于临时卷大小超出可用容量,Pod 创建处于挂起状态

在单个节点上分配临时卷。 为 Pod 配置临时卷的大小时,大小应小于单个节点临时磁盘的可用容量。 否则,Pod 创建将处于挂起状态。

使用以下命令检查 Pod 创建是否处于挂起状态。

$ kubectl get pods
NAME     READY   STATUS    RESTARTS   AGE
fiopod   0/1     Pending   0          17s

在此示例中,pod fiopod 处于“Pending”状态。

使用以下命令检查 Pod 是否具有关于创建 persistentvolumeclaim 的警告事件。

$ kubectl describe pod fiopod
...
Events:
  Type     Reason            Age   From               Message
  ----     ------            ----  ----               -------
  Warning  FailedScheduling  40s   default-scheduler  0/3 nodes are available: waiting for ephemeral volume controller to create the persistentvolumeclaim "fiopod-ephemeralvolume". preemption: 0/3 nodes are available: 3 Preemption is not helpful for scheduling..

在此示例中,Pod 显示有关创建永久性卷声明 fiopod-ephemeralvolume 的警告事件。

使用以下命令检查永久性卷声明是否由于容量不足而无法预配。

$ kubectl describe pvc fiopod-ephemeralvolume
...
  Warning  ProvisioningFailed    107s (x13 over 20m)  containerstorage.csi.azure.com_aks-nodepool1-29463073-vmss000000_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  failed to provision volume with StorageClass "acstor-ephemeraldisk-temp": rpc error: code = Internal desc = Operation failed: GenericOperation("error in response: status code '507 Insufficient Storage', content: 'RestJsonError { details: \"Operation failed due to insufficient resources: Not enough suitable pools available, 0/1\", message: \"SvcError :: NotEnoughResources\", kind: ResourceExhausted }'")

在此示例中,Insufficient Storage 显示为卷配置失败的原因。

运行以下命令,检查单个节点临时磁盘的可用容量。

$ kubectl get diskpool -n acstor
NAME                                CAPACITY      AVAILABLE     USED        RESERVED    READY   AGE
ephemeraldisk-temp-diskpool-jaxwb   75660001280   75031990272   628011008   560902144   True    21h
ephemeraldisk-temp-diskpool-wzixx   75660001280   75031990272   628011008   560902144   True    21h
ephemeraldisk-temp-diskpool-xbtlj   75660001280   75031990272   628011008   560902144   True    21h

在此示例中,单个节点临时磁盘的可用容量为 75031990272 字节或 69 GiB。

将卷存储大小调整到可用容量以下,然后重新部署Pod。 请参阅使用通用临时卷部署 Pod

由于元数据存储脱机,卷无法附加

Azure 容器存储使用 etcd(一种分布式、可靠的键值存储)来存储和管理卷的元数据,以支持卷编排操作。 为了获得高可用性和复原能力,可在三个 Pod 中运行 etcd。 当运行的 etcd 实例少于两个时,Azure 容器存储将停止卷编排操作,但仍允许数据访问卷。 Azure 容器存储会自动检测 etcd 实例是否离线,并将其恢复。 但是,如果在重启 AKS 群集后发现卷编排错误,则可能是 etcd 实例未能自动恢复。 按照本节中的说明确定 etcd 实例的运行状况。

运行以下命令以获取 Pod 列表。

kubectl get pods

将显示类似于下面的输出。

NAME     READY   STATUS              RESTARTS   AGE 
fiopod   0/1     ContainerCreating   0          25m 

描述 Pod:

kubectl describe pod fiopod

通常情况下,如果元数据存储处于离线状态,则会看到卷故障消息。 在此示例中,fiopod 处于 ContainerCreating 状态,FailedAttachVolume 警告指示由于卷附加失败,创建正在等待中

Name:             fiopod 

Events: 

Type     Reason              Age                 From                     Message 

----     ------              ----                ----                     ------- 

Normal   Scheduled           25m                 default-scheduler        Successfully assigned default/fiopod to aks-nodepool1-xxxxxxxx-vmss000009

Warning  FailedAttachVolume  3m8s (x6 over 23m)  attachdetach-controller  AttachVolume.Attach failed for volume "pvc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" : timed out waiting for external-attacher of containerstorage.csi.azure.com CSI driver to attach volume xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

还可以运行以下命令来检查 etcd 实例的状态:

kubectl get pods -n acstor | grep "^etcd"

应会看到类似于以下内容的输出,其中所有实例都处于“正在运行”状态:

etcd-azurecontainerstorage-bn89qvzvzv                            1/1     Running   0               4d19h
etcd-azurecontainerstorage-phf92lmqml                            1/1     Running   0               4d19h
etcd-azurecontainerstorage-xznvwcgq4p                            1/1     Running   0               4d19h

如果“正在运行”状态下显示的实例少于两个,则可以断定卷由于元数据存储处于离线状态而无法附加,且自动恢复未成功。 如果是这种情况,请向 Azure 支持部门提交支持工单。

另请参阅