Краткое руководство. Создание кластера Azure Kubernetes Service (AKS) на основе GPU под управлением Linux с помощью Azure CLI

Azure Kubernetes Service (AKS) — это управляемая служба Kubernetes, которую можно использовать для быстрого развертывания кластеров и управления ими. Из этого краткого руководства вы узнаете, как:

  • Разверните кластер AKS с помощью Azure CLI.
  • Добавьте пул узлов GPU на основе Linux с включенными управляемыми узлами GPU.
  • Убедитесь, что AKS установил и настроил стек программного обеспечения GPU для планирования задач.

Полностью управляемые узлы GPU — это функция предварительной версии. Если вы включаете поддержку управляемых узлов с GPU, AKS устанавливает и управляет драйвером NVIDIA GPU, плагином устройств NVIDIA для Kubernetes, экспортером метрик Data Center GPU Manager (DCGM) и компонентами мониторинга состояния для пула узлов с GPU. Управляемые узлы GPU также поддерживают интеграцию метрик GPU в режиме реального времени для приема данных в Azure Managed Prometheus и в управляемую службу Azure Monitor для Prometheus. Дополнительные сведения см. в разделе "Создание полностью управляемого пула узлов GPU" на Azure Kubernetes Service (AKS) (предварительная версия) и наблюдаемость GPU в Azure Kubernetes Service (AKS).

Note

В этой статье приведены шаги по развертыванию кластера только для оценки. Прежде чем развертывать готовый к работе кластер, ознакомьтесь с базовой эталонной архитектурой , чтобы понять, как она соответствует вашим бизнес-требованиям.

Important

Предварительные версии функций AKS доступны на условиях самообслуживания и по выбору пользователя. Предварительные версии предоставляются "как есть" и "при наличии". На них не распространяются соглашения об уровне обслуживания и ограниченная гарантия. Предварительные версии AKS сопровождаются частичной поддержкой клиентов на основе принципа лучших усилий. Как таковые, эти функции не предназначены для использования в производстве. Для получения дополнительной информации ознакомьтесь со следующими статьями поддержки:

Перед тем как начать

В этом руководстве быстрого старта предполагается, что у вас есть базовое понимание концепций Kubernetes. Дополнительные сведения см. в статье Ключевые концепции Kubernetes для службы Azure Kubernetes (AKS).

  • Вам потребуется Azure CLI версии 2.85.0 или более поздней. Чтобы узнать версию, выполните команду az --version. Если вам нужно установить или обновить Azure CLI, см. статью "Установка Azure CLI".
  • Убедитесь, что учетная запись, которую вы используете для создания кластера, имеет необходимые минимальные разрешения. Дополнительные сведения о доступе и удостоверении для AKS см. в разделе «Параметры доступа и удостоверения для службы Azure Kubernetes (AKS)».
  • Если у вас несколько Azure подписок, выберите соответствующий идентификатор подписки для выставления счетов с помощью команды az account set. Дополнительные сведения см. в статье "Управление подписками Azure- Azure CLI".
  • В зависимости от подписки Azure может потребоваться запросить увеличение квоты виртуальной ЦП для семейства виртуальных машин с поддержкой GPU, используемого в этом кратком руководстве. Дополнительные сведения см. в разделе "Увеличение квот виртуальных ЦП для семейств виртуальных машин".
  • Типоразмеры виртуальных машин с поддержкой GPU включают специализированное оборудование, поэтому могут стоить дороже и быть доступны не во всех регионах. Дополнительные сведения см. в статье о оптимизированных размерах виртуальных машин с GPU.

aks-preview Установка расширения CLI

aks-preview Установите расширение CLI с помощью команды az extension add.

az extension add --name aks-preview

Обновите расширение, чтобы обеспечить последнюю версию с помощью команды az extension update .

az extension update --name aks-preview

Регистрация функции предварительной версии

ManagedGPUExperiencePreview Зарегистрируйте флаг компонента в подписке с помощью команды az feature register.

az feature register --namespace Microsoft.ContainerService --name ManagedGPUExperiencePreview

Через несколько минут отобразится состояние Registered (Зарегистрировано). Проверьте состояние регистрации с помощью команды az feature show .

az feature show --namespace Microsoft.ContainerService --name ManagedGPUExperiencePreview --query properties.state

Когда отображается состояние "Зарегистрировано", обновите регистрацию Microsoft.ContainerService поставщика ресурсов с помощью команды az provider register .

az provider register --namespace Microsoft.ContainerService

