使用BlobFuse将ZRS Azure存储账户作为AKS PVC时的可用性问题排查
用户问题
我已手动创建了一个采用ZRS的Blob存储账户,随后在AKS中创建了PV和PVC,通过BlobFuse关联该存储账户。但目前AKS集群出现了如下错误:
请问此处是否存在可用性问题?即挂载该PVC的Pod是否被隔离至单个可用区?若是,合适的补救措施是什么?
现有PV清单
apiVersion: v1 kind: PersistentVolume metadata: annotations: pv.kubernetes.io/bound-by-controller: "yes" finalizers: - kubernetes.io/pv-protection name: XXXX spec: accessModes: - ReadWriteMany capacity: storage: 1Gi claimRef: apiVersion: v1 kind: PersistentVolumeClaim name: XXXX namespace: XXXX csi: driver: blob.csi.azure.com nodeStageSecretRef: name: XXXX namespace: XXXX volumeAttributes: containerName: XXXX protocol: fuse resourceGroup: XXXX storageAccount: XXXX volumeHandle: XXXX mountOptions: - --file-cache-timeout-in-seconds=120 - -o allow_other - --use-adls=true persistentVolumeReclaimPolicy: Retain storageClassName: azureblob-fuse-premium volumeMode: Filesystem
现有PVC清单
apiVersion: v1 kind: PersistentVolumeClaim metadata: annotations: pv.kubernetes.io/bind-completed: "yes" finalizers: - kubernetes.io/pvc-protection name: XXXX namespace: XX spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi storageClassName: azureblob-fuse-premium volumeMode: Filesystem volumeName: XXXX status: accessModes: - ReadWriteMany capacity: storage: 1Gi phase: Bound
问题分析与解决方案
问题结论
是的,存在可用性限制:挂载该PVC的Pod会被强制隔离到单个可用区,无法跨区调度。错误提示Topology mismatch: the volume's topology does not match the pod's topology表明,手动创建的PV未配置ZRS存储的多可用区拓扑信息,导致CSI驱动将PV绑定到了存储账户的初始可用区,限制了Pod的调度范围。
补救措施
重新配置PV的拓扑属性:删除现有PV(需先解绑PVC),在PV的
spec.csi.volumeAttributes中添加storageAccountZone字段,指定ZRS存储覆盖的所有可用区(例如eastus-1,eastus-2,eastus-3,需匹配你的存储账户实际可用区)。修改后的关键片段如下:csi: volumeAttributes: # 原有属性保留 storageAccountZone: "eastus-1,eastus-2,eastus-3" # 替换为实际可用区列表改用动态PV创建:推荐使用动态存储类自动生成PV,Azure Blob CSI驱动会自动识别ZRS存储的多可用区属性,无需手动配置拓扑,从根源避免此类问题。确保存储类
azureblob-fuse-premium关联的是ZRS存储账户。验证修复效果:修复后,通过
kubectl describe pod <pod-name>确认Pod可调度到不同可用区节点;通过kubectl describe pv <pv-name>检查PV的拓扑字段,确认包含多个可用区信息。
内容的提问来源于stack exchange,提问作者ASH

