Для чистого Markdown-содержимого этой страницы добавьте
.mdк этому URL. Для полного индекса документации см. https://docs.nvidia.com/dynamo/llms.txt. Для полного содержимого, включая справочник API и примеры SDK, см. https://docs.nvidia.com/dynamo/llms-full.txt.
Azure Lustre CSI-драйвер для AKS
Azure Lustre CSI-драйвер для AKS
В этом руководстве описаны установка и настройка Azure Lustre CSI-драйвера в кластере AKS, чтобы нагрузки Dynamo могли использовать файловые системы Azure Managed Lustre (AMLFS) для высокопроизводительного хранения моделей.
Предварительные требования
Требования к кластеру AKS
- Kubernetes 1.21 или новее
- Пулы узлов должны использовать OS SKU Ubuntu — узлы Windows и Azure Linux (CBL Mariner) не поддерживаются
- Поддерживается только дистрибутив Kubernetes AKS (самоуправляемые кластеры не поддерживаются)
Инструменты
- Azure CLI (
az) kubectl
Сетевое подключение
AKS и ваша файловая система AMLFS должны быть доступны по сети. Поддерживаются две схемы:
- VNet peering: Разверните AKS в собственной VNet и свяжите ее через peering с VNet AMLFS. Инфраструктурная VNet AKS находится в автоматически созданной группе ресурсов
MC_<aks-rg>_<aks-name>_<region>. - Общая VNet: Используйте функцию AKS "Bring your own VNet" и разверните AKS в выделенной подсети внутри VNet AMLFS. Не используйте ту же подсеть, что и AMLFS.
Шаг 1: Подключитесь к кластеру AKS
az login
az aks get-credentials \
--subscription <SUBSCRIPTION_ID> \
--resource-group <AKS_RESOURCE_GROUP> \
--name <AKS_CLUSTER_NAME>
kubectl config current-context
Шаг 2: Установите CSI-драйвер
Готового Helm chart нет. Установите драйвер с помощью предоставленного shell-скрипта:
# Install latest version
curl -skSL https://raw.githubusercontent.com/kubernetes-sigs/azurelustre-csi-driver/main/deploy/install-driver.sh | bash -s main
# Or install a specific version
curl -skSL https://raw.githubusercontent.com/kubernetes-sigs/azurelustre-csi-driver/main/deploy/install-driver.sh | bash -s v0.3.1
Скрипт разворачивает CSI controller (Deployment с 2 репликами) и node plugin (DaemonSet) в kube-system и ожидает, пока они станут готовы.
Проверьте установку:
# Pod'ы controller — ожидайте 2/2 или 3/3 Running
kubectl get -n kube-system pod -l app=csi-azurelustre-controller
# Pod'ы node plugin — ожидайте 3/3 Running на каждом узле
kubectl get -n kube-system pod -l app=csi-azurelustre-node -o wide
Шаг 3: Настройте хранилище
Есть два режима создания в зависимости от того, существует ли уже ваша файловая система AMLFS.
Вариант A: Статическое создание (существующая файловая система AMLFS)
Используйте этот вариант, если хотите подключить собственную файловую систему Azure Managed Lustre. Если ее еще нет, сначала создайте ее, а затем настройте CSI-драйвер на ее использование.
Создайте файловую систему Azure Managed Lustre
1. Зарегистрируйте провайдер ресурсов (только при первом использовании):
az provider register --namespace Microsoft.StorageCache
# Wait until state is "Registered"
az provider show --namespace Microsoft.StorageCache --query "registrationState"
2. Проверьте подсеть перед созданием файловой системы:
Подсеть должна быть выделена для AMLFS (не используйте ее совместно с узлами AKS или другими ресурсами) и иметь размер, достаточный для файловой системы. Сначала проверьте требования:
# Get the required subnet size for your planned SKU and capacity
az amlfs get-subnets-size \
--sku AMLFS-Durable-Premium-250 \
--storage-capacity 16
# Validate that your subnet meets the requirements
az amlfs check-amlfs-subnet \
--filesystem-subnet /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RG>/providers/Microsoft.Network/virtualNetworks/<VNET>/subnets/<SUBNET> \
--sku AMLFS-Durable-Premium-250 \
--location <REGION> \
--storage-capacity 16
3. Создайте выделенную подсеть для AMLFS:
AMLFS требует собственную подсеть — она не может использовать ту же подсеть, что и узлы AKS. Создайте новую подсеть в VNet AKS (или в связанной peering VNet):
# Get the node resource group and check for a custom VNet subnet
az aks show \
--name <AKS_CLUSTER_NAME> \
--resource-group <AKS_RESOURCE_GROUP> \
--query "{vnet: agentPoolProfiles[0].vnetSubnetId, nodeRG: nodeResourceGroup}"
Если vnet не null, ваш кластер использует Azure CNI с пользовательской VNet — используйте это имя VNet и группу ресурсов ниже.
Если vnet равен null, AKS управляет собственной VNet в группе ресурсов узлов. Найдите ее:
az network vnet list \
--resource-group <NODE_RESOURCE_GROUP> \
--query "[].{name:name, addressPrefixes:addressSpace.addressPrefixes}"
Выведите список существующих подсетей, чтобы найти свободный диапазон CIDR:
az network vnet subnet list \
--resource-group <VNET_RESOURCE_GROUP> \
--vnet-name <AKS_VNET_NAME> \
--query "[].{name:name, prefix:addressPrefix}"
Выберите не пересекающийся CIDR внутри адресного пространства VNet. Значение filesystemSubnetSize, возвращаемое get-subnets-size, показывает требуемое количество IP-адресов. Azure дополнительно резервирует 5 IP-адресов на подсеть, поэтому учитывайте их при выборе префикса (например, filesystemSubnetSize: 8 → нужно 13 IP-адресов → используйте /28 для 16 адресов и более).
Затем создайте выделенную подсеть AMLFS:
az network vnet subnet create \
--name amlfs-subnet \
--resource-group <VNET_RESOURCE_GROUP> \
--vnet-name <AKS_VNET_NAME> \
--address-prefix <CIDR>
Используйте полный идентификатор ресурса подсети на следующем шаге:
/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<VNET_RESOURCE_GROUP>/providers/Microsoft.Network/virtualNetworks/<AKS_VNET_NAME>/subnets/amlfs-subnet
4. Создайте файловую систему:
az amlfs create \
--name <AMLFS_NAME> \
--resource-group <RESOURCE_GROUP> \
--location <REGION> \
--sku AMLFS-Durable-Premium-250 \
--storage-capacity 16 \
--zones "[1]" \
--filesystem-subnet /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RG>/providers/Microsoft.Network/virtualNetworks/<VNET>/subnets/<SUBNET> \
--maintenance-window "{dayOfWeek:Sunday,timeOfDayUtc:'22:00'}"
Это занимает 10–20 минут. Используйте --no-wait, чтобы вернуться сразу, и опрашивайте состояние через az amlfs show.
Доступные SKU:
| SKU | Минимальный размер | Пропускная способность |
|---|---|---|
AMLFS-Durable-Premium-40 | 48 TiB | 40 MB/s на TiB |
AMLFS-Durable-Premium-125 | 16 TiB | 125 MB/s на TiB |
AMLFS-Durable-Premium-250 | 8 TiB | 250 MB/s на TiB |
AMLFS-Durable-Premium-500 | 4 TiB | 500 MB/s на TiB |
5. Получите IP-адрес MGS:
az amlfs show \
--name <AMLFS_NAME> \
--resource-group <RESOURCE_GROUP> \
--query "{mgsAddress: clientInfo.mgsAddress, mountCommand: clientInfo.mountCommand}"
Используйте значение mgsAddress в StorageClass ниже. Либо найдите его в портале Azure в разделе Client connection вашей файловой системы.
StorageClass:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azurelustre-static
provisioner: azurelustre.csi.azure.com
parameters:
mgs-ip-address: <MGS_IP_ADDRESS> # From portal > Client connection
reclaimPolicy: Retain
volumeBindingMode: Immediate
mountOptions:
- noatime
- flock
PersistentVolumeClaim:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-lustre
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: <AMLFS_STORAGE_CAPACITY> # Match your filesystem size, e.g. 16Ti
storageClassName: azurelustre-static
kubectl apply -f storageclass.yaml
kubectl apply -f pvc.yaml
Вариант B: Динамическое создание (автоматическое создание файловой системы AMLFS)
Требуется драйвер v0.3.0 или новее. Драйвер автоматически создает кластер AMLFS при создании PVC — это занимает 10+ минут.
Для managed identity kubelet требуются дополнительные IAM-разрешения (выдайте их до создания PVC):
Microsoft.StorageCache/amlFilesystems/read
Microsoft.StorageCache/amlFilesystems/write
Microsoft.StorageCache/amlFilesystems/delete
Microsoft.StorageCache/checkAmlFSSubnets/action
Microsoft.StorageCache/getRequiredAmlFSSubnetsSize/*
Microsoft.Network/virtualNetworks/subnets/read
Microsoft.Network/virtualNetworks/subnets/join/action
Microsoft.ManagedIdentity/userAssignedIdentities/assign/action
В качестве альтернативы можно назначить более широкие роли: Reader на уровне subscription, Contributor в целевой группе ресурсов и Network Contributor на уровне VNet.
Доступные SKU:
| SKU | Пропускная способность |
|---|---|
AMLFS-Durable-Premium-40 | 40 MB/s на TiB |
AMLFS-Durable-Premium-125 | 125 MB/s на TiB (минимум 48 TiB) |
AMLFS-Durable-Premium-250 | 250 MB/s на TiB |
AMLFS-Durable-Premium-500 | 500 MB/s на TiB |
StorageClass:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azurelustre-dynamic
provisioner: azurelustre.csi.azure.com
parameters:
sku-name: "AMLFS-Durable-Premium-125"
zone: "1" # Availability zone: "1", "2", or "3"
maintenance-day-of-week: "Sunday"
maintenance-time-of-day-utc: "22:00"
# Optional overrides (defaults to AKS cluster values):
# location: "eastus"
# resource-group-name: "my-rg"
# vnet-name: "my-vnet"
# subnet-name: "my-subnet"
reclaimPolicy: Delete # WARNING: deletes the AMLFS cluster when PVC is deleted — use Retain in production
volumeBindingMode: Immediate
mountOptions:
- noatime
- flock
PersistentVolumeClaim:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-lustre-dynamic
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 48Ti # Minimum for AMLFS-Durable-Premium-125
storageClassName: azurelustre-dynamic
kubectl apply -f storageclass-dynamic.yaml
kubectl apply -f pvc-dynamic.yaml
# Monitor provisioning (takes 10+ minutes)
kubectl describe pvc pvc-lustre-dynamic
Устранение неполадок
Pod застрял в ContainerCreating
kubectl describe pod <pod-name>
# Ищите ошибки монтирования тома в Events
kubectl logs -n kube-system -l app=csi-azurelustre-node -c azurelustre --tail=50
PVC застрял в Pending (динамическое provisioning)
kubectl describe pvc <pvc-name>
# Проверьте Events на ошибки авторизации — у identity kubelet может не хватать IAM-разрешений
Узел не может смонтировать — проверьте OS SKU Ubuntu:
kubectl get nodes -o custom-columns="NAME:.metadata.name,OS:.status.nodeInfo.osImage"