Перейти к основному содержимому

Для чистого 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.
Не размещайте узлы AKS и файловую систему AMLFS в одной подсети, даже если вы используете общую VNet.

Шаг 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-4048 TiB40 MB/s на TiB
AMLFS-Durable-Premium-12516 TiB125 MB/s на TiB
AMLFS-Durable-Premium-2508 TiB250 MB/s на TiB
AMLFS-Durable-Premium-5004 TiB500 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-4040 MB/s на TiB
AMLFS-Durable-Premium-125125 MB/s на TiB (минимум 48 TiB)
AMLFS-Durable-Premium-250250 MB/s на TiB
AMLFS-Durable-Premium-500500 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"

См. также