Определение переменных среды

Определите следующие переменные среды для использования в этом кратком руководстве.

export RANDOM_STRING=$(printf '%05d%05d' "$RANDOM" "$RANDOM")
export RESOURCE_GROUP="myAKSResourceGroup$RANDOM_STRING"
export CLUSTER_NAME="myAKSCluster$RANDOM_STRING"
export GPU_NP="gpunp"
export GPU_VM_SIZE="Standard_NC4as_T4_v3"
export LOCATION="westus"

Переменная RANDOM_STRING хранит случайную 10-разрядную строку. Переменные RESOURCE_GROUP и CLUSTER_NAME, значения которых объединяются с RANDOM_STRING, создают уникальные имена. Переменная GPU_NP сохраняет имя управляемого пула узлов GPU. Переменная GPU_VM_SIZE сохраняет размер виртуальной машины с поддержкой GPU для пула узлов. Переменная LOCATION имеет значение westus. Эти значения переменных можно использовать или создать самостоятельно. echo Используйте команду для просмотра значений переменных, таких какecho $RANDOM_STRING.

Создайте группу ресурсов

Группа ресурсов Azure — это логическая группа для развертывания ресурсов Azure и управления ими. При создании группы ресурсов укажите расположение. Это расположение, в котором хранятся метаданные группы ресурсов и в котором развертываются ваши ресурсы в Azure, если при создании ресурса не указан другой регион.

Используйте команду az group create для создания группы ресурсов.

az group create --name $RESOURCE_GROUP --location $LOCATION

В следующем примере показан результат.

{
  "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myAKSResourceGroup<randomStringValue>",
  "location": "westus",
  "managedBy": null,
  "name": "myAKSResourceGroup<randomStringValue>",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null,
  "type": "Microsoft.Resources/resourceGroups"
}

Создание кластера AKS

Используйте команду az aks create, чтобы создать кластер AKS. В следующем примере создается кластер с одним системным узлом и включается управляемое удостоверение, назначаемое системой.

az aks create \
  --resource-group $RESOURCE_GROUP \
  --name $CLUSTER_NAME \
  --node-count 1 \
  --generate-ssh-keys

При создании нового кластера AKS автоматически создает вторую группу ресурсов для хранения ресурсов AKS. Дополнительные сведения см. в разделе Почему с AKS создаются две группы ресурсов?

Кластер в этом примере указывает количество узлов, равное одному, для экономии времени и ресурсов. В производственной среде используйте конфигурацию из трех или более узлов. Команда az aks create по умолчанию имеет три узла, если не указать количество узлов.

Добавление управляемого пула узлов GPU

Добавьте в кластер управляемый пул узлов GPU на основе Linux с помощью команды az aks nodepool add . Параметр --enable-managed-gpu=true настраивает AKS на установку и управление драйвером GPU NVIDIA, плагином устройств NVIDIA Kubernetes, экспортёром метрик DCGM и компонентами мониторинга состояния GPU в пуле узлов.

В следующем примере добавляется управляемый пул узлов GPU с помощью операционной системы Ubuntu Linux по умолчанию.

az aks nodepool add \
  --resource-group $RESOURCE_GROUP \
  --cluster-name $CLUSTER_NAME \
  --name $GPU_NP \
  --node-count 1 \
  --node-vm-size $GPU_VM_SIZE \
  --node-taints sku=gpu:NoSchedule \
  --enable-managed-gpu=true

Параметр --node-taints sku=gpu:NoSchedule не допускает нагрузки, не использующие GPU, в пул GPU-узлов, если только эти нагрузки не включают соответствующий допуск.

После создания пула узлов используйте команду az aks nodepool show , чтобы убедиться, что управляемый профиль GPU включен.

az aks nodepool show \
  --resource-group $RESOURCE_GROUP \
  --cluster-name $CLUSTER_NAME \
  --name $GPU_NP \
  --query "{Name:name, Mode:mode, VmSize:vmSize, Taints:nodeTaints, GpuProfile:gpuProfile}"

Выходные данные должны содержать следующие значения.

{
  "GpuProfile": {
    "driver": "Install",
    "driverType": "",
    "nvidia": {
      "managementMode": "Managed",
      "migStrategy": null
    }
  },
  "Mode": "User",
  "Name": "gpunp",
  "Taints": [
    "sku=gpu:NoSchedule"
  ],
  "VmSize": "Standard_NC4as_T4_v3"
}

Подключение к кластеру

Кластером Kubernetes можно управлять при помощи kubectl клиента командной строки Kubernetes. Если вы используете Azure Cloud Shell, kubectl уже установлен. Чтобы установить kubectl локально, используйте команду az aks install-cli .

  1. Настройте kubectl для подключения к кластеру Kubernetes с помощью команды az aks get-credentials. Эта команда скачивает учетные данные и настраивает интерфейс командной строки Kubernetes для их использования.

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
    
  2. Проверьте подключение к кластеру с помощью команды get kubectl . Эта команда возвращает список узлов кластера и отображает пул узлов для каждого узла.

    kubectl get nodes -L kubernetes.azure.com/agentpool,kubernetes.azure.com/mode
    
    NAME                                STATUS   ROLES    AGE     VERSION   AGENTPOOL   MODE
    aks-nodepool1-123456789-vmss000000  Ready    <none>   20m     v1.34.4   nodepool1   system
    aks-gpunp-123456789-vmss000000      Ready    <none>   5m36s   v1.34.4   gpunp       user
    
  3. Убедитесь, что Kubernetes может планировать рабочие нагрузки GPU в пуле управляемых узлов GPU.

    kubectl get nodes -l kubernetes.azure.com/agentpool=$GPU_NP -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.allocatable.nvidia\.com/gpu}{"\n"}{end}'
    

    В выходных данных показано количество GPU, доступных для выделения, для каждого узла в управляемом пуле GPU-узлов.

    aks-gpunp-123456789-vmss000000  1
    

Включение сбора метрик GPU

Пулы управляемых узлов GPU включают экспортер метрик DCGM. Чтобы Azure Managed Prometheus мог принимать метрики GPU, сначала включите управляемую службу Azure Monitor для Prometheus в вашем кластере AKS. Затем создайте ConfigMap, который включает dcgmexporter профиль очистки в агенте Azure Monitor.

cat <<EOF | kubectl create -f -
kind: ConfigMap
apiVersion: v1
data:
  schema-version:
    v1
  config-version:
    ver1
  default-scrape-settings-enabled: |-
    dcgmexporter = true
metadata:
  name: ama-metrics-settings-configmap
  namespace: kube-system
EOF

После применения этого ConfigMap все существующие и новые пулы узлов GPU NVIDIA в кластере автоматически удаляются. Чтобы просмотреть метрики GPU в Управление Azure для Grafana, см. сведения о наблюдаемости GPU в Azure Kubernetes Service (AKS).

Развертывание приложения

Разверните рабочую нагрузку GPU, чтобы убедиться, что управляемый пул узлов GPU может запускать реальные приложения. В этом примере выполняется Ollama, которая обслуживает небольшую языковую модель с открытым исходным кодом (Llama 3.2 1B) с помощью API, совместимого с OpenAI. Ollama построена на основе llama.cpp, которая поддерживает графический процессор NVIDIA T4 в пуле узлов Standard_NC4as_T4_v3, используемом в этом кратком руководстве.

Следующий манифест создает Deployment и Service. Deployment запрашивает один GPU (nvidia.com/gpu: 1), включает допуск для sku=gpu:NoSchedule taint и использует селектор узлов для выбора управляемого пула GPU-узлов. Когда контейнер запускается, он запускает сервер Ollama и загружает модель llama3.2:1b, чтобы под был готов обрабатывать запросы.

Разверните приложение с помощью следующей команды.

cat <<'EOF' | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ollama
  labels:
    app: ollama
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ollama
  template:
    metadata:
      labels:
        app: ollama
    spec:
      # Schedule onto the managed GPU node pool created in this quickstart.
      nodeSelector:
        kubernetes.azure.com/agentpool: gpunp
      # Tolerate the GPU node pool taint (sku=gpu:NoSchedule).
      tolerations:
        - key: "sku"
          operator: "Equal"
          value: "gpu"
          effect: "NoSchedule"
      containers:
        - name: ollama
          image: ollama/ollama:0.30.10
          ports:
            - name: http
              containerPort: 11434
          env:
            # Listen on all interfaces so the Service and kubelet probes can reach it.
            - name: OLLAMA_HOST
              value: "0.0.0.0:11434"
            # Model to pull and serve on startup. Fits comfortably on a 16-GB T4.
            - name: MODEL
              value: "llama3.2:1b"
          # Start the server, wait until it's ready, and then pull the model so the
          # pod is self-contained (no manual "ollama pull" step required).
          command: ["/bin/sh", "-c"]
          args:
            - |
              ollama serve &
              pid=$!
              echo "Waiting for the Ollama server to be ready..."
              until ollama list >/dev/null 2>&1; do sleep 2; done
              echo "Server ready. Pulling model: $MODEL"
              ollama pull "$MODEL" || echo "WARN: pull failed; run 'kubectl exec deploy/ollama -- ollama pull $MODEL' manually"
              echo "Model $MODEL is ready to serve."
              wait $pid
          resources:
            requests:
              cpu: "1"
              memory: 4Gi
            limits:
              cpu: "4"
              memory: 16Gi
              nvidia.com/gpu: 1
          startupProbe:
            httpGet:
              path: /api/tags
              port: http
            periodSeconds: 5
            failureThreshold: 60
          readinessProbe:
            httpGet:
              path: /api/tags
              port: http
            periodSeconds: 10
          livenessProbe:
            httpGet:
              path: /
              port: http
            periodSeconds: 20
          volumeMounts:
            - name: ollama-data
              mountPath: /root/.ollama
      volumes:
        - name: ollama-data
          emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: ollama
  labels:
    app: ollama
spec:
  type: ClusterIP
  selector:
    app: ollama
  ports:
    - name: http
      port: 11434
      targetPort: http
EOF

Note

Этот манифест предназначен для пула gpunp узлов. Если для переменной GPU_NP использовалось другое значение, обновите kubernetes.azure.com/agentpool значение селектора узлов, чтобы оно соответствовало, прежде чем применить манифест.

Убедитесь, что развертывание завершено, с помощью команды kubectl rollout status. Начальная загрузка модели может занять несколько минут.

kubectl rollout status deployment/ollama --timeout=600s

Убедитесь, что модуль pod запущен в пуле управляемых узлов GPU с помощью команды get kubectl .

kubectl get pods -l app=ollama -o wide

Выходные данные должны отображать модуль pod, работающий на узле в пуле gpunp узлов.

NAME                      READY   STATUS    RESTARTS   AGE   IP            NODE                            NOMINATED NODE   READINESS GATES
ollama-5b8f6c9d4f-2xq7p   1/1     Running   0          5m    10.244.1.10   aks-gpunp-12345678-vmss000000   <none>           <none>

Тестирование приложения

Перенаправите локальный порт в Service порт с помощью команды kubectl port-forward . Сохраните эту команду и откройте второй терминал для оставшихся шагов.

kubectl port-forward svc/ollama 11434:11434

Во втором терминале отправьте запрос модели с помощью конечной точки завершения чата, совместимого с OpenAI.

curl http://localhost:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama3.2:1b",
    "messages": [{"role": "user", "content": "In one sentence, what is Azure Kubernetes Service?"}]
  }'

Модель возвращает ответ в формате JSON, который содержит сгенерированный ответ и подтверждает, что рабочая нагрузка выполняет инференс с использованием управляемого пула GPU-узлов.

Убедитесь, что модель загружается на GPU с помощью ollama ps команды. Столбец PROCESSOR отображает 100% GPU, когда модель запускается на T4.

kubectl exec deploy/ollama -- ollama ps
NAME          ID              SIZE      PROCESSOR    CONTEXT   UNTIL
llama3.2:1b   baf6a787fdff    1.5 GB    100% GPU     4096      4 minutes from now

Вы также можете просмотреть GPU непосредственно из модуля pod с помощью nvidia-smi команды.

kubectl exec deploy/ollama -- nvidia-smi

После завершения тестирования остановите процесс kubectl port-forward, нажав Ctrl+C в его терминале. Приложение удаляется при удалении кластера на следующем шаге.

Удаление кластера

Если вы не планируете выполнять учебник AKS, очистите ненужные ресурсы, чтобы избежать расходов на выставление счетов Azure. Вы можете удалить группу ресурсов, службу контейнеров и все связанные ресурсы с помощью команды az group delete .

az group delete --name $RESOURCE_GROUP --no-wait --yes

Вы создали кластер AKS с управляемой идентификацией, назначаемой системой, которая используется в этом кратком руководстве по умолчанию. Платформа управляет этим удостоверением, так что вам не нужно удалять его вручную.

Дальнейшие действия

В этом кратком руководстве вы развернули кластер Kubernetes, а затем добавили управляемый пул узлов GPU на основе Linux. Дополнительные сведения об управляемых узлах GPU и метриках GPU см. в следующих статьях:

Дополнительные сведения об AKS и полный пример развертывания см. в руководстве по кластеру Kubernetes.