将动态预配与 Azure Managed Lustre CSI 驱动程序配合使用

通过使用动态预配,Azure Lustre CSI 驱动程序会在创建持久卷声明(PVC)时自动创建 Azure Managed Lustre 文件系统。 此功能在 CSI 驱动程序版本 0.3.0 中可用。

Note

动态预配从 Azure Lustre CSI 驱动程序版本 0.3.0 开始提供。 有关详细信息,请参阅 v0.3.0 发行说明。

动态预配的先决条件

Permissions

Important

在动态创建文件系统之前,向 CSI 控制器使用的标识授予权限。 默认情况下,此标识是 kubelet 标识。 Helm 安装也可以使用 Microsoft Entra 工作负载标识。

控制器标识需要读取和加入现有子网、验证Azure Managed Lustre子网要求以及读取、创建、更新和删除文件系统的权限。 请参阅 v0.6.0 权限要求。

对于工作负荷标识,请完成 v0.6.0 工作负载标识设置的步骤 1 到 4,其中包括控制器 ServiceAccount 的 OIDC、标识权限和联合身份验证。 然后结合 --set IsWorkloadIdentityEnabled=Enabled 和 --set IdentityClientId=<managed-identity-client-id> 使用 Helm install 命令。

网络要求

  • Azure 托管 Lustre 群集的现有虚拟网络和子网
  • 群集子网中可用的足够 IP 地址
  • 合适的网络安全组规则以允许 Lustre 流量

有关网络体系结构规划,请参阅使用 Azure Managed Lustre 规划 AKS 的网络体系结构。

安装用于动态预配的驱动程序

为任一预配方法完成共享 群集准备 和 驱动程序安装 步骤一次。 如果已安装驱动程序,请按照 升级 CSI 驱动程序 而不是安装第二个副本进行操作。

在创建持久卷声明或装载卷之前完成 驱动程序准备情况检查。 在当前 kubectl 上下文选择的同一工作负荷命名空间中创建示例 PVC 和 Pod。

为动态预配创建存储类

根据storageclass_dynprov_lustre.yaml,使用以下配置创建一个名为的文件。 将 location 设置为要在其中创建文件系统的区域,然后选择该区域中可用的 SKU 和区域。 将资源组、虚拟网络和子网的值替换为所选资源。 省略可选参数以使用注释中显示的默认值。 该 resource-group-name 参数标识创建文件系统的位置,参数 vnet-resource-group 标识虚拟网络所在的位置。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: dynprov.azurelustre.csi.azure.com
provisioner: azurelustre.csi.azure.com
parameters:
  sku-name: "AMLFS-Durable-Premium-125"  # Choose appropriate SKU
  zone: "1"  # Specify zone if required for your SKU/location
  maintenance-day-of-week: "Sunday"
  maintenance-time-of-day-utc: "22:00"
  location: "chinanorth3"  # Optional: defaults to AKS cluster location
  resource-group-name: "my-resource-group"  # Optional: defaults to AKS infrastructure RG
  vnet-resource-group: "my-vnet-resource-group"  # Optional: defaults to AKS VNet resource group
  vnet-name: "my-vnet"  # Optional: defaults to AKS cluster VNET
  subnet-name: "my-subnet"  # Optional: defaults to AKS cluster subnet
reclaimPolicy: Delete  # Change to "Retain" to keep clusters after PVC deletion
volumeBindingMode: Immediate
mountOptions:
  - noatime
  - flock
---
# Optional: Limit this StorageClass to one PVC in the current namespace
apiVersion: v1
kind: ResourceQuota
metadata:
  name: pvc-lustre-dynprov-quota
spec:
  hard:
    dynprov.azurelustre.csi.azure.com.storageclass.storage.k8s.io/persistentvolumeclaims: "1"

此示例还创建一个配额,用于将使用 StorageClass 的声明限制为当前命名空间中的一个 PVC。 使用该示例:

kubectl apply -f storageclass_dynprov_lustre.yaml

为动态预配创建永久性卷声明

基于pvc_storageclass_dynprov.yaml,使用以下配置创建一个名为的文件。 调整工作负荷所请求的容量,以及所选 SKU 的 容量增量。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-lustre-dynprov
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: dynprov.azurelustre.csi.azure.com
  resources:
    requests:
      storage: 48Ti

将 PVC 应用到 AKS 集群:

kubectl apply -f pvc_storageclass_dynprov.yaml

监视文件系统创建

驱动程序可能需要 10 分钟或更多时间才能创建Azure Managed Lustre文件系统。 查看 PVC 状态:

kubectl get pvc pvc-lustre-dynprov --watch

当 Bound 显示 STATUS 时,按 Ctrl+C 并继续。

若要检查预配事件,请运行 kubectl describe pvc pvc-lustre-dynprov。

创建用于动态预配的 Pod

创建一个名为 pod_echo_date_dynprov.yaml 的文件,并将以下 YAML 内容复制进去。 此示例适用于安装了驱动程序的 Linux amd64 节点。 对于受支持的 ARM 节点,采用相同方法时请使用与 ARM 兼容的映像。

apiVersion: v1
kind: Pod
metadata:
  name: lustre-echo-date-dynprov
spec:
  containers:
  - image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
    name: lustre-echo-date-dynprov
    command:
      - "/bin/sh"
      - "-c"
      - "while true; do echo $(date) >> /mnt/lustre/outfile; sleep 1; done"
    volumeMounts:
    - name: lustre-storage
      mountPath: /mnt/lustre
  volumes:
  - name: lustre-storage
    persistentVolumeClaim:
      claimName: pvc-lustre-dynprov

将 Pod 应用到 AKS 群集:

kubectl apply -f pod_echo_date_dynprov.yaml

验证动态预配

等待示例 Pod 准备就绪,然后检查其装载:

kubectl wait --for=condition=Ready pod/lustre-echo-date-dynprov --timeout=10m &&
kubectl exec -it lustre-echo-date-dynprov -- df -h

您应该能看到 Azure 托管 Lustre 文件系统已装载在 /mnt/lustre。

通过读取 Pod 的输出文件,确认 Pod 正在写入文件系统。 新的时间戳应继续显示:

kubectl exec lustre-echo-date-dynprov -- tail -f /mnt/lustre/outfile

确认出现新时间戳后按 Ctrl+C。

清理动态资源

对于该示例的 reclaimPolicy: Delete,删除 PVC 也会删除 PV 和 Azure Managed Lustre 文件系统,包括其数据。 完成示例后,请删除其 Kubernetes 资源:

kubectl delete pod lustre-echo-date-dynprov
kubectl delete pvc pvc-lustre-dynprov
kubectl delete storageclass dynprov.azurelustre.csi.azure.com
kubectl delete resourcequota pvc-lustre-dynprov-quota --ignore-not-found

如果选择 Retain,则当不再需要时,PV 和文件系统将保留下来,以便之后手动清理。

Troubleshooting

若要排查 Azure Lustre CSI 驱动程序的问题,请参阅 GitHub 存储库中的 v0.6.0 CSI 驱动程序故障排除指南。

有关常见的驱动程序安装、节点调度和升级问题,请参阅 CSI 驱动程序故障排除。

动态预配的常见问题包括:

  • 身份验证或授权错误 - 验证已配置的控制器标识是否具有创建 Azure Managed Lustre 群集的权限。 对于工作负荷标识,还检查 OIDC、联合身份验证和控制器 ServiceAccount 配置。
  • SKU 和区域验证错误 - 检查文件系统配置中的可用区域、可用区和吞吐量选项,然后在 StorageClass 中更新location、sku-name和zone。
  • 网络 IP 地址可用性 - 确认目标子网中有足够的 IP 地址可用。
  • 配额限制 - 检查 Azure Managed Lustre 群集的 Kubernetes 资源配额和Azure订阅配额。
  • AKS 与 Azure Managed Lustre 之间的网络连接问题 - 验证虚拟网络对等互连或子网配置。

有关其他故障排除资源,请参阅